/home/lnzliplg/www/share.zip
PK�"�\��$$licenses/alt-libaom/LICENSEnu�[���Copyright (c) 2016, Alliance for Open Media. 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.

PK�"�\[8�FFlicenses/alt-libaom/PATENTSnu�[���Alliance for Open Media Patent License 1.0

1. License Terms.

1.1. Patent License. Subject to the terms and conditions of this License, each
     Licensor, on behalf of itself and successors in interest and assigns,
     grants Licensee a non-sublicensable, perpetual, worldwide, non-exclusive,
     no-charge, royalty-free, irrevocable (except as expressly stated in this
     License) patent license to its Necessary Claims to make, use, sell, offer
     for sale, import or distribute any Implementation.

1.2. Conditions.

1.2.1. Availability. As a condition to the grant of rights to Licensee to make,
       sell, offer for sale, import or distribute an Implementation under
       Section 1.1, Licensee must make its Necessary Claims available under
       this License, and must reproduce this License with any Implementation
       as follows:

       a. For distribution in source code, by including this License in the
          root directory of the source code with its Implementation.

       b. For distribution in any other form (including binary, object form,
          and/or hardware description code (e.g., HDL, RTL, Gate Level Netlist,
          GDSII, etc.)), by including this License in the documentation, legal
          notices, and/or other written materials provided with the
          Implementation.

1.2.2. Additional Conditions. This license is directly from Licensor to
       Licensee.  Licensee acknowledges as a condition of benefiting from it
       that no rights from Licensor are received from suppliers, distributors,
       or otherwise in connection with this License.

1.3. Defensive Termination. If any Licensee, its Affiliates, or its agents
     initiates patent litigation or files, maintains, or voluntarily
     participates in a lawsuit against another entity or any person asserting
     that any Implementation infringes Necessary Claims, any patent licenses
     granted under this License directly to the Licensee are immediately
     terminated as of the date of the initiation of action unless 1) that suit
     was in response to a corresponding suit regarding an Implementation first
     brought against an initiating entity, or 2) that suit was brought to
     enforce the terms of this License (including intervention in a third-party
     action by a Licensee).

1.4. Disclaimers. The Reference Implementation and Specification are provided
     "AS IS" and without warranty. The entire risk as to implementing or
     otherwise using the Reference Implementation or Specification is assumed
     by the implementer and user. Licensor expressly disclaims any warranties
     (express, implied, or otherwise), including implied warranties of
     merchantability, non-infringement, fitness for a particular purpose, or
     title, related to the material. IN NO EVENT WILL LICENSOR BE LIABLE TO
     ANY OTHER PARTY FOR LOST PROFITS OR ANY FORM OF INDIRECT, SPECIAL,
     INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER FROM ANY CAUSES OF
     ACTION OF ANY KIND WITH RESPECT TO THIS LICENSE, WHETHER BASED ON BREACH
     OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, AND WHETHER OR
     NOT THE OTHER PARTRY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

2. Definitions.

2.1. Affiliate.  "Affiliate" means an entity that directly or indirectly
     Controls, is Controlled by, or is under common Control of that party.

2.2. Control. "Control" means direct or indirect control of more than 50% of
     the voting power to elect directors of that corporation, or for any other
     entity, the power to direct management of such entity.

2.3. Decoder.  "Decoder" means any decoder that conforms fully with all
     non-optional portions of the Specification.

2.4. Encoder.  "Encoder" means any encoder that produces a bitstream that can
     be decoded by a Decoder only to the extent it produces such a bitstream.

2.5. Final Deliverable.  "Final Deliverable" means the final version of a
     deliverable approved by the Alliance for Open Media as a Final
     Deliverable.

2.6. Implementation.  "Implementation" means any implementation, including the
     Reference Implementation, that is an Encoder and/or a Decoder. An
     Implementation also includes components of an Implementation only to the
     extent they are used as part of an Implementation.

2.7. License. "License" means this license.

2.8. Licensee. "Licensee" means any person or entity who exercises patent
     rights granted under this License.

2.9. Licensor.  "Licensor" means (i) any Licensee that makes, sells, offers
     for sale, imports or distributes any Implementation, or (ii) a person
     or entity that has a licensing obligation to the Implementation as a
     result of its membership and/or participation in the Alliance for Open
     Media working group that developed the Specification.

2.10. Necessary Claims.  "Necessary Claims" means all claims of patents or
      patent applications, (a) that currently or at any time in the future,
      are owned or controlled by the Licensor, and (b) (i) would be an
      Essential Claim as defined by the W3C Policy as of February 5, 2004
      (https://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential)
      as if the Specification was a W3C Recommendation; or (ii) are infringed
      by the Reference Implementation.

2.11. Reference Implementation. "Reference Implementation" means an Encoder
      and/or Decoder released by the Alliance for Open Media as a Final
      Deliverable.

2.12. Specification. "Specification" means the specification designated by
      the Alliance for Open Media as a Final Deliverable for which this
      License was issued.

PK�(�\C.��H�Hman/man1/python3.7.1nu�[���.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

    -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 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, 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.
.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.
PK�(�\��kk!doc/alt-python37-idna/LICENSE.rstnu�[���License
-------

Copyright (c) 2013-2017, Kim Davies. 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 copyright holder nor the names of the 
   contributors may be used to endorse or promote products derived 
   from this software without specific prior written permission.

#. THIS SOFTWARE IS PROVIDED BY THE 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 HOLDERS 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.

Portions of the codec implementation and unit tests are derived from the
Python standard library, which carries the `Python Software Foundation
License <https://docs.python.org/2/license.html>`_:

   Copyright (c) 2001-2014 Python Software Foundation; All Rights Reserved

Portions of the unit tests are derived from the Unicode standard, which 
is subject to the Unicode, Inc. License Agreement:

   Copyright (c) 1991-2014 Unicode, Inc. All rights reserved.
   Distributed under the Terms of Use in 
   <http://www.unicode.org/copyright.html>.

   Permission is hereby granted, free of charge, to any person obtaining
   a copy of the Unicode data files and any associated documentation
   (the "Data Files") or Unicode software and any associated documentation
   (the "Software") to deal in the Data Files or Software
   without restriction, including without limitation the rights to use,
   copy, modify, merge, publish, distribute, and/or sell copies of
   the Data Files or Software, and to permit persons to whom the Data Files
   or Software are furnished to do so, provided that
   
   (a) this copyright and permission notice appear with all copies 
   of the Data Files or Software,

   (b) this copyright and permission notice appear in associated 
   documentation, and

   (c) there is clear notice in each modified Data File or in the Software
   as well as in the documentation associated with the Data File(s) or
   Software that the data or software has been modified.

   THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS.
   IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
   NOTICE BE LIABLE FOR ANY CLAIM, OR 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 THE DATA FILES OR SOFTWARE.

   Except as contained in this notice, the name of a copyright holder
   shall not be used in advertising or otherwise to promote the sale,
   use or other dealings in these Data Files or Software without prior
   written authorization of the copyright holder.
PK�(�\���t��!doc/alt-python37-idna/HISTORY.rstnu�[���.. :changelog:

History
-------

2.5 (2017-03-07)
++++++++++++++++

- Fix bug with Katakana middle dot context-rule (Thanks, Greg
  Shikhman.)

2.4 (2017-03-01)
++++++++++++++++

- Restore IDNAError to be a subclass of UnicodeError, as some users of
  this library are only looking for the latter to catch invalid strings.

2.3 (2017-02-28)
++++++++++++++++

- Fix bugs relating to deriving IDNAError from UnicodeError.
- More memory footprint improvements (Thanks, Alex Gaynor)

2.2 (2016-12-21)
++++++++++++++++

- Made some changes to the UTS 46 data that should allow Jython to get around
  64kb Java class limits. (Thanks, John A. Booth and Marcin Płonka.)
- In Python 2.6, skip two tests that rely on data not present in that
  Python version's unicodedata module.
- Use relative imports to help downstream users.

2.1 (2016-03-20)
++++++++++++++++

- Memory consumption optimizations. The library should consume significantly
  less memory through smarter data structures being used to represent
  relevant Unicode properties. Many thanks to Shivaram Lingamneni for this
  patch.
- Patches to make library work better with Python 2.6. The core library
  currently works however the unit testing does not. (Thanks, Robert
  Buchholz)
- Better affix all Unicode codepoint properties to a specific version.

2.0 (2015-05-18)
++++++++++++++++

- Added support for Unicode IDNA Compatibility Processing (aka Unicode
  Technical Standard #46). Big thanks to Jon Ribbens who contributed this
  functionality.

1.1 (2015-01-27)
++++++++++++++++

- Use IDNA properties from Unicode 6.3.0. Internet Architecture Board (IAB)
  issued statement recommending against the use of Unicode 7.0.0 until
  issues relating to U+08A1 codepoint are resolved. See http://goo.gl/Ed1n0K
- Identify some cases when label would be too longer to be a legal DNS name
  and raise an exception. (Thanks, Ed Lewis)

1.0 (2014-10-12)
++++++++++++++++

- Update IDNA properties for Unicode 7.0.0.

0.9 (2014-07-18)
++++++++++++++++

- Fix issue with non-UTF-8 environments reading the README file
  now that it contains non-ASCII. (Thanks, Tom Prince)
- Codec functions are useful, so they are separated into their own
  module, rather than just existing for compatibility reasons.
- Add LICENSE file.

0.8 (2014-07-09)
++++++++++++++++

- Added MANIFEST.in for correct source distribution compilation.

0.7 (2014-07-09)
++++++++++++++++

- Filled out missing tests for various functions.
- Fix bug in CONTEXTO validation for Greek lower numeral sign (U+0375)
- Fix bug in CONTEXTO validation for Japanese middle dot (U+30FB)
- Improved documentation
- Move designation to Stable

0.6 (2014-04-29)
++++++++++++++++

- Minor improvements to Python 3 support, tests (Thanks, Derek Wilson)

0.5 (2014-02-05)
++++++++++++++++

- Update IDNA properties for Unicode 6.3.0.

0.4 (2014-01-07)
++++++++++++++++

- Fix trove classifier for Python 3. (Thanks, Hynek Schlawack)

0.3 (2013-07-18)
++++++++++++++++

- Ported to Python 3.

0.2 (2013-07-16)
++++++++++++++++

- Improve packaging.
- More conformant, passes all relevant tests in the Unicode TR46 test suite.

0.1 (2013-05-27)
++++++++++++++++

- First proof-of-concept version.
PK�(�\��F��� doc/alt-python37-idna/README.rstnu�[���Internationalized Domain Names in Applications (IDNA)
=====================================================

Support for the Internationalised Domain Names in Applications
(IDNA) protocol as specified in `RFC 5891 <http://tools.ietf.org/html/rfc5891>`_.
This is the latest version of the protocol and is sometimes referred to as
“IDNA 2008”.

This library also provides support for Unicode Technical Standard 46,
`Unicode IDNA Compatibility Processing <http://unicode.org/reports/tr46/>`_.

This acts as a suitable replacement for the “encodings.idna” module that
comes with the Python standard library, but only supports the
old, deprecated IDNA specification (`RFC 3490 <http://tools.ietf.org/html/rfc3490>`_).

Basic functions are simply executed:

.. code-block:: pycon

    # Python 3
    >>> import idna
    >>> idna.encode('ドメイン.テスト')
    b'xn--eckwd4c7c.xn--zckzah'
    >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
    ドメイン.テスト

    # Python 2
    >>> import idna
    >>> idna.encode(u'ドメイン.テスト')
    'xn--eckwd4c7c.xn--zckzah'
    >>> print idna.decode('xn--eckwd4c7c.xn--zckzah')
    ドメイン.テスト

Packages
--------

The latest tagged release version is published in the PyPI repository:

.. image:: https://badge.fury.io/py/idna.svg
   :target: http://badge.fury.io/py/idna


Installation
------------

To install this library, you can use pip:

.. code-block:: bash

    $ pip install idna

Alternatively, you can install the package using the bundled setup script:

.. code-block:: bash

    $ python setup.py install

This library works with Python 2.6 or later, and Python 3.3 or later.


Usage
-----

For typical usage, the ``encode`` and ``decode`` functions will take a domain
name argument and perform a conversion to A-labels or U-labels respectively.

.. code-block:: pycon

    # Python 3
    >>> import idna
    >>> idna.encode('ドメイン.テスト')
    b'xn--eckwd4c7c.xn--zckzah'
    >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
    ドメイン.テスト

You may use the codec encoding and decoding methods using the
``idna.codec`` module:

.. code-block:: pycon

    # Python 2
    >>> import idna.codec
    >>> print u'домена.испытание'.encode('idna')
    xn--80ahd1agd.xn--80akhbyknj4f
    >>> print 'xn--80ahd1agd.xn--80akhbyknj4f'.decode('idna')
    домена.испытание

Conversions can be applied at a per-label basis using the ``ulabel`` or ``alabel``
functions if necessary:

.. code-block:: pycon

    # Python 2
    >>> idna.alabel(u'测试')
    'xn--0zwm56d'

Compatibility Mapping (UTS #46)
+++++++++++++++++++++++++++++++

As described in `RFC 5895 <http://tools.ietf.org/html/rfc5895>`_, the IDNA
specification no longer normalizes input from different potential ways a user
may input a domain name. This functionality, known as a “mapping”, is now
considered by the specification to be a local user-interface issue distinct
from IDNA conversion functionality.

This library provides one such mapping, that was developed by the Unicode
Consortium. Known as `Unicode IDNA Compatibility Processing <http://unicode.org/reports/tr46/>`_,
it provides for both a regular mapping for typical applications, as well as
a transitional mapping to help migrate from older IDNA 2003 applications.

For example, “Königsgäßchen” is not a permissible label as *LATIN CAPITAL
LETTER K* is not allowed (nor are capital letters in general). UTS 46 will
convert this into lower case prior to applying the IDNA conversion.

.. code-block:: pycon

    # Python 3
    >>> import idna
    >>> idna.encode(u'Königsgäßchen')
    ...
    idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed
    >>> idna.encode('Königsgäßchen', uts46=True)
    b'xn--knigsgchen-b4a3dun'
    >>> print(idna.decode('xn--knigsgchen-b4a3dun'))
    königsgäßchen

Transitional processing provides conversions to help transition from the older
2003 standard to the current standard. For example, in the original IDNA
specification, the *LATIN SMALL LETTER SHARP S* (ß) was converted into two
*LATIN SMALL LETTER S* (ss), whereas in the current IDNA specification this
conversion is not performed.

.. code-block:: pycon

    # Python 2
    >>> idna.encode(u'Königsgäßchen', uts46=True, transitional=True)
    'xn--knigsgsschen-lcb0w'

Implementors should use transitional processing with caution, only in rare
cases where conversion from legacy labels to current labels must be performed
(i.e. IDNA implementations that pre-date 2008). For typical applications
that just need to convert labels, transitional processing is unlikely to be
beneficial and could produce unexpected incompatible results.

``encodings.idna`` Compatibility
++++++++++++++++++++++++++++++++

Function calls from the Python built-in ``encodings.idna`` module are
mapped to their IDNA 2008 equivalents using the ``idna.compat`` module.
Simply substitute the ``import`` clause in your code to refer to the
new module name.

Exceptions
----------

All errors raised during the conversion following the specification should
raise an exception derived from the ``idna.IDNAError`` base class.

More specific exceptions that may be generated as ``idna.IDNABidiError``
when the error reflects an illegal combination of left-to-right and right-to-left
characters in a label; ``idna.InvalidCodepoint`` when a specific codepoint is
an illegal character in an IDN label (i.e. INVALID); and ``idna.InvalidCodepointContext``
when the codepoint is illegal based on its positional context (i.e. it is CONTEXTO
or CONTEXTJ but the contextual requirements are not satisfied.)

Testing
-------

The library has a test suite based on each rule of the IDNA specification, as
well as tests that are provided as part of the Unicode Technical Standard 46,
`Unicode IDNA Compatibility Processing <http://unicode.org/reports/tr46/>`_.

The tests are run automatically on each commit at Travis CI:

.. image:: https://travis-ci.org/kjd/idna.svg?branch=master
   :target: https://travis-ci.org/kjd/idna
PK�(�\�Yď#doc/alt-python37-setuptools/LICENSEnu�[���Copyright 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.
PK�(�\_��#doc/alt-python37-setuptools/zpl.txtnu�[���Zope 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.
PK�(�\SoD �1�1$doc/alt-python37-setuptools/psfl.txtnu�[���A. 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.
PK�(�\���*doc/alt-python37-setuptools/docs/index.rstnu�[���setuptools
==========

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::
PK�(�\��U��<doc/alt-python37-setuptools/docs/deprecated/easy_install.rstnu�[���============
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.
PK�(�\�Ӹ�5doc/alt-python37-setuptools/docs/deprecated/index.rstnu�[���======================================================
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
PK�(�\@�G���?doc/alt-python37-setuptools/docs/deprecated/distutils/index.rstnu�[���.. _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
PK�(�\R����Cdoc/alt-python37-setuptools/docs/deprecated/distutils/extending.rstnu�[���.. _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.


PK�(�\�Y�
&
&Ddoc/alt-python37-setuptools/docs/deprecated/distutils/sourcedist.rstnu�[���.. _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`.
PK�(�\f�m�(�(Bdoc/alt-python37-setuptools/docs/deprecated/distutils/examples.rstnu�[���.. _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
PK�(�\U��)�z�zEdoc/alt-python37-setuptools/docs/deprecated/distutils/setupscript.rstnu�[���.. _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.
PK�(�\�W��Ddoc/alt-python37-setuptools/docs/deprecated/distutils/commandref.rstnu�[���.. _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}}


PK�(�\.<��ZZCdoc/alt-python37-setuptools/docs/deprecated/distutils/builtdist.rstnu�[���.. _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.
PK�(�\:X���Cdoc/alt-python37-setuptools/docs/deprecated/distutils/uploading.rstnu�[���:orphan:

***************************************
Uploading Packages to the Package Index
***************************************

References to up to date PyPI documentation can be found at
:ref:`publishing-python-packages`.
PK�(�\n�O���Pdoc/alt-python37-setuptools/docs/deprecated/distutils/_setuptools_disclaimer.rstnu�[���.. 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.
PK�(�\>�yq�!�!Fdoc/alt-python37-setuptools/docs/deprecated/distutils/introduction.rstnu�[���.. _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.
PK�(�\I���Fdoc/alt-python37-setuptools/docs/deprecated/distutils/packageindex.rstnu�[���: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
PK�(�\�ׁ���Ddoc/alt-python37-setuptools/docs/deprecated/distutils/configfile.rstnu�[���.. _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.

PK�(�\I��xzxz@doc/alt-python37-setuptools/docs/deprecated/distutils/apiref.rstnu�[���.. _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
PK�(�\2�����@doc/alt-python37-setuptools/docs/deprecated/distutils-legacy.rstnu�[���Porting 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.
PK�(�\�j'��?doc/alt-python37-setuptools/docs/deprecated/functionalities.rstnu�[���"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.PK�(�\eO<�x�x;doc/alt-python37-setuptools/docs/deprecated/python_eggs.rstnu�[���=====================================
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.
PK�(�\4W�pppp2doc/alt-python37-setuptools/docs/pkg_resources.rstnu�[���=============================================================
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.
PK�(�\�0�7�78doc/alt-python37-setuptools/docs/references/keywords.rstnu�[���========
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.
PK�(�\�'��ss/doc/alt-python37-setuptools/docs/build_meta.rstnu�[���=======================================
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
PK�(�\��s���/doc/alt-python37-setuptools/docs/setuptools.rstnu�[���==================================================
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/
PK�(�\ƺ4�{{4doc/alt-python37-setuptools/docs/userguide/index.rstnu�[���==================================================
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
PK�(�\���@�
�
?doc/alt-python37-setuptools/docs/userguide/development_mode.rstnu�[���"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.
PK�(�\G��N��9doc/alt-python37-setuptools/docs/userguide/quickstart.rstnu�[���==========================
``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.
PK�(�\P��d��8doc/alt-python37-setuptools/docs/userguide/datafiles.rstnu�[���====================
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.
PK�(�\��f�n)n)Adoc/alt-python37-setuptools/docs/userguide/declarative_config.rstnu�[���.. _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.
PK�(�\��cߑ�@doc/alt-python37-setuptools/docs/userguide/package_discovery.rstnu�[���.. _`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.
PK�(�\�!�**8doc/alt-python37-setuptools/docs/userguide/extension.rstnu�[���.. _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).
PK�(�\C���"�"7doc/alt-python37-setuptools/docs/userguide/keywords.rstnu�[���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 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.
PK�(�\4/o�*�*Ddoc/alt-python37-setuptools/docs/userguide/dependency_management.rstnu�[���=====================================
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"],
            ...,
        )
PK�(�\Ѩ���1�1;doc/alt-python37-setuptools/docs/userguide/distribution.rstnu�[���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
: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
PK�(�\\��ى�:doc/alt-python37-setuptools/docs/userguide/entry_point.rstnu�[���.. _`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.
PK�(�\'��*VVFdoc/alt-python37-setuptools/docs/userguide/functionalities_rewrite.rstnu�[���========================================================
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.


PK�(�\���@�j�j7doc/alt-python37-setuptools/docs/userguide/commands.rstnu�[���-----------------
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>`_.
PK�(�\��`''<doc/alt-python37-setuptools/docs/userguide/miscellaneous.rstnu�[���.. _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.
PK�(�\�S��
�
4doc/alt-python37-setuptools/docs/python 2 sunset.rstnu�[���: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.
PK�(�\
`�nPP(doc/alt-python37-setuptools/docs/conf.pynu�[���extensions = ['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']
PK�(�\c�g���,doc/alt-python37-setuptools/docs/roadmap.rstnu�[���=======
Roadmap
=======

Setuptools maintains a series of `milestones
<https://github.com/pypa/setuptools/milestones>`_ to track
a roadmap of large-scale goals.
PK�(�\�&5pp,doc/alt-python37-setuptools/docs/history.rstnu�[���: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).
PK�(�\$dگ�6doc/alt-python37-setuptools/docs/development/index.rstnu�[���-------------------------
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
PK�(�\�rE��9doc/alt-python37-setuptools/docs/development/releases.rstnu�[���===============
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.
PK�(�\�
���@doc/alt-python37-setuptools/docs/development/developer-guide.rstnu�[���================================
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).
PK�(�\O�mm)doc/alt-python37-distlib/CONTRIBUTORS.txtnu�[���=======================
Distutils2 Contributors
=======================

The Distutils2 project was started by Tarek Ziadé and is currently
maintained by Éric Araujo.  Many people have contributed to the project.

distlib has started off using some of the code from distutil2.

If you're making a patch, please add your name below in alphabetical order,
and welcome into the Fellowship of the Packaging!

Thanks to:

- Rajiv Abraham
- Ali Afshar
- David Barnett
- Pior Bastida
- Anthony Baxter
- Erik Bray
- C. Titus Brown
- Francisco Martín Brugué
- Nicolas Cadou
- Godefroid Chapelle
- Julien Courteau
- Christophe Combelles
- Jason R. Coombs
- Pierre-Yves David
- Ned Deily
- Konrad Delong
- Josip Djolonga
- John Edmonds
- André Espaze
- Boris Feld
- Andrew Francis
- Hallvard B Furuseth
- Patrice Gauthier
- Yannick Gingras
- Filip Gruszczyński
- Walker Hale IV
- Alexandre Hamelin
- Kelsey Hightower
- Thomas Holmes
- Preston Holmes
- Christian Hudon
- Julien Jehannet
- Jeremy Kloth
- Thomas Kluyver
- Amos Latteier
- Mathieu Leduc-Hamel
- Pierre Paul Lefebvre
- Tshepang Lekhonkhobe
- Alain Leufroy
- Janusz Lewandowski
- Martin von Löwis
- Hugo Lopes Tavares
- Guillermo López-Anglada
- Justin Love
- Simon Mathieu
- Carl Meyer
- Alexis Métaireau
- Julien Miotte
- Zubin Mithra
- Derek McTavish Mounce
- Paul Moore
- Michael Mulich
- Louis Munro
- Gaël Pasgrimaud
- George Peristerakis
- Mathieu Perreault
- Guillaume Pratte
- Sean Reifschneider
- Antoine Reversat
- Arc Riley
- C. Anthony Risinger
- Elson Rodriguez
- Luis Rojas
- Erik Rose
- Brian Rosner
- Vinay Sajip
- Victor Stinner
- Alexandre Vassalotti
- Nadeem Vawda
PK�(�\�ԝ�8�8$doc/alt-python37-distlib/LICENSE.txtnu�[���A. 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.2             2.1.1       2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2.1           2.2         2002        PSF         yes
    2.2.2           2.2.1       2002        PSF         yes
    2.2.3           2.2.2       2003        PSF         yes
    2.3             2.2.2       2002-2003   PSF         yes
    2.3.1           2.3         2002-2003   PSF         yes
    2.3.2           2.3.1       2002-2003   PSF         yes
    2.3.3           2.3.2       2002-2003   PSF         yes
    2.3.4           2.3.3       2004        PSF         yes
    2.3.5           2.3.4       2005        PSF         yes
    2.4             2.3         2004        PSF         yes
    2.4.1           2.4         2005        PSF         yes
    2.4.2           2.4.1       2005        PSF         yes
    2.4.3           2.4.2       2006        PSF         yes
    2.4.4           2.4.3       2006        PSF         yes
    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         2010        PSF         yes
    3.2             3.1         2010        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
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.
PK�(�\-�9�[�[$doc/alt-python37-distlib/CHANGES.rstnu�[���Change log for ``distlib``
--------------------------

0.3.5 (future)
~~~~~~~~~~~~~~

Released: Not yet.

0.3.4
~~~~~

Released: 2021-12-08

- database

    - Fixed #153: Raise warnings in get_distributions() if bad metadata seen, but keep
      going.

- markers

    - Fixed #154: Determine Python versions correctly for Python >= 3.10.

- scripts

    - Updated launcher executables.

Code relating to support for Python 2.6 was also removed.

0.3.3
~~~~~

Released: 2021-09-22

- compat

    - Fixed #152: Removed splituser() function which wasn't used and is deprecated.

- markers

    - Fixed #149: Handle version comparisons correctly in environment markers.

- scripts

    - Add ARM-64 launchers and support code to use them. Thanks to Niyas Sait and
      Adrian Vladu for their contributions.

- util

    - Fixed #148: Handle a single trailing comma following a version. Thanks to Blazej
      Floch for the report and suggested fix.

- version

    - Fixed #150: Fix incorrect handling of epochs.

- wheel

    - Reverted handling of tags for Python >= 3.10 (use 310 rather than 3_10). This is
      because PEP 641 was rejected.

- tests

    - Made changes relating to implementing CI using GitHub Actions.

0.3.2
~~~~~

Released: 2021-05-29

- locators

    - Fixed #141: removed unused regular expression.

- metadata

    - Fixed #140: allowed "Obsoletes" in more scenarios, to better handle faulty
      metadata already on PyPI.

- resources

    - Fixed #146: added entry for SourcelessFileLoader to the finder registry.

- scripts

    - Made the generation of scripts more configurable:

        - the ``variant_separator`` attribute can be set to determine the separator used
          between a script basename and its X.Y variant. The default value is ``'-'``
          and would result in a final script basename like ``'foo-X.Y'``, whereas
          setting it to ``''`` would result in a final script basename like
          ``'fooX.Y'``.

        - You can also subclass and override the ``get_script_filenames()`` method to
          provide a more customised set of file basenames.

- util

    - Fixed #140: allowed a trailing comma in constraints, to better handle faulty
      metadata already on PyPI.

    - Moved get_platform() logic from distutils to here.

    - Fixed #143: removed normcase() to avoid some problems on Windows.

- wheel

    - Dropped any trailing data when computing the Python tag.

    - Added support for manylinux tags.

    - Changed handling of tags for Python >= 3.10 (use 3_10 rather than 310).

    - Fixed #147: permission bits are now preserved on POSIX when installing from a
      wheel.

- tests

   - Fixed #139: improved handling of errors related to the test PyPI server.

0.3.1
~~~~~

Released: 2020-06-27

The repository has been migrated to Git. References to earlier changesets (commits) in
issue comments, etc. will be invalid.

- scripts

    - Fixed #132: Added documentation to help with relative interpreter paths. Thanks
      to Paul Kienzle for the patch.

    - Fixed #134: Allowed specifying a different target Python version when generating
      scripts.

    - Fixed #135: Exposed the ``enquote_executable`` function previously implemented
      as an internal function.

    - Addressed #138: Improved metadata support for newer metadata versions. Thanks to
      James Tocknell for the patch.

- wheel

    - Changed the output of flags in entry point definitions. Thanks to frostming (明希)
      for the patch.

    - Stopped writing JSON metadata. Only old-style metadata is written now.

0.3.0
~~~~~

Released: 2019-10-29

- database

    - Issue #102 (partial): modules attribute of InstalledDistribution was
      incorrectly computed as a list of bytes, rather than a list of str. This
      has now been corrected.

- locators

    - Updated Locator._get_digest to check PyPI JSON responses for a "digests"
      dictionary before trying "algo_digest" keys. Thanks to Jeffery To for the
      patch.

- scripts

    - Fixed #123: Improved error message if a resource isn't found.

    - Fixed #124: Stopped norm-casing the executable written into shebangs, as
      it doesn't work for some non-ASCII paths.

    - Fixed #125: Updated launchers with versions that correctly report errors
      containing non-ASCII characters. The updated launchers now also support
      relative paths (see http://bit.ly/2JxmOoi for more information).

    - Changed Python version handling to accommodate versions like e.g. 3.10
      (no longer assume a version X.Y where X and Y are single digits).

- util

    - Fixed #127: Allowed hyphens in flags in export specifications.

- wheel

    - Changed Python version handling to accommodate versions like e.g. 3.10
      (no longer assume a version X.Y where X and Y are single digits).


0.2.9
~~~~~

Released: 2019-05-14

- index

    - Updated default PyPI URL to https://pypi.org/pypi.

- locators

    - Updated default PyPI URL to https://pypi.org/pypi.

- metadata

    - Relaxed metadata format checks to ignore 'Provides'.

- scripts

    - Fixed #33, #34: Simplified script template.

    - Updated Windows launchers.

- util

    - Fixed #116: Corrected parsing of credentials from URLs.

- wheel

    - Fixed #115: Relaxed check for '..' in wheel archive entries by not
      checking filename parts, only directory segments.

    - Skip entries in archive entries ending with '/' (directories) when
      verifying or installing.

- docs

    - Updated default PyPI URL to https://pypi.org/pypi.

    - Commented out Disqus comment section.

    - Changed theme configuration.

    - Updated some out-of-date argument lists.

- tests

    - Updated default PyPI URL to https://pypi.org/pypi.

    - Preserved umask on POSIX across a test.


0.2.8
~~~~~

Released: 2018-10-01

- database

    - Fixed #108: Updated metadata scan to look for the METADATA file as well
      as the JSON formats.

- locators

    - Fixed #112: Handled wheel tags and platform-dependent downloads correctly
      in SimpleScrapingLocator.

- metadata

    - Fixed #107: Updated documentation on testing to include information on
      setting PYTHONHASHSEED.

- scripts

    - Fixed #111: Avoided unnecessary newlines in script preambles, which caused
      problems with detecting encoding declarations. Thanks to Wim Glenn for the
      report and patch.

- util

    - Fixed #109: Removed existing files (which might have been symlinks) before
      overwriting.


0.2.7
~~~~~

Released: 2018-04-16

- compat

    - Fixed #105: cache_from_source is now imported from importlib.util where
      available.

- database

    - Addressed #102: InstalledDistributions now have a modules attribute which
      is a list of top-level modules as read from top_level.txt, if that is in
      the distribution info.

- locators

    - Fixed #103: Thanks to Saulius Žemaitaitis for the patch.

- metadata

    - Added support for PEP 566 / Metadata 1.3.

- scripts

    - Fixed #104: Updated launcher binaries. Thanks to Atsushi Odagiri for
      the diagnosis and fix.


0.2.6
~~~~~

Released: 2017-10-28

- compat

    - Fixed #99: Updated to handle a case where sys.getfilesystemencoding()
      returns None.

- database

    - Fixed #97: Eliminated a crash in EggInfoDistribution.list_distinfo_files()
      which was caused by trying to open a non-existent file.

    - Handled a case where an installed distribution didn't have 'Provides:'
      metadata.

- locators

    - Fixed #96: SimpleScrapingLocator no longer fails prematurely when scraping
      links due to invalid versions.

- markers

    - Improved error messages issued when interpreting markers

- scripts

    - Improved the shebangs written into installed scripts when the interpreter
      path is very long or contains spaces (to cater for a limitation in shebang
      line parsing on Linux)

    - Updated launcher binaries.

- tests

    - Numerous test refinements, not detailed further here.


0.2.5
~~~~~

Released: 2017-05-06

- general

    - Changed regular expressions to be compatible with 3.6 as regards escape
      sequences. Thanks to Ville Skyttä for the patch.

    - closed some resource leaks related to XML-RPC proxies.

    - Removed Python 2.6 from the support list.

- locators

    - Made downloadability a factor in scoring URLs for preferences.

- markers

    - Replaced the implementation with code which parses requirements in
      accordance with PEP 508 and evaluates marker expressions according to
      PEP 508.

- util

    - Changed _csv_open to use utf-8 across all platforms on Python 3.x. Thanks
      to Alastair McCormack for the patch.

- wheel

    - Changed to look for metadata in metadata.json as well as pydist.json.

- version

    - Updated requirement parsing in version matchers to use the new
      PEP 508-compliant code.

- tests

    - Numerous test refinements, not detailed further here.


0.2.4
~~~~~

Released: 2016-09-30

- compat

    - Updated to not fail on import if SSL is unavailable.

- index

    - Switch from using gpg in preference to gpg2 for signing. This is
      to avoid gpg2's behaviour of prompting for passwords, which interferes
      with the tests on some machines.

- locators

    - Changed project name comparisons to follow PEP 503. Thanks to Steven
      Arcangeli for the patch.

    - Added errors queue to Locator.

- manifest

    - Changed match logic to work under Python 3.6, due to differences in
      how fnmatch.translate behaves.

- resources

    - Updated finder registry logic to reflect changes in Python 3.6.

- scripts

    - Fixed regular expression in generated script boilerplate.

- util

    - Updated to not fail on import if SSL is unavailable.

    - Added normalize_name for project name comparisons using PEP 503.

- tests

    - Updated to skip certain tests if SSL is unavailable.

    - Numerous other test refinements, not detailed further here.


0.2.3
~~~~~

Released: 2016-04-30

- util

    - Changed get_executable to return Unicode rather than bytes.

    - Fixed #84: Allow + character in output script names.

    - Relaxed too-stringent test looking for application/json in headers.

- wheel

    - sorted the entries in RECORD before writing to file.

- tests

    - Numerous test refinements, not detailed further here.


0.2.2
~~~~~

Released: 2016-01-30

- database

    - Issue #81: Added support for detecting distributions installed by wheel
      versions >= 0.23 (which use metadata.json rather than pydist.json).
      Thanks to Te-jé Rodgers for the patch.

- locators

    - Updated default PyPI URL to https://pypi.python.org/pypi

- metadata

    - Updated to use different formatting for description field for V1.1
      metadata.

    - Corrected "classifier" to "classifiers" in the mapping for V1.0
      metadata.

- scripts

    - Improved support for Jython when quoting executables in output scripts.

- util

    - Issue #77: Made the internal URL used for extended metadata fetches
      configurable via a module attribute.

    - Issue #78: Improved entry point parsing to handle leading spaces in
      ini-format files.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - renamed environment variable SKIP_SLOW to SKIP_ONLINE in tests and
      applied to some more tests.

    - Numerous other test refinements, not detailed further here.


0.2.1
~~~~~

Released: 2015-07-07

- locators

    - Issue #58: Return a Distribution instance or None from ``locate()``.

    - Issue #59: Skipped special keys when looking for versions.

    - Improved behaviour of PyPIJSONLocator to be analogous to that of other
      locators.

- resource

    - Added resource iterator functionality.

- scripts

    - Issue #71: Updated launchers to decode shebangs using UTF-8. This allows
      non-ASCII pathnames to be correctly handled.

    - Ensured that the executable written to shebangs is normcased.

    - Changed ScriptMaker to work better under Jython.

- util

    - Changed the mode setting method to work better under Jython.

    - Changed get_executable() to return a normcased value.

- wheel

    - Handled multiple-architecture wheel filenames correctly.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.


0.2.0
~~~~~

Released: 2014-12-17

- compat

    - Updated ``match_hostname`` to use the latest Python implementation.

- database

    - Added `download_urls` and `digests` attributes to ``Distribution``.

- locators

    - Issue #48: Fixed the problem of adding a tuple containing a set
      (unhashable) to a set, by wrapping with frozenset().

    - Issue #55: Return multiple download URLs for distributions, if
      available.

- manifest

    - Issue #57: Remove unhelpful warnings about pattern matches.

- metadata

    - Updated to reflect changes to PEP 426.

- resources

    - Issue #50: The type of the path needs to be preserved on 2.x.

- scripts

    - Updated (including launchers) to support providing arguments to
      interpreters in shebang lines.

    - The launcher sources are now included in the repository and the
      source distribution (they are to be found in the PC directory).

    - Added frames support in IronPython (patch by Pawel Jasinski).

    - Issue #51: encode shebang executable using utf-8 rather than fsencode.

- util

    - Removed reference to __PYVENV_LAUNCHER__ when determining executable
      for scripts (relevant only on OS X).

    - Updated to support changes to PEP 426.

- version

    - Updated to reflect changes to versioning proposed in PEP 440.

- wheel

    - Updated build() code to respect interpreter arguments in prebuilt
      scripts.

    - Updated to support changes to PEP 426 / PEP 440.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.


0.1.9
~~~~~

Released: 2014-05-19

- index

    - Added ``keystore`` keyword argument to signing and verification
      APIs.

- scripts

    - Issue #47: Updated binary launchers to fix double-quoting bug where
      script executable paths have spaces.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.


0.1.8
~~~~~

Released: 2014-03-18

- index

    - Improved thread-safety in SimpleScrapingLocator (issue #45).

    - Replaced absolute imports with relative ones.

    - Added ``search`` method to ``PackageIndex``.

- locators

    - Improved thread-safety in ``SimpleScrapingLocator`` (issue #45).

- metadata

    - Fixed bug in add_requirements implementation.

- resources

    - The ``Cache`` class was refactored into ``distlib.util.Cache``
      and ``distlib.resources.ResourceCache`` classes.

- scripts

    - Implement quoting for executables with spaces in them.

- util

    - Gained the ``Cache`` class, which is also used in ``distlib.wheel``.

- version

    - Allowed versions with a single numeric component and a local
      version component.

    - Adjusted pre-release computation for legacy versions to be the same as
      the logic in the setuptools documentation.

- wheel

    - Added ``verify``, ``update``, ``is_compatible`` and ``is_mountable``
      methods to the ``Wheel`` class.

    - Converted local version separators from '-' to '_' and back.

    - If SOABI not available, used Py_DEBUG, Py_UNICODE_SIZE and
      WITH_PYMALLOC to derive the ABI.

    - Added "exists" property to Wheel instances.

    - Factored out RECORD writing and zip building to separate methods.

    - Provided the ability to determine the location where extensions are
      extracted, by using the ``distlib.util.Cache`` class.

    - Avoided using ``pydist.json`` in 1.0 wheels (``bdist_wheel`` writes a
      non-conforming ``pydist.json``.)

    - Improved computation of compatible tags on OS X, and made COMPATIBLE_TAGS
      a set.

- _backport/sysconfig

    - Replaced an absolute import with a relative one.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.


0.1.7
~~~~~

Released: 2014-01-16

- metadata

    - Added some more fields to the metadata for the index.

- resources

    - Use native literal string in cache path.

    - Issue #40: Now does path adjustments differently for files and zips.

- scripts

    - Improved checking for venvs when generating scripts.

- util

    - Issue #39: Fall back to temporary directory for cache if home directory
      unavailable.

- wheel

    - Use native literal string in cache path.

0.1.6
~~~~~

Released: 2013-12-31

- scripts

    - Updated binary launchers because the wrong variant was shipped
      with the previous release.

- version

    - Added support for local component in PEP 440 versions.

- tests

    - Numerous test refinements, not detailed further here.


0.1.5
~~~~~

Released: 2013-12-15

- compat

    - Changed source of import for unescape in Python >= 3.4.

- index

    - Used dummy_threading when threading isn't available.

    - Used https for default index.

- locators

    - Used dummy_threading when threading isn't available.

- scripts

    - Defaulted to setting script mode bits on POSIX.

    - Use uncompressed executable launchers, since some anti-virus
      products raise false positive errors.

- util

    - Used dummy_threading when threading isn't available.

- docs

    - Updated out-of-date links in overview.

- tests

    - Used dummy_threading when threading isn't available.


0.1.4
~~~~~

Released: 2013-10-31

- scripts

    - Updated the logic for finding the distlib package using a relative,
      rather than absolute method. This fixes a problem for pip, where
      distlib is kept in the pip.vendor.distlib package.

- _backport/sysconfig

    - The analogous change to that made for scripts, described above.

0.1.3
~~~~~

Released: 2013-10-18

- database

    - Added support for PEP 426 JSON metadata (pydist.json).

    - Generalised digests to support e.g. SHA256.

    - Fixed a bug in parsing legacy metadata from .egg directories.

    - Removed duplicated code relating to parsing "provides" fields.

- index

    - Changes relating to support for PEP 426 JSON metadata (pydist.json).

- locators

    - Changes relating to support for PEP 426 JSON metadata (pydist.json).

    - Fixed a bug in scoring download URLs for preference when multiple URLs
      are available.

    - The legacy scheme is used for the default locator.

    - Made changes relating to parsing "provides" fields.

    - Generalised digests to support e.g. SHA256.

    - If no release version is found for a requirement, prereleases are
      now considered even if not explicitly requested.

- markers

    - Added support for markers as specified in PEP 426.

- metadata

    - Added support for PEP 426 JSON metadata (pydist.json). The old
      metadata class is renamed to LegacyMetadata, and the (new)
      Metadata class wraps the JSON format (and also the legacy format,
      through LegacyMetadata).

    - Removed code which was only used if docutils was installed. This code
      implemented validation of .rst descriptions, which is not done in
      distlib.

- scripts

    - Updated the logic for writing executable files to deal as best we can
      with files which are already in use and hence cannot be deleted on
      Windows.

    - Changed the script generation when launchers are used to write a
      single executable which wraps a script (whether pre-built or generated)
      and includes a manifest to avoid UAC prompts on Windows.

    - Changed the interface for script generation options: the ``make`` and
      ``make_multiple`` methods of ``ScriptMaker`` now take an optional
      ``options`` dictionary.

- util

    - Added extract_by_key() to copy selected keys from one dict to another.

    - Added parse_name_and_version() for use in parsing "provides" fields.

    - Made split_filename more flexible.

- version

    - Added support for PEP 440 version matching.

    - Removed AdaptiveVersion, AdaptiveMatcher etc. as they don't add
      sufficient value to justify keeping them in.

- wheel

    - Added wheel_version kwarg to Wheel.build API.

    - Changed Wheel.install API (after consultation on distutils-sig).

    - Added support for PEP 426 JSON metadata (pydist.json).

    - Added lib_only flag to install() method.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.


0.1.2
~~~~~

Released: 2013-04-30

- compat

    - Added BaseConfigurator backport for 2.6.

- database

    - Return RECORD path from write_installed_files (or None if dry_run).

    - Explicitly return None from write_shared_locations if dry run.

- metadata

    - Added missing condition in :meth:`todict`.

- scripts

    - Add variants and clobber flag for generation of foo/fooX/foo-X.Y.

    - Added .exe manifests for Windows.

- util

    - Regularised recording of written files.

    - Added Configurator.

- version

    - Tidyups, most suggested by Donald Stufft: Made key functions private,
      removed _Common class, removed checking for huge version numbers, made
      UnsupportedVersionError a ValueError.

- wheel

    - Replaced absolute import with relative.

    - Handle None return from write_shared_locations correctly.

    - Fixed bug in Mounter for extension modules not in sub-packages.

    - Made dylib-cache Python version-specific.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.

- other

    - Corrected setup.py to ensure that sysconfig.cfg is included.


0.1.1
~~~~~

Released: 2013-03-22

- database

    - Updated requirements logic to use extras and environment markers.

    - Made it easier to subclass Distribution and EggInfoDistribution.

- locators

    - Added method to clear locator caches.

    - Added the ability to skip pre-releases.

- manifest

    - Fixed bug which caused side-effect when sorting a manifest.

- metadata

    - Updated to handle most 2.0 fields, though PEP 426 is still a draft.

    - Added the option to skip unset fields when writing.

- resources

    - Made separate subclasses ResourceBase, Resource and ResourceContainer
      from Resource. Thanks to Thomas Kluyver for the suggestion and patch.

- scripts

    - Fixed bug which prevented writing shebang lines correctly on Windows.

- util

    - Made get_cache_base more useful by parameterising the suffix to use.

    - Fixed a bug when reading CSV streams from .zip files under 3.x.

- version

    - Added is_prerelease property to versions.

    - Moved to PEP 426 version formats and sorting.

- wheel

    - Fixed CSV stream reading under 3.x and handled UTF-8 in zip entries
      correctly.

    - Added metadata and info properties, and updated the install method to
      return the installed distribution.

    - Added mount/unmount functionality.

    - Removed compatible_tags() function in favour of COMPATIBLE_TAGS
      attribute.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.


0.1.0
~~~~~

Released: 2013-03-02

- Initial release.
PK�(�\o���#doc/alt-python37-distlib/README.rstnu�[���.. image:: https://img.shields.io/appveyor/build/vsajip/distlib
   :alt: AppVeyor

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

What is it?
-----------

Distlib is a library which implements low-level functions that relate to
packaging and distribution of Python software. It is intended to be used as the
basis for third-party packaging tools. The documentation is available at

https://distlib.readthedocs.io/

Main features
-------------

Distlib currently offers the following features:

* The package ``distlib.database``, which implements a database of installed
  distributions, as defined by :pep:`376`, and distribution dependency graph
  logic. Support is also provided for non-installed distributions (i.e.
  distributions registered with metadata on an index like PyPI), including
  the ability to scan for dependencies and building dependency graphs.
* The package ``distlib.index``, which implements an interface to perform
  operations on an index, such as registering a project, uploading a
  distribution or uploading documentation. Support is included for verifying
  SSL connections (with domain matching) and signing/verifying packages using
  GnuPG.
* The package ``distlib.metadata``, which implements distribution metadata as
  defined by :pep:`426`, :pep:`345`, :pep:`314` and :pep:`241`.
* The package ``distlib.markers``, which implements environment markers as
  defined by :pep:`426`.
* The package ``distlib.manifest``, which implements lists of files used
  in packaging source distributions.
* The package ``distlib.locators``, which allows finding distributions, whether
  on PyPI (XML-RPC or via the "simple" interface), local directories or some
  other source.
* The package ``distlib.resources``, which allows access to data files stored
  in Python packages, both in the file system and in .zip files.
* The package ``distlib.scripts``, which allows installing of scripts with
  adjustment of shebang lines and support for native Windows executable
  launchers.
* The package ``distlib.version``, which implements version specifiers as
  defined by :pep:`440` / :pep:`426`, but also support for working with
  "legacy" versions (``setuptools``/``distribute``) and semantic versions.
* The package ``distlib.wheel``, which provides support for building and
  installing from the Wheel format for binary distributions (see :pep:`427`).
* The package ``distlib.util``, which contains miscellaneous functions and
  classes which are useful in packaging, but which do not fit neatly into
  one of the other packages in ``distlib``.* The package implements enhanced
  globbing functionality such as the ability to use ``**`` in patterns to
  specify recursing into subdirectories.


Python version and platform compatibility
-----------------------------------------

Distlib is intended to be used on any Python version >= 2.7 and is tested on
Python versions 2.7 and 3.3-3.6 on Linux, Windows, and Mac OS X (not
all versions are tested on all platforms, but are expected to work correctly).

Project status
--------------

The project has reached a mature status in its development: there is a test
suite and it has been exercised on Windows, Ubuntu and Mac OS X. The project is
used by well-known projects such as `pip <https://pypi.org/pypi/pip>`_ and
`caniusepython3 <https://pypi.org/pypi/caniusepython3>`_.

Code of Conduct
---------------

Everyone interacting in the distlib project's codebases, issue trackers, chat
rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.

.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
PK�(�\�O�j>	>	+doc/alt-python37-lxml/ZopePublicLicense.txtnu�[���Zope Public License (ZPL) Version 2.0
-----------------------------------------------

This software is Copyright (c) Zope Corporation (tm) and
Contributors. All rights reserved.

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 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 name Zope Corporation (tm) must not be used to
   endorse or promote products derived from this software
   without prior written permission from Zope Corporation.

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 Zope Corporation. Use of them is
   covered in a separate agreement (see
   http://www.zope.com/Marks).

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 ZOPE CORPORATION ``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 ZOPE CORPORATION OR ITS 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.


This software consists of contributions made by Zope
Corporation and many individuals on behalf of Zope
Corporation.  Specific attributions are listed in the
accompanying credits file.
PK�(�\���U��"doc/alt-python37-lxml/LICENSES.txtnu�[���lxml is copyright Infrae and distributed under the BSD license (see
doc/licenses/BSD.txt), with the following exceptions:

Some code, such a selftest.py, selftest2.py and
src/lxml/_elementpath.py are derived from ElementTree and
cElementTree. See doc/licenses/elementtree.txt for the license text.

lxml.cssselect and lxml.html are copyright Ian Bicking and distributed
under the BSD license (see doc/licenses/BSD.txt).

test.py, the test-runner script, is GPL and copyright Shuttleworth
Foundation. See doc/licenses/GPL.txt. It is believed the unchanged
inclusion of test.py to run the unit test suite falls under the
"aggregation" clause of the GPL and thus does not affect the license
of the rest of the package.

The isoschematron implementation uses several XSL and RelaxNG resources:
 * The (XML syntax) RelaxNG schema for schematron, copyright International
   Organization for Standardization (see 
   src/lxml/isoschematron/resources/rng/iso-schematron.rng for the license
   text)
 * The skeleton iso-schematron-xlt1 pure-xslt schematron implementation
   xsl stylesheets, copyright Rick Jelliffe and Academia Sinica Computing
   Center, Taiwan (see the xsl files here for the license text: 
   src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/)
 * The xsd/rng schema schematron extraction xsl transformations are unlicensed
   and copyright the respective authors as noted (see 
   src/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl and
   src/lxml/isoschematron/resources/xsl/XSD2Schtrn.xsl)
PK�(�\t�
\
\
 doc/alt-python37-lxml/README.rstnu�[���What is lxml?
=============

lxml is the most feature-rich and easy-to-use library for processing XML and HTML in the Python language.
It's also very fast and memory friendly, just so you know.

For an introduction and further documentation, see `doc/main.txt`_.

For installation information, see `INSTALL.txt`_.

For issue tracker, see https://bugs.launchpad.net/lxml

Support the project
-------------------

lxml has been downloaded from the `Python Package Index`_
millions of times and is also available directly in many package
distributions, e.g. for Linux or MacOS-X.

.. _`Python Package Index`: https://pypi.python.org/pypi/lxml

Most people who use lxml do so because they like using it.
You can show us that you like it by blogging about your experience
with it and linking to the project website.

If you are using lxml for your work and feel like giving a bit of
your own benefit back to support the project, consider sending us
money through GitHub Sponsors, Tidelift or PayPal that we can use
to buy us free time for the maintenance of this great library, to
fix bugs in the software, review and integrate code contributions,
and improving its features and documentation.  Please read the
Legal Notice below, at the bottom of this page.
Thank you for your support.

.. class:: center

  Support lxml through `GitHub Sponsors <https://github.com/users/scoder/sponsorship>`_

  (Note: GitHub will currently double your donation!)

  via `Tidelift <https://tidelift.com/subscription/pkg/pypi-lxml>`_

  or via PayPal:

  |Donate|_

.. _`Donate`: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=R56JE3VCPDA9N

Please `contact Stefan Behnel <http://consulting.behnel.de/>`_
for other ways to support the lxml project,
as well as commercial consulting, customisations and trainings on lxml and
fast Python XML processing.

.. |Donate| image:: https://lxml.de/paypal_btn_donateCC_LG.png
            :width: 160
            :height: 47
            :alt: Donate to the lxml project

.. _`doc/main.txt`: https://github.com/lxml/lxml/blob/master/doc/main.txt
.. _`INSTALL.txt`: http://lxml.de/installation.html

`Travis-CI <https://travis-ci.org/>`_ and `AppVeyor <https://www.appveyor.com/>`_
support the lxml project with their build and CI servers.
Jetbrains supports the lxml project by donating free licenses of their
`PyCharm IDE <https://www.jetbrains.com/pycharm/>`_.
Another supporter of the lxml project is
`COLOGNE Webdesign <https://www.colognewebdesign.de/>`_.


Legal Notice for Donations
--------------------------

Any donation that you make to the lxml project is voluntary and
is not a fee for any services, goods, or advantages.  By making
a donation to the lxml project, you acknowledge that we have the
right to use the money you donate in any lawful way and for any
lawful purpose we see fit and we are not obligated to disclose
the way and purpose to any party unless required by applicable
law.  Although lxml is free software, to the best of our knowledge
the lxml project does not have any tax exempt status.  The lxml
project is neither a registered non-profit corporation nor a
registered charity in any country.  Your donation may or may not
be tax-deductible; please consult your tax advisor in this matter.
We will not publish or disclose your name and/or e-mail address
without your consent, unless required by applicable law.  Your
donation is non-refundable.
PK�(�\���� doc/alt-python37-lxml/readme.txtnu�[���ISO SCHEMATRON 2010

XSLT implementation by Rick Jelliffe with assistance from members of Schematron-love-in maillist.

2010-04-21

Two distributions are available. One is for XSLT1 engines. 
The other is for XSLT2 engines, such as SAXON 9.


This version of Schematron splits the process into a pipeline of several different XSLT stages.

1) First, preprocess your Schematron schema with iso_dsdl_include.xsl.  
This is a macro processor to assemble the schema from various parts. 
If your schema is not in separate parts, you can skip this stage.
This stage also generates error messages for some common XPath syntax problems.

2) Second, preprocess the output from stage 1 with iso_abstract_expand.xsl.  
This is a macro processor to convert abstract patterns to real patterns. 
If your schema does not use abstract patterns, you can skip this
stage.

3) Third, compile the Schematron schema into an XSLT script. 
This will typically use iso_svrl_for_xslt1.xsl or iso_svrl_for_xslt2.xsl 
(which in turn invoke iso_schematron_skeleton_for_xslt1.xsl or iso_schematron_skeleton_for_saxon.xsl)
However, other "meta-stylesheets" are also in common use; the principle of operation is the same.
If your schema uses Schematron phases, supply these as command line/invocation parameters
to this process.

4) Fourth, run the script generated by stage 3 against the document being validated.
If you are using the SVRL script, then the output of validation will be an XML document.
If your schema uses Schematron parameters, supply these as command line/invocation parameters
to this process. 


The XSLT2 distribution also features several next generation features, 
such as validating multiple documents. See the source code for details.

Schematron assertions can be written in any language, of course; the file
sch-messages-en.xhtml contains the diagnostics messages from the XSLT2 skeleton
in English, and this can be used as template to localize the skeleton's
error messages. Note that typically programming errors in Schematron are XPath
errors, which requires localized messages from the XSLT engine.

ANT
---
To give an example of how to process a document, here is a sample ANT task.

<target  name="schematron-compile-test" >

	   <!-- expand inclusions -->
	   <xslt basedir="test/schematron"
	   		style="iso_dsdl_include.xsl" in="test.sch"  out="test1.sch"> 
	   				<classpath>
	   					<pathelement location="${lib.dir}/saxon9.jar"/>
	   				</classpath>
	   </xslt>

	   <!-- expand abstract patterns -->
	   <xslt basedir="test/schematron"
	   		style="iso_abstract_expand.xsl" in="test1.sch"  out="test2.sch"> 
	   				<classpath>
	   					<pathelement location="${lib.dir}/saxon9.jar"/>
	   				</classpath>
	   </xslt>



	   <!-- compile it -->
	   <xslt basedir="test/schematron"
	   		style="iso_svrl_for_xslt2.xsl" in="test2.sch"  out="test.xsl"> 
	   				<classpath>
	   					<pathelement location="${lib.dir}/saxon9.jar"/>
	   				</classpath>
	   </xslt>
	   
	   <!-- validate -->
	   <xslt basedir="test/schematron"
		   		style="test.xsl" in="instance.xml"  out="instance.svrlt"> 
		   				<classpath>
		   					<pathelement location="${lib.dir}/saxon9.jar"/>
		   				</classpath>
	</xslt>
		</target>
PK�(�\SI���"doc/alt-python37-attrs/AUTHORS.rstnu�[���Credits
=======

``attrs`` is written and maintained by `Hynek Schlawack <https://hynek.me/>`_.

The development is kindly supported by `Variomedia AG <https://www.variomedia.de/>`_.

A full list of contributors can be found in `GitHub's overview <https://github.com/python-attrs/attrs/graphs/contributors>`_.

It’s the spiritual successor of `characteristic <https://characteristic.readthedocs.io/>`_ and aspires to fix some of it clunkiness and unfortunate decisions.
Both were inspired by Twisted’s `FancyEqMixin <https://twistedmatrix.com/documents/current/api/twisted.python.util.FancyEqMixin.html>`_ but both are implemented using class decorators because `subclassing is bad for you <https://www.youtube.com/watch?v=3MNVP9-hglc>`_, m’kay?
PK�(�\���::doc/alt-python37-attrs/LICENSEnu�[���The MIT License (MIT)

Copyright (c) 2015 Hynek Schlawack

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.
PK�(�\^�|���!doc/alt-python37-attrs/README.rstnu�[���.. raw:: html

   <p align="center">
      <a href="https://www.attrs.org/">
         <img src="./docs/_static/attrs_logo.svg" width="35%" alt="attrs" />
      </a>
   </p>
   <p align="center">
      <a href="https://www.attrs.org/en/stable/?badge=stable">
          <img src="https://readthedocs.org/projects/attrs/badge/?version=stable" alt="Documentation Status" />
      </a>
      <a href="https://github.com/python-attrs/attrs/actions?workflow=CI">
          <img src="https://github.com/python-attrs/attrs/workflows/CI/badge.svg?branch=main" alt="CI Status" />
      </a>
      <a href="https://codecov.io/github/python-attrs/attrs">
          <img src="https://codecov.io/github/python-attrs/attrs/branch/main/graph/badge.svg" alt="Test Coverage" />
      </a>
      <a href="https://github.com/psf/black">
          <img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="Code style: black" />
      </a>
   </p>

.. teaser-begin

``attrs`` is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka `dunder <https://nedbatchelder.com/blog/200605/dunder.html>`_ methods).
`Trusted by NASA <https://docs.github.com/en/github/setting-up-and-managing-your-github-profile/personalizing-your-profile#list-of-qualifying-repositories-for-mars-2020-helicopter-contributor-badge>`_ for Mars missions since 2020!

Its main goal is to help you to write **concise** and **correct** software without slowing down your code.

.. teaser-end

For that, it gives you a class decorator and a way to declaratively define the attributes on that class:

.. -code-begin-

.. code-block:: pycon

   >>> import attr

   >>> @attr.s
   ... class SomeClass(object):
   ...     a_number = attr.ib(default=42)
   ...     list_of_numbers = attr.ib(factory=list)
   ...
   ...     def hard_math(self, another_number):
   ...         return self.a_number + sum(self.list_of_numbers) * another_number


   >>> sc = SomeClass(1, [1, 2, 3])
   >>> sc
   SomeClass(a_number=1, list_of_numbers=[1, 2, 3])

   >>> sc.hard_math(3)
   19
   >>> sc == SomeClass(1, [1, 2, 3])
   True
   >>> sc != SomeClass(2, [3, 2, 1])
   True

   >>> attr.asdict(sc)
   {'a_number': 1, 'list_of_numbers': [1, 2, 3]}

   >>> SomeClass()
   SomeClass(a_number=42, list_of_numbers=[])

   >>> C = attr.make_class("C", ["a", "b"])
   >>> C("foo", "bar")
   C(a='foo', b='bar')


After *declaring* your attributes ``attrs`` gives you:

- a concise and explicit overview of the class's attributes,
- a nice human-readable ``__repr__``,
- a complete set of comparison methods (equality and ordering),
- an initializer,
- and much more,

*without* writing dull boilerplate code again and again and *without* runtime performance penalties.

On Python 3.6 and later, you can often even drop the calls to ``attr.ib()`` by using `type annotations <https://www.attrs.org/en/latest/types.html>`_.

This gives you the power to use actual classes with actual types in your code instead of confusing ``tuple``\ s or `confusingly behaving <https://www.attrs.org/en/stable/why.html#namedtuples>`_ ``namedtuple``\ s.
Which in turn encourages you to write *small classes* that do `one thing well <https://www.destroyallsoftware.com/talks/boundaries>`_.
Never again violate the `single responsibility principle <https://en.wikipedia.org/wiki/Single_responsibility_principle>`_ just because implementing ``__init__`` et al is a painful drag.


.. -getting-help-

Getting Help
============

Please use the ``python-attrs`` tag on `StackOverflow <https://stackoverflow.com/questions/tagged/python-attrs>`_ to get help.

Answering questions of your fellow developers is also a great way to help the project!


.. -project-information-

Project Information
===================

``attrs`` is released under the `MIT <https://choosealicense.com/licenses/mit/>`_ license,
its documentation lives at `Read the Docs <https://www.attrs.org/>`_,
the code on `GitHub <https://github.com/python-attrs/attrs>`_,
and the latest release on `PyPI <https://pypi.org/project/attrs/>`_.
It’s rigorously tested on Python 2.7, 3.5+, and PyPy.

We collect information on **third-party extensions** in our `wiki <https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs>`_.
Feel free to browse and add your own!

If you'd like to contribute to ``attrs`` you're most welcome and we've written `a little guide <https://www.attrs.org/en/latest/contributing.html>`_ to get you started!


``attrs`` for Enterprise
------------------------

Available as part of the Tidelift Subscription.

The maintainers of ``attrs`` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications.
Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
`Learn more. <https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo>`_
PK�(�\2���II#doc/alt-python37-docopt/LICENSE-MITnu�[���Copyright (c) 2012 Vladimir Keleshev, <vladimir@keleshev.com>

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.
PK�(�\��)dkCkC"doc/alt-python37-docopt/README.rstnu�[���``docopt`` creates *beautiful* command-line interfaces
======================================================================

Video introduction to **docopt**: `PyCon UK 2012: Create *beautiful*
command-line interfaces with Python <http://youtu.be/pXhcPJK5cMc>`_

    New in version 0.6.1:

    - Fix issue `#85 <https://github.com/docopt/docopt/issues/85>`_
      which caused improper handling of ``[options]`` shortcut
      if it was present several times.

    New in version 0.6.0:

    - New argument ``options_first``, disallows interspersing options
      and arguments.  If you supply ``options_first=True`` to
      ``docopt``, it will interpret all arguments as positional
      arguments after first positional argument.

    - If option with argument could be repeated, its default value
      will be interpreted as space-separated list. E.g. with
      ``[default: ./here ./there]`` will be interpreted as
      ``['./here', './there']``.

    Breaking changes:

    - Meaning of ``[options]`` shortcut slightly changed. Previously
      it ment *"any known option"*. Now it means *"any option not in
      usage-pattern"*.  This avoids the situation when an option is
      allowed to be repeated unintentionaly.

    - ``argv`` is ``None`` by default, not ``sys.argv[1:]``.
      This allows ``docopt`` to always use the *latest* ``sys.argv``,
      not ``sys.argv`` during import time.

Isn't it awesome how ``optparse`` and ``argparse`` generate help
messages based on your code?!

*Hell no!*  You know what's awesome?  It's when the option parser *is*
generated based on the beautiful help message that you write yourself!
This way you don't need to write this stupid repeatable parser-code,
and instead can write only the help message--*the way you want it*.

**docopt** helps you create most beautiful command-line interfaces
*easily*:

.. code:: python

    """Naval Fate.

    Usage:
      naval_fate.py ship new <name>...
      naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
      naval_fate.py ship shoot <x> <y>
      naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
      naval_fate.py (-h | --help)
      naval_fate.py --version

    Options:
      -h --help     Show this screen.
      --version     Show version.
      --speed=<kn>  Speed in knots [default: 10].
      --moored      Moored (anchored) mine.
      --drifting    Drifting mine.

    """
    from docopt import docopt


    if __name__ == '__main__':
        arguments = docopt(__doc__, version='Naval Fate 2.0')
        print(arguments)

Beat that! The option parser is generated based on the docstring above
that is passed to ``docopt`` function.  ``docopt`` parses the usage
pattern (``"Usage: ..."``) and option descriptions (lines starting
with dash "``-``") and ensures that the program invocation matches the
usage pattern; it parses options, arguments and commands based on
that. The basic idea is that *a good help message has all necessary
information in it to make a parser*.

Also, `PEP 257 <http://www.python.org/dev/peps/pep-0257/>`_ recommends
putting help message in the module docstrings.

Installation
======================================================================

Use `pip <http://pip-installer.org>`_ or easy_install::

    pip install docopt==0.6.2

Alternatively, you can just drop ``docopt.py`` file into your
project--it is self-contained.

**docopt** is tested with Python 2.5, 2.6, 2.7, 3.2, 3.3 and PyPy.

API
======================================================================

.. code:: python

    from docopt import docopt

.. code:: python

    docopt(doc, argv=None, help=True, version=None, options_first=False)

``docopt`` takes 1 required and 4 optional arguments:

- ``doc`` could be a module docstring (``__doc__``) or some other
  string that contains a **help message** that will be parsed to
  create the option parser.  The simple rules of how to write such a
  help message are given in next sections.  Here is a quick example of
  such a string:

.. code:: python

    """Usage: my_program.py [-hso FILE] [--quiet | --verbose] [INPUT ...]

    -h --help    show this
    -s --sorted  sorted output
    -o FILE      specify output file [default: ./test.txt]
    --quiet      print less text
    --verbose    print more text

    """

- ``argv`` is an optional argument vector; by default ``docopt`` uses
  the argument vector passed to your program (``sys.argv[1:]``).
  Alternatively you can supply a list of strings like ``['--verbose',
  '-o', 'hai.txt']``.

- ``help``, by default ``True``, specifies whether the parser should
  automatically print the help message (supplied as ``doc``) and
  terminate, in case ``-h`` or ``--help`` option is encountered
  (options should exist in usage pattern, more on that below). If you
  want to handle ``-h`` or ``--help`` options manually (as other
  options), set ``help=False``.

- ``version``, by default ``None``, is an optional argument that
  specifies the version of your program. If supplied, then, (assuming
  ``--version`` option is mentioned in usage pattern) when parser
  encounters the ``--version`` option, it will print the supplied
  version and terminate.  ``version`` could be any printable object,
  but most likely a string, e.g. ``"2.1.0rc1"``.

    Note, when ``docopt`` is set to automatically handle ``-h``,
    ``--help`` and ``--version`` options, you still need to mention
    them in usage pattern for this to work. Also, for your users to
    know about them.

- ``options_first``, by default ``False``.  If set to ``True`` will
  disallow mixing options and positional argument.  I.e. after first
  positional argument, all arguments will be interpreted as positional
  even if the look like options.  This can be used for strict
  compatibility with POSIX, or if you want to dispatch your arguments
  to other programs.

The **return** value is a simple dictionary with options, arguments
and commands as keys, spelled exactly like in your help message.  Long
versions of options are given priority. For example, if you invoke the
top example as::

    naval_fate.py ship Guardian move 100 150 --speed=15

the return dictionary will be:

.. code:: python

    {'--drifting': False,    'mine': False,
     '--help': False,        'move': True,
     '--moored': False,      'new': False,
     '--speed': '15',        'remove': False,
     '--version': False,     'set': False,
     '<name>': ['Guardian'], 'ship': True,
     '<x>': '100',           'shoot': False,
     '<y>': '150'}

Help message format
======================================================================

Help message consists of 2 parts:

- Usage pattern, e.g.::

    Usage: my_program.py [-hso FILE] [--quiet | --verbose] [INPUT ...]

- Option descriptions, e.g.::

    -h --help    show this
    -s --sorted  sorted output
    -o FILE      specify output file [default: ./test.txt]
    --quiet      print less text
    --verbose    print more text

Their format is described below; other text is ignored.

Usage pattern format
----------------------------------------------------------------------

**Usage pattern** is a substring of ``doc`` that starts with
``usage:`` (case *insensitive*) and ends with a *visibly* empty line.
Minimum example:

.. code:: python

    """Usage: my_program.py

    """

The first word after ``usage:`` is interpreted as your program's name.
You can specify your program's name several times to signify several
exclusive patterns:

.. code:: python

    """Usage: my_program.py FILE
              my_program.py COUNT FILE

    """

Each pattern can consist of the following elements:

- **<arguments>**, **ARGUMENTS**. Arguments are specified as either
  upper-case words, e.g. ``my_program.py CONTENT-PATH`` or words
  surrounded by angular brackets: ``my_program.py <content-path>``.
- **--options**.  Options are words started with dash (``-``), e.g.
  ``--output``, ``-o``.  You can "stack" several of one-letter
  options, e.g. ``-oiv`` which will be the same as ``-o -i -v``. The
  options can have arguments, e.g.  ``--input=FILE`` or ``-i FILE`` or
  even ``-iFILE``. However it is important that you specify option
  descriptions if you want for option to have an argument, a default
  value, or specify synonymous short/long versions of option (see next
  section on option descriptions).
- **commands** are words that do *not* follow the described above
  conventions of ``--options`` or ``<arguments>`` or ``ARGUMENTS``,
  plus two special commands: dash "``-``" and double dash "``--``"
  (see below).

Use the following constructs to specify patterns:

- **[ ]** (brackets) **optional** elements.  e.g.: ``my_program.py
  [-hvqo FILE]``
- **( )** (parens) **required** elements.  All elements that are *not*
  put in **[ ]** are also required, e.g.: ``my_program.py
  --path=<path> <file>...`` is the same as ``my_program.py
  (--path=<path> <file>...)``.  (Note, "required options" might be not
  a good idea for your users).
- **|** (pipe) **mutualy exclusive** elements. Group them using **(
  )** if one of the mutually exclusive elements is required:
  ``my_program.py (--clockwise | --counter-clockwise) TIME``. Group
  them using **[ ]** if none of the mutually-exclusive elements are
  required: ``my_program.py [--left | --right]``.
- **...** (ellipsis) **one or more** elements. To specify that
  arbitrary number of repeating elements could be accepted, use
  ellipsis (``...``), e.g.  ``my_program.py FILE ...`` means one or
  more ``FILE``-s are accepted.  If you want to accept zero or more
  elements, use brackets, e.g.: ``my_program.py [FILE ...]``. Ellipsis
  works as a unary operator on the expression to the left.
- **[options]** (case sensitive) shortcut for any options.  You can
  use it if you want to specify that the usage pattern could be
  provided with any options defined below in the option-descriptions
  and do not want to enumerate them all in usage-pattern.  -
  "``[--]``". Double dash "``--``" is used by convention to separate
  positional arguments that can be mistaken for options. In order to
  support this convention add "``[--]``" to you usage patterns.  -
  "``[-]``". Single dash "``-``" is used by convention to signify that
  ``stdin`` is used instead of a file. To support this add "``[-]``"
  to you usage patterns. "``-``" act as a normal command.

If your pattern allows to match argument-less option (a flag) several
times::

    Usage: my_program.py [-v | -vv | -vvv]

then number of occurences of the option will be counted. I.e.
``args['-v']`` will be ``2`` if program was invoked as ``my_program
-vv``. Same works for commands.

If your usage patterns allows to match same-named option with argument
or positional argument several times, the matched arguments will be
collected into a list::

    Usage: my_program.py <file> <file> --path=<path>...

I.e. invoked with ``my_program.py file1 file2 --path=./here
--path=./there`` the returned dict will contain ``args['<file>'] ==
['file1', 'file2']`` and ``args['--path'] == ['./here', './there']``.


Option descriptions format
----------------------------------------------------------------------

**Option descriptions** consist of a list of options that you put
below your usage patterns.

It is necessary to list option descriptions in order to specify:

- synonymous short and long options,
- if an option has an argument,
- if option's argument has a default value.

The rules are as follows:

- Every line in ``doc`` that starts with ``-`` or ``--`` (not counting
  spaces) is treated as an option description, e.g.::

    Options:
      --verbose   # GOOD
      -o FILE     # GOOD
    Other: --bad  # BAD, line does not start with dash "-"

- To specify that option has an argument, put a word describing that
  argument after space (or equals "``=``" sign) as shown below. Follow
  either <angular-brackets> or UPPER-CASE convention for options'
  arguments.  You can use comma if you want to separate options. In
  the example below, both lines are valid, however you are recommended
  to stick to a single style.::

    -o FILE --output=FILE       # without comma, with "=" sign
    -i <file>, --input <file>   # with comma, wihtout "=" sing

- Use two spaces to separate options with their informal description::

    --verbose More text.   # BAD, will be treated as if verbose option had
                           # an argument "More", so use 2 spaces instead
    -q        Quit.        # GOOD
    -o FILE   Output file. # GOOD
    --stdout  Use stdout.  # GOOD, 2 spaces

- If you want to set a default value for an option with an argument,
  put it into the option-description, in form ``[default:
  <my-default-value>]``::

    --coefficient=K  The K coefficient [default: 2.95]
    --output=FILE    Output file [default: test.txt]
    --directory=DIR  Some directory [default: ./]

- If the option is not repeatable, the value inside ``[default: ...]``
  will be interpeted as string.  If it *is* repeatable, it will be
  splited into a list on whitespace::

    Usage: my_program.py [--repeatable=<arg> --repeatable=<arg>]
                         [--another-repeatable=<arg>]...
                         [--not-repeatable=<arg>]

    # will be ['./here', './there']
    --repeatable=<arg>          [default: ./here ./there]

    # will be ['./here']
    --another-repeatable=<arg>  [default: ./here]

    # will be './here ./there', because it is not repeatable
    --not-repeatable=<arg>      [default: ./here ./there]

Examples
----------------------------------------------------------------------

We have an extensive list of `examples
<https://github.com/docopt/docopt/tree/master/examples>`_ which cover
every aspect of functionality of **docopt**.  Try them out, read the
source if in doubt.

Subparsers, multi-level help and *huge* applications (like git)
----------------------------------------------------------------------

If you want to split your usage-pattern into several, implement
multi-level help (whith separate help-screen for each subcommand),
want to interface with existing scripts that don't use **docopt**, or
you're building the next "git", you will need the new ``options_first``
parameter (described in API section above). To get you started quickly
we implemented a subset of git command-line interface as an example:
`examples/git
<https://github.com/docopt/docopt/tree/master/examples/git>`_


Data validation
----------------------------------------------------------------------

**docopt** does one thing and does it well: it implements your
command-line interface.  However it does not validate the input data.
On the other hand there are libraries like `python schema
<https://github.com/halst/schema>`_ which make validating data a
breeze.  Take a look at `validation_example.py
<https://github.com/docopt/docopt/tree/master/examples/validation_example.py>`_
which uses **schema** to validate data and report an error to the
user.

Development
======================================================================

We would *love* to hear what you think about **docopt** on our `issues
page <http://github.com/docopt/docopt/issues>`_

Make pull requrests, report bugs, suggest ideas and discuss
**docopt**. You can also drop a line directly to
<vladimir@keleshev.com>.

Porting ``docopt`` to other languages
======================================================================

We think **docopt** is so good, we want to share it beyond the Python
community!

The follosing ports are available:

- `Ruby port <http://github.com/docopt/docopt.rb>`_
- `CoffeeScript port <http://github.com/docopt/docopt.coffee>`_
- `Lua port <http://github.com/docopt/docopt.lua>`_
- `PHP port <http://github.com/docopt/docopt.php>`_

But you can always create a port for your favorite language!  You are
encouraged to use the Python version as a reference implementation.  A
Language-agnostic test suite is bundled with `Python implementation
<http://github.com/docopt/docopt>`_.

Porting discussion is on `issues page
<http://github.com/docopt/docopt/issues>`_.

Changelog
======================================================================

**docopt** follows `semantic versioning <http://semver.org>`_.  The
first release with stable API will be 1.0.0 (soon).  Until then, you
are encouraged to specify explicitly the version in your dependency
tools, e.g.::

    pip install docopt==0.6.2

- 0.6.2 `Wheel <http://pythonwheels.com/>`_ support.
- 0.6.1 Bugfix release.
- 0.6.0 ``options_first`` parameter.
  **Breaking changes**: Corrected ``[options]`` meaning.
  ``argv`` defaults to ``None``.
- 0.5.0 Repeated options/commands are counted or accumulated into a
  list.
- 0.4.2 Bugfix release.
- 0.4.0 Option descriptions become optional,
  support for "``--``" and "``-``" commands.
- 0.3.0 Support for (sub)commands like `git remote add`.
  Introduce ``[options]`` shortcut for any options.
  **Breaking changes**: ``docopt`` returns dictionary.
- 0.2.0 Usage pattern matching. Positional arguments parsing based on
  usage patterns.
  **Breaking changes**: ``docopt`` returns namespace (for arguments),
  not list. Usage pattern is formalized.
- 0.1.0 Initial release. Options-parsing only (based on options
  description).
PK�(�\'�0��	�	doc/alt-python37-pip/README.rstnu�[���pip - 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/
PK�(�\���;;+doc/alt-python37-importlib_metadata/LICENSEnu�[���Copyright 2017-2019 Jason R. Coombs, Barry Warsaw

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.
PK�(�\>]q)�>�>/doc/alt-python37-importlib_metadata/CHANGES.rstnu�[���v4.6.0
======

* #326: Performance tests now rely on
  `pytest-perf <https://pypi.org/project/pytest-perf>`_.
  To disable these tests, which require network access
  and a git checkout, pass ``-p no:perf`` to pytest.

v4.5.0
======

* #319: Remove ``SelectableGroups`` deprecation exception
  for flake8.

v4.4.0
======

* #300: Restore compatibility in the result from
  ``Distribution.entry_points`` (``EntryPoints``) to honor
  expectations in older implementations and issuing
  deprecation warnings for these cases:

  - ``EntryPoints`` objects are once again mutable, allowing
    for ``sort()`` and other list-based mutation operations.
    Avoid deprecation warnings by casting to a
    mutable sequence (e.g.
    ``list(dist.entry_points).sort()``).

  - ``EntryPoints`` results once again allow
    for access by index. To avoid deprecation warnings,
    cast the result to a Sequence first
    (e.g. ``tuple(dist.entry_points)[0]``).

v4.3.1
======

* #320: Fix issue where normalized name for eggs was
  incorrectly solicited, leading to metadata being
  unavailable for eggs.

v4.3.0
======

* #317: De-duplication of distributions no longer requires
  loading the full metadata for ``PathDistribution`` objects,
  entry point loading performance by ~10x.

v4.2.0
======

* Prefer f-strings to ``.format`` calls.

v4.1.0
======

* #312: Add support for metadata 2.2 (``Dynamic`` field).

* #315: Add ``SimplePath`` protocol for interface clarity
  in ``PathDistribution``.

v4.0.1
======

* #306: Clearer guidance about compatibility in readme.

v4.0.0
======

* #304: ``PackageMetadata`` as returned by ``metadata()``
  and ``Distribution.metadata()`` now provides normalized
  metadata honoring PEP 566:

  - If a long description is provided in the payload of the
    RFC 822 value, it can be retrieved as the ``Description``
    field.
  - Any multi-line values in the metadata will be returned as
    such.
  - For any multi-line values, line continuation characters
    are removed. This backward-incompatible change means
    that any projects relying on the RFC 822 line continuation
    characters being present must be tolerant to them having
    been removed.
  - Add a ``json`` property that provides the metadata
    converted to a JSON-compatible form per PEP 566.


v3.10.1
=======

* Minor tweaks from CPython.

v3.10.0
=======

* #295: Internal refactoring to unify section parsing logic.

v3.9.1
======

* #296: Exclude 'prepare' package.
* #297: Fix ValueError when entry points contains comments.

v3.9.0
======

* Use of Mapping (dict) interfaces on ``SelectableGroups``
  is now flagged as deprecated. Instead, users are advised
  to use the select interface for future compatibility.

  Suppress the warning with this filter:
  ``ignore:SelectableGroups dict interface``.

  Or with this invocation in the Python environment:
  ``warnings.filterwarnings('ignore', 'SelectableGroups dict interface')``.

  Preferably, switch to the ``select`` interface introduced
  in 3.7.0. See the
  `entry points documentation <https://importlib-metadata.readthedocs.io/en/latest/using.html#entry-points>`_ and changelog for the 3.6
  release below for more detail.

  For some use-cases, especially those that rely on
  ``importlib.metadata`` in Python 3.8 and 3.9 or
  those relying on older ``importlib_metadata`` (especially
  on Python 3.5 and earlier),
  `backports.entry_points_selectable <https://pypi.org/project/backports.entry_points_selectable>`_
  was created to ease the transition. Please have a look
  at that project if simply relying on importlib_metadata 3.6+
  is not straightforward. Background in #298.

* #283: Entry point parsing no longer relies on ConfigParser
  and instead uses a custom, one-pass parser to load the
  config, resulting in a ~20% performance improvement when
  loading entry points.

v3.8.2
======

* #293: Re-enabled lazy evaluation of path lookup through
  a FreezableDefaultDict.

v3.8.1
======

* #293: Workaround for error in distribution search.

v3.8.0
======

* #290: Add mtime-based caching for ``FastPath`` and its
  lookups, dramatically increasing performance for repeated
  distribution lookups.

v3.7.3
======

* Docs enhancements and cleanup following review in
  `GH-24782 <https://github.com/python/cpython/pull/24782>`_.

v3.7.2
======

* Cleaned up cruft in entry_points docstring.

v3.7.1
======

* Internal refactoring to facilitate ``entry_points() -> dict``
  deprecation.

v3.7.0
======

* #131: Added ``packages_distributions`` to conveniently
  resolve a top-level package or module to its distribution(s).

v3.6.0
======

* #284: Introduces new ``EntryPoints`` object, a tuple of
  ``EntryPoint`` objects but with convenience properties for
  selecting and inspecting the results:

  - ``.select()`` accepts ``group`` or ``name`` keyword
    parameters and returns a new ``EntryPoints`` tuple
    with only those that match the selection.
  - ``.groups`` property presents all of the group names.
  - ``.names`` property presents the names of the entry points.
  - Item access (e.g. ``eps[name]``) retrieves a single
    entry point by name.

  ``entry_points`` now accepts "selection parameters",
  same as ``EntryPoint.select()``.

  ``entry_points()`` now provides a future-compatible
  ``SelectableGroups`` object that supplies the above interface
  (except item access) but remains a dict for compatibility.

  In the future, ``entry_points()`` will return an
  ``EntryPoints`` object for all entry points.

  If passing selection parameters to ``entry_points``, the
  future behavior is invoked and an ``EntryPoints`` is the
  result.

* #284: Construction of entry points using
  ``dict([EntryPoint, ...])`` is now deprecated and raises
  an appropriate DeprecationWarning and will be removed in
  a future version.

* #300: ``Distribution.entry_points`` now presents as an
  ``EntryPoints`` object and access by index is no longer
  allowed. If access by index is required, cast to a sequence
  first.

v3.5.0
======

* #280: ``entry_points`` now only returns entry points for
  unique distributions (by name).

v3.4.0
======

* #10: Project now declares itself as being typed.
* #272: Additional performance enhancements to distribution
  discovery.
* #111: For PyPA projects, add test ensuring that
  ``MetadataPathFinder._search_paths`` honors the needed
  interface. Method is still private.

v3.3.0
======

* #265: ``EntryPoint`` objects now expose a ``.dist`` object
  referencing the ``Distribution`` when constructed from a
  Distribution.

v3.2.0
======

* The object returned by ``metadata()`` now has a
  formally-defined protocol called ``PackageMetadata``
  with declared support for the ``.get_all()`` method.
  Fixes #126.

v3.1.1
======

v2.1.1
======

* #261: Restored compatibility for package discovery for
  metadata without version in the name and for legacy
  eggs.

v3.1.0
======

* Merge with 2.1.0.

v2.1.0
======

* #253: When querying for package metadata, the lookup
  now honors
  `package normalization rules <https://packaging.python.org/specifications/recording-installed-packages/>`_.

v3.0.0
======

* Require Python 3.6 or later.

v2.0.0
======

* ``importlib_metadata`` no longer presents a
  ``__version__`` attribute. Consumers wishing to
  resolve the version of the package should query it
  directly with
  ``importlib_metadata.version('importlib-metadata')``.
  Closes #71.

v1.7.0
======

* ``PathNotFoundError`` now has a custom ``__str__``
  mentioning "package metadata" being missing to help
  guide users to the cause when the package is installed
  but no metadata is present. Closes #124.

v1.6.1
======

* Added ``Distribution._local()`` as a provisional
  demonstration of how to load metadata for a local
  package. Implicitly requires that
  `pep517 <https://pypi.org/project/pep517>`_ is
  installed. Ref #42.
* Ensure inputs to FastPath are Unicode. Closes #121.
* Tests now rely on ``importlib.resources.files`` (and
  backport) instead of the older ``path`` function.
* Support any iterable from ``find_distributions``.
  Closes #122.

v1.6.0
======

* Added ``module`` and ``attr`` attributes to ``EntryPoint``

v1.5.2
======

* Fix redundant entries from ``FastPath.zip_children``.
  Closes #117.

v1.5.1
======

* Improve reliability and consistency of compatibility
  imports for contextlib and pathlib when running tests.
  Closes #116.

v1.5.0
======

* Additional performance optimizations in FastPath now
  saves an additional 20% on a typical call.
* Correct for issue where PyOxidizer finder has no
  ``__module__`` attribute. Closes #110.

v1.4.0
======

* Through careful optimization, ``distribution()`` is
  3-4x faster. Thanks to Antony Lee for the
  contribution. Closes #95.

* When searching through ``sys.path``, if any error
  occurs attempting to list a path entry, that entry
  is skipped, making the system much more lenient
  to errors. Closes #94.

v1.3.0
======

* Improve custom finders documentation. Closes #105.

v1.2.0
======

* Once again, drop support for Python 3.4. Ref #104.

v1.1.3
======

* Restored support for Python 3.4 due to improper version
  compatibility declarations in the v1.1.0 and v1.1.1
  releases. Closes #104.

v1.1.2
======

* Repaired project metadata to correctly declare the
  ``python_requires`` directive. Closes #103.

v1.1.1
======

* Fixed ``repr(EntryPoint)`` on PyPy 3 also. Closes #102.

v1.1.0
======

* Dropped support for Python 3.4.
* EntryPoints are now pickleable. Closes #96.
* Fixed ``repr(EntryPoint)`` on PyPy 2. Closes #97.

v1.0.0
======

* Project adopts semver for versioning.

* Removed compatibility shim introduced in 0.23.

* For better compatibility with the stdlib implementation and to
  avoid the same distributions being discovered by the stdlib and
  backport implementations, the backport now disables the
  stdlib DistributionFinder during initialization (import time).
  Closes #91 and closes #100.

0.23
====

* Added a compatibility shim to prevent failures on beta releases
  of Python before the signature changed to accept the
  "context" parameter on find_distributions. This workaround
  will have a limited lifespan, not to extend beyond release of
  Python 3.8 final.

0.22
====

* Renamed ``package`` parameter to ``distribution_name``
  as `recommended <https://bugs.python.org/issue34632#msg349423>`_
  in the following functions: ``distribution``, ``metadata``,
  ``version``, ``files``, and ``requires``. This
  backward-incompatible change is expected to have little impact
  as these functions are assumed to be primarily used with
  positional parameters.

0.21
====

* ``importlib.metadata`` now exposes the ``DistributionFinder``
  metaclass and references it in the docs for extending the
  search algorithm.
* Add ``Distribution.at`` for constructing a Distribution object
  from a known metadata directory on the file system. Closes #80.
* Distribution finders now receive a context object that
  supplies ``.path`` and ``.name`` properties. This change
  introduces a fundamental backward incompatibility for
  any projects implementing a ``find_distributions`` method
  on a ``MetaPathFinder``. This new layer of abstraction
  allows this context to be supplied directly or constructed
  on demand and opens the opportunity for a
  ``find_distributions`` method to solicit additional
  context from the caller. Closes #85.

0.20
====

* Clarify in the docs that calls to ``.files`` could return
  ``None`` when the metadata is not present. Closes #69.
* Return all requirements and not just the first for dist-info
  packages. Closes #67.

0.19
====

* Restrain over-eager egg metadata resolution.
* Add support for entry points with colons in the name. Closes #75.

0.18
====

* Parse entry points case sensitively.  Closes #68
* Add a version constraint on the backport configparser package.  Closes #66

0.17
====

* Fix a permission problem in the tests on Windows.

0.16
====

* Don't crash if there exists an EGG-INFO directory on sys.path.

0.15
====

* Fix documentation.

0.14
====

* Removed ``local_distribution`` function from the API.
  **This backward-incompatible change removes this
  behavior summarily**. Projects should remove their
  reliance on this behavior. A replacement behavior is
  under review in the `pep517 project
  <https://github.com/pypa/pep517>`_. Closes #42.

0.13
====

* Update docstrings to match PEP 8. Closes #63.
* Merged modules into one module. Closes #62.

0.12
====

* Add support for eggs.  !65; Closes #19.

0.11
====

* Support generic zip files (not just wheels).  Closes #59
* Support zip files with multiple distributions in them.  Closes #60
* Fully expose the public API in ``importlib_metadata.__all__``.

0.10
====

* The ``Distribution`` ABC is now officially part of the public API.
  Closes #37.
* Fixed support for older single file egg-info formats.  Closes #43.
* Fixed a testing bug when ``$CWD`` has spaces in the path.  Closes #50.
* Add Python 3.8 to the ``tox`` testing matrix.

0.9
===

* Fixed issue where entry points without an attribute would raise an
  Exception.  Closes #40.
* Removed unused ``name`` parameter from ``entry_points()``. Closes #44.
* ``DistributionFinder`` classes must now be instantiated before
  being placed on ``sys.meta_path``.

0.8
===

* This library can now discover/enumerate all installed packages. **This
  backward-incompatible change alters the protocol finders must
  implement to support distribution package discovery.** Closes #24.
* The signature of ``find_distributions()`` on custom installer finders
  should now accept two parameters, ``name`` and ``path`` and
  these parameters must supply defaults.
* The ``entry_points()`` method no longer accepts a package name
  but instead returns all entry points in a dictionary keyed by the
  ``EntryPoint.group``. The ``resolve`` method has been removed. Instead,
  call ``EntryPoint.load()``, which has the same semantics as
  ``pkg_resources`` and ``entrypoints``.  **This is a backward incompatible
  change.**
* Metadata is now always returned as Unicode text regardless of
  Python version. Closes #29.
* This library can now discover metadata for a 'local' package (found
  in the current-working directory). Closes #27.
* Added ``files()`` function for resolving files from a distribution.
* Added a new ``requires()`` function, which returns the requirements
  for a package suitable for parsing by
  ``packaging.requirements.Requirement``. Closes #18.
* The top-level ``read_text()`` function has been removed.  Use
  ``PackagePath.read_text()`` on instances returned by the ``files()``
  function.  **This is a backward incompatible change.**
* Release dates are now automatically injected into the changelog
  based on SCM tags.

0.7
===

* Fixed issue where packages with dashes in their names would
  not be discovered. Closes #21.
* Distribution lookup is now case-insensitive. Closes #20.
* Wheel distributions can no longer be discovered by their module
  name. Like Path distributions, they must be indicated by their
  distribution package name.

0.6
===

* Removed ``importlib_metadata.distribution`` function. Now
  the public interface is primarily the utility functions exposed
  in ``importlib_metadata.__all__``. Closes #14.
* Added two new utility functions ``read_text`` and
  ``metadata``.

0.5
===

* Updated README and removed details about Distribution
  class, now considered private. Closes #15.
* Added test suite support for Python 3.4+.
* Fixed SyntaxErrors on Python 3.4 and 3.5. !12
* Fixed errors on Windows joining Path elements. !15

0.4
===

* Housekeeping.

0.3
===

* Added usage documentation.  Closes #8
* Add support for getting metadata from wheels on ``sys.path``.  Closes #9

0.2
===

* Added ``importlib_metadata.entry_points()``.  Closes #1
* Added ``importlib_metadata.resolve()``.  Closes #12
* Add support for Python 2.7.  Closes #4

0.1
===

* Initial release.


..
   Local Variables:
   mode: change-log-mode
   indent-tabs-mode: nil
   sentence-end-double-space: t
   fill-column: 78
   coding: utf-8
   End:
PK�(�\������.doc/alt-python37-importlib_metadata/README.rstnu�[���.. image:: https://img.shields.io/pypi/v/importlib_metadata.svg
   :target: `PyPI link`_

.. image:: https://img.shields.io/pypi/pyversions/importlib_metadata.svg
   :target: `PyPI link`_

.. _PyPI link: https://pypi.org/project/importlib_metadata

.. image:: https://github.com/python/importlib_metadata/workflows/tests/badge.svg
   :target: https://github.com/python/importlib_metadata/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://readthedocs.org/projects/importlib-metadata/badge/?version=latest
   :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest

.. image:: https://img.shields.io/badge/skeleton-2021-informational
   :target: https://blog.jaraco.com/skeleton


Library to access the metadata for a Python package.

This package supplies third-party access to the functionality of
`importlib.metadata <https://docs.python.org/3/library/importlib.metadata.html>`_
including improvements added to subsequent Python versions.


Compatibility
=============

New features are introduced in this third-party library and later merged
into CPython. The following table indicates which versions of this library
were contributed to different versions in the standard library:

.. list-table::
   :header-rows: 1

   * - importlib_metadata
     - stdlib
   * - 4.4
     - 3.10
   * - 1.4
     - 3.8


Usage
=====

See the `online documentation <https://importlib_metadata.readthedocs.io/>`_
for usage details.

`Finder authors
<https://docs.python.org/3/reference/import.html#finders-and-loaders>`_ can
also add support for custom package installers.  See the above documentation
for details.


Caveats
=======

This project primarily supports third-party packages installed by PyPA
tools (or other conforming packages). It does not support:

- Packages in the stdlib.
- Packages installed without metadata.

Project details
===============

 * Project home: https://github.com/python/importlib_metadata
 * Report bugs at: https://github.com/python/importlib_metadata/issues
 * Code hosting: https://github.com/python/importlib_metadata
 * Documentation: https://importlib_metadata.readthedocs.io/
PK�(�\�E�=U,U,"doc/alt-python37-multidict/LICENSEnu�[���                                 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 2016-2017 Andrew Svetlov

   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.
PK�(�\��$˖�%doc/alt-python37-multidict/README.rstnu�[���=========
multidict
=========

.. image:: https://github.com/aio-libs/multidict/workflows/CI/badge.svg
   :target: https://github.com/aio-libs/multidict/actions?query=workflow%3ACI
   :alt: GitHub status for master branch

.. image:: https://codecov.io/gh/aio-libs/multidict/branch/master/graph/badge.svg
   :target: https://codecov.io/gh/aio-libs/multidict
   :alt: Coverage metrics

.. image:: https://img.shields.io/pypi/v/multidict.svg
   :target: https://pypi.org/project/multidict
   :alt: PyPI

.. image:: https://readthedocs.org/projects/multidict/badge/?version=latest
   :target: http://multidict.readthedocs.org/en/latest/?badge=latest
   :alt: Documentationb

.. image:: https://img.shields.io/pypi/pyversions/multidict.svg
   :target: https://pypi.org/project/multidict
   :alt: Python versions

.. image:: https://badges.gitter.im/Join%20Chat.svg
   :target: https://gitter.im/aio-libs/Lobby
   :alt: Chat on Gitter

Multidict is dict-like collection of *key-value pairs* where key
might be occurred more than once in the container.

Introduction
------------

*HTTP Headers* and *URL query string* require specific data structure:
*multidict*. It behaves mostly like a regular ``dict`` but it may have
several *values* for the same *key* and *preserves insertion ordering*.

The *key* is ``str`` (or ``istr`` for case-insensitive dictionaries).

``multidict`` has four multidict classes:
``MultiDict``, ``MultiDictProxy``, ``CIMultiDict``
and ``CIMultiDictProxy``.

Immutable proxies (``MultiDictProxy`` and
``CIMultiDictProxy``) provide a dynamic view for the
proxied multidict, the view reflects underlying collection changes. They
implement the ``collections.abc.Mapping`` interface.

Regular mutable (``MultiDict`` and ``CIMultiDict``) classes
implement ``collections.abc.MutableMapping`` and allows to change
their own content.


*Case insensitive* (``CIMultiDict`` and
``CIMultiDictProxy``) ones assume the *keys* are case
insensitive, e.g.::

   >>> dct = CIMultiDict(key='val')
   >>> 'Key' in dct
   True
   >>> dct['Key']
   'val'

*Keys* should be ``str`` or ``istr`` instances.

The library has optional C Extensions for sake of speed.


License
-------

Apache 2

Library Installation
--------------------

.. code-block:: bash

   $ pip install multidict

The library is Python 3 only!

PyPI contains binary wheels for Linux, Windows and MacOS.  If you want to install
``multidict`` on another operation system (or *Alpine Linux* inside a Docker) the
Tarball will be used to compile the library from sources.  It requires C compiler and
Python headers installed.

To skip the compilation please use `MULTIDICT_NO_EXTENSIONS` environment variable,
e.g.:

.. code-block:: bash

   $ MULTIDICT_NO_EXTENSIONS=1 pip install multidict

Please note, Pure Python (uncompiled) version is about 20-50 times slower depending on
the usage scenario!!!



Changelog
---------
See `RTD page <http://multidict.readthedocs.org/en/latest/changes.html>`_.
PK�(�\�@yttdoc/alt-python37-raven/PKG-INFOnu�[���Metadata-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
PK�(�\Z{�^��doc/alt-python37-raven/LICENSEnu�[���Copyright (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.
PK�(�\��
�
!doc/alt-python37-raven/README.rstnu�[���.. 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`_.
PK�(�\-�5��(�('doc/alt-python37-simplejson/LICENSE.txtnu�[���simplejson is dual-licensed software. It is available under the terms
of the MIT license, or the Academic Free License version 2.1. The full
text of each license agreement is included below. This code is also
licensed to the Python Software Foundation (PSF) under a Contributor
Agreement.

MIT License
===========

Copyright (c) 2006 Bob Ippolito

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.

Academic Free License v. 2.1
============================

Copyright (c) 2006 Bob Ippolito.  All rights reserved.

This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work:

Licensed under the Academic Free License version 2.1

1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license to do the following:

a) to reproduce the Original Work in copies;

b) to prepare derivative works ("Derivative Works") based upon the Original Work;

c) to distribute copies of the Original Work and Derivative Works to the public;

d) to perform the Original Work publicly; and

e) to display the Original Work publicly.

2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, to make, use, sell and offer for sale the Original Work and Derivative Works.

3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor hereby agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work, and by publishing the address of that information repository in a notice immediately following the copyright notice that applies to the Original Work.

4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior written permission of the Licensor. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor except as expressly stated herein. No patent license is granted to make, use, sell or offer to sell embodiments of any patent claims other than the licensed claims defined in Section 2. No right is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any Original Work that Licensor otherwise would have a right to license.

5) This section intentionally omitted.

6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.

7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately proceeding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to Original Work is granted hereunder except under this disclaimer.

8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to any person for any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to liability for death or personal injury resulting from Licensor's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You.

9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. Nothing else but this License (or another written agreement between Licensor and You) grants You permission to create Derivative Works based upon the Original Work or to exercise any of the rights granted in Section 1 herein, and any attempt to do so except under the terms of this License (or another written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted to You in Section 1 herein, You indicate Your acceptance of this License and all of its terms and conditions.

10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.

11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et seq., the equivalent laws of other countries, and international treaty. This section shall survive the termination of this License.

12) Attorneys Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.

13) Miscellaneous. This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.

14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For 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.

15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.

This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner.
PK�(�\�s��&doc/alt-python37-simplejson/README.rstnu�[���simplejson
----------

.. image:: https://travis-ci.org/simplejson/simplejson.svg?branch=master
    :target: https://travis-ci.org/simplejson/simplejson

simplejson is a simple, fast, complete, correct and extensible
JSON <http://json.org> encoder and decoder for Python 2.5+
and Python 3.3+.  It is pure Python code with no dependencies,
but includes an optional C extension for a serious speed boost.

The latest documentation for simplejson can be read online here:
https://simplejson.readthedocs.io/

simplejson is the externally maintained development version of the
json library included with Python 2.6 and Python 3.0, but maintains
backwards compatibility with Python 2.5.

The encoder can be specialized to provide serialization in any kind of
situation, without any special support by the objects to be serialized
(somewhat like pickle). This is best done with the ``default`` kwarg
to dumps.

The decoder can handle incoming JSON strings of any specified encoding
(UTF-8 by default). It can also be specialized to post-process JSON
objects with the ``object_hook`` or ``object_pairs_hook`` kwargs. This
is particularly useful for implementing protocols such as JSON-RPC
that have a richer type system than JSON itself.

For those of you that have legacy systems to maintain, there is a
very old fork of simplejson in the `python2.2`_ branch that supports
Python 2.2. This is based off of a very old version of simplejson,
is not maintained, and should only be used as a last resort.

.. _python2.2: https://github.com/simplejson/simplejson/tree/python2.2
PK�(�\D��
R
R'doc/alt-python37-simplejson/CHANGES.txtnu�[���Version 3.12.0 released 2017-11-05

* Fix threaded import race condition
  https://github.com/simplejson/simplejson/issues/184
* Move RawJSON implementation to simplejson.raw_json module
* Move JSONDecodeError implementation to simplejson.errors module

Version 3.11.1 released 2017-06-19

* Fix issue with item_sort_key when speedups are available, and add
  auto-discovery to test suites to prevent similar regressions
  https://github.com/simplejson/simplejson/issues/173

Version 3.11.0 released 2017-06-18

* docstring fix in JSONEncoder
  https://github.com/simplejson/simplejson/pull/172
* Call PyObject_IsTrue() only once for the strict argument of scanner
  https://github.com/simplejson/simplejson/pull/170
* Fix a crash with unencodable encoding in the encoder
  https://github.com/simplejson/simplejson/pull/171
* Remove unused imports
  https://github.com/simplejson/simplejson/pull/162
* Remove remnants of Python 2.4 support
  https://github.com/simplejson/simplejson/pull/168
* Fix argument checking errors in _speedups.c
  https://github.com/simplejson/simplejson/pull/169
* Remove the `__init__` methods in extension classes
  https://github.com/simplejson/simplejson/pull/166
* Fix typo in the doc for loads
  https://github.com/simplejson/simplejson/issues/161
* Add Python 3.6 to testing matrix and PyPI metadata
  https://github.com/simplejson/simplejson/pull/153
  https://github.com/simplejson/simplejson/pull/152

Version 3.10.0 released 2016-10-28

* Add RawJSON class to allow a faster path for already encoded JSON.
  https://github.com/simplejson/simplejson/pull/143

Version 3.9.0 released 2016-10-21

* Workaround for bad behavior in string subclasses
  https://github.com/simplejson/simplejson/issues/144
* Fix warnings flagged by -3
  https://github.com/simplejson/simplejson/pull/146
* Update readthedocs documentation links
  https://github.com/simplejson/simplejson/pull/137
* Add build status badge to README
  https://github.com/simplejson/simplejson/pull/134

Version 3.8.2 released 2016-02-14

* Fix implicit cast compiler warning in _speedups.c
* simplejson is now available as wheels for OS X and Windows thanks to Travis-CI
  and AppVeyor respectively! Many thanks to @aebrahim for getting this party
  started.
  https://github.com/simplejson/simplejson/pull/130
  https://github.com/simplejson/simplejson/issues/122

Version 3.8.1 released 2015-10-27

* Fix issue with iterable_as_array and indent option
  https://github.com/simplejson/simplejson/issues/128
* Fix typo in keyword argument name introduced in 3.8.0
  https://github.com/simplejson/simplejson/pull/123

Version 3.8.0 released 2015-07-18

* New iterable_as_array encoder option to perform lazy serialization of
  any iterable objects, without having to convert to tuple or list.

Version 3.7.3 released 2015-05-31

* Fix typo introduced in 3.7.0 (behavior should be indistinguishable)
  https://github.com/simplejson/simplejson/commit/e18cc09b688ea1f3305c27616fd3cadd2adc6d31#commitcomment-11443842

Version 3.7.2 released 2015-05-22

* Do not cache Decimal class in encoder, only reference the decimal module.
  This may make reload work in more common scenarios.

Version 3.7.1 released 2015-05-18

* Fix compilation with MSVC
  https://github.com/simplejson/simplejson/pull/119

Version 3.7.0 released 2015-05-18

* simplejson no longer trusts custom str/repr methods for int, long, float
  subclasses. These instances are now formatted as if they were exact
  instances of those types.
  https://github.com/simplejson/simplejson/issues/118

Version 3.6.5 released 2014-10-24

* Importing bug fix for reference leak when an error occurs during
  dict encoding
  https://github.com/simplejson/simplejson/issues/109

Version 3.6.4 released 2014-09-29

* Important bug fix for dump when only sort_keys is set
  https://github.com/simplejson/simplejson/issues/106

Version 3.6.3 released 2014-08-18

* Documentation updates
  https://github.com/simplejson/simplejson/issues/103

Version 3.6.2 released 2014-08-09

* Documentation updates
  http://bugs.python.org/issue21514

Version 3.6.1 released 2014-08-09

* Documentation updates
  https://github.com/simplejson/simplejson/issues/102

Version 3.6.0 released 2014-07-21

* Automatically strip any UTF-8 BOM from input to more closely
  follow the latest specs
  https://github.com/simplejson/simplejson/pull/101

Version 3.5.3 released 2014-06-24

* Fix lower bound checking in scan_once / raw_decode API
  https://github.com/simplejson/simplejson/issues/98

Version 3.5.2 released 2014-05-22

* Fix Windows build with VS2008
  https://github.com/simplejson/simplejson/pull/97

Version 3.5.1 released 2014-05-21

* Consistently reject int_as_string_bitcount settings that are not
  positive integers

Version 3.5.0 released 2014-05-20

* Added int_as_string_bitcount encoder option
  https://github.com/simplejson/pull/96
* Fixed potential crash when encoder created with incorrect options

Version 3.4.1 released 2014-04-30

* Fixed tests to run on Python 3.4

Version 3.4.0 released 2014-04-02

* Native setuptools support re-introduced
  https://github.com/simplejson/simplejson/pull/92

Version 3.3.3 released 2014-02-14

* Improve test suite's Python 3.4 compatibility
  https://github.com/simplejson/simplejson/issues/87

Version 3.3.2 released 2014-01-06

* Docstring fix for decoded string types
  https://github.com/simplejson/simplejson/pull/82

Version 3.3.1 released 2013-10-05

* JSONDecodeError exceptions can now be pickled
  https://github.com/simplejson/simplejson/pull/78

Version 3.3.0 released 2013-05-07

* Unpaired surrogates once again pass through the decoder, to match older
  behavior and the RFC-4627 spec.
  https://github.com/simplejson/simplejson/issues/62

Version 3.2.0 released 2013-05-01

* New ignore_nan kwarg in encoder that serializes out
  of range floats (Infinity, -Infinity, NaN) as null for ECMA-262
  compliance.
  https://github.com/simplejson/simplejson/pull/63
* New for_json kwarg in encoder to make it possible to for
  subclasses of dict and list to be specialized.
  https://github.com/simplejson/simplejson/pull/69

Version 3.1.3 released 2013-04-06

* Updated documentation to discourage subclassing whenever possible.
   default, object_hook, and object_pairs_hook provide almost all of
   the functionality of subclassing.

Version 3.1.2 released 2013-03-20

* Updated documentation to reflect separators behavior when indent is
  not None
  https://github.com/simplejson/simplejson/issues/59
* Test suite should be compatible with debug builds of Python 2.x and 3.x
  https://github.com/simplejson/simplejson/pull/65

Version 3.1.1 released 2013-02-21

* setup.py now has another workaround for Windows machines without
  MSVC installed
  http://bugs.python.org/issue7511

Version 3.1.0 released 2013-02-21

* Updated JSON conformance test suite
  http://bugs.python.org/issue16559
* simplejson.tool tests and bugfix for Python 3.x
  http://bugs.python.org/issue16549
* Improve error messages for certain kinds of truncated input
  http://bugs.python.org/issue16009
* Moved JSONDecodeError to json.scanner (still available for import
  from json.decoder)
* Changed scanner to use JSONDecodeError directly rather than
  StopIteration to improve error messages

Version 3.0.9 released 2013-02-21

* Fix an off-by-one error in the colno property of JSONDecodeError
  (when lineno == 1)
  http://bugs.python.org/issue17225

Version 3.0.8 released 2013-02-19

* Fix a Python 2.x compiler warning for narrow unicode builds
  https://github.com/simplejson/simplejson/issues/56

Version 3.0.7 released 2013-01-11

* NOTE: this release only changes the license.
* simplejson is now dual-licensed software, MIT or AFL v2.1. It is
  also made explicit that this code is also licensed to the PSF under
  a Contributor Agreement.

Version 3.0.6 released 2013-01-11

* Fix for major Python 2.x ensure_ascii=False encoding regression
  introduced in simplejson 3.0.0. If you use this setting, please
  upgrade immediately.
  https://github.com/simplejson/simplejson/issues/50

Version 3.0.5 released 2013-01-03

* NOTE: this release only changes the tests, it is
  not essential to upgrade
* Tests now run with deprecation warnings printed
* Fixed Python 3 syntax error in simplejson.tool
  https://github.com/simplejson/simplejson/issues/49
* Fixed Python 3.3 deprecation warnings in test suite
  https://github.com/simplejson/simplejson/issues/48

Version 3.0.4 released 2013-01-02

* MSVC compatibility for Python 3.3
  https://github.com/simplejson/simplejson/pull/47

Version 3.0.3 released 2013-01-01

* Fixes for bugs introduced in 3.0.2
* Fixes for Python 2.5 compatibility
* MSVC compatibility for Python 2.x
  https://github.com/simplejson/simplejson/pull/46

Version 3.0.2 released 2013-01-01

* THIS VERSION HAS BEEN REMOVED
* Missed a changeset to _speedups.c in the 3.0.1 branch cut

Version 3.0.1 released 2013-01-01

* THIS VERSION HAS BEEN REMOVED
* Add accumulator optimization to encoder, equivalent to the usage of
  `_Py_Accu` in the Python 3.3 json library. Only relevant if encoding
  very large JSON documents.

Version 3.0.0 released 2012-12-30

* Python 3.3 is now supported, thanks to Vinay Sajip
  https://github.com/simplejson/simplejson/issues/8
* `sort_keys`/`item_sort_key` now sort on the stringified version of the
  key, rather than the original object. This ensures that the sort
  only compares string types and makes the behavior consistent between
  Python 2.x and Python 3.x.
* Like other number types, Decimal instances used as keys are now
  coerced to strings when use_decimal is True.

Version 2.6.2 released 2012-09-21

* JSONEncoderForHTML was not exported in the simplejson module
  https://github.com/simplejson/simplejson/issues/41

Version 2.6.1 released 2012-07-27

* raw_decode() now skips whitespace before the object
  https://github.com/simplejson/simplejson/pull/38

Version 2.6.0 released 2012-06-26

* Error messages changed to match proposal for Python 3.3.1
  http://bugs.python.org/issue5067

Version 2.5.2 released 2012-05-10

* Fix for regression introduced in 2.5.1
  https://github.com/simplejson/simplejson/issues/35

Version 2.5.1 released 2012-05-10

* Support for use_decimal=True in environments that use Python
  sub-interpreters such as uWSGI
  https://github.com/simplejson/simplejson/issues/34

Version 2.5.0 released 2012-03-29

* New item_sort_key option for encoder to allow fine grained control of sorted
  output

Version 2.4.0 released 2012-03-06

* New bigint_as_string option for encoder to trade JavaScript number precision
  issues for type issues.
  https://github.com/simplejson/simplejson/issues/31

Version 2.3.3 released 2012-02-27

* Allow unknown numerical types for indent parameter
  https://github.com/simplejson/simplejson/pull/29

Version 2.3.2 released 2011-12-30

* Fix crashing regression in speedups introduced in 2.3.1

Version 2.3.1 released 2011-12-29

* namedtuple_as_object now checks _asdict to ensure that it
  is callable.
  https://github.com/simplejson/simplejson/issues/26

Version 2.3.0 released 2011-12-05

* Any objects with _asdict() methods are now considered for
  namedtuple_as_object.
  https://github.com/simplejson/simplejson/pull/22

Version 2.2.1 released 2011-09-06

* Fix MANIFEST.in issue when building a sdist from a sdist.
  https://github.com/simplejson/simplejson/issues/16

Version 2.2.0 released 2011-09-04

* Remove setuptools requirement, reverted to pure distutils
* use_decimal default for encoding (dump, dumps, JSONEncoder) is now True
* tuple encoding as JSON objects can be turned off with new
  tuple_as_array=False option.
  https://github.com/simplejson/simplejson/pull/6
* namedtuple (or other tuple subclasses with _asdict methods) are now
  encoded as JSON objects rather than arrays by default. Can be disabled
  and treated as a tuple with the new namedtuple_as_object=False option.
  https://github.com/simplejson/simplejson/pull/6
* JSONDecodeError is now raised instead of ValueError when a document
  ends with an opening quote and the C speedups are in use.
  https://github.com/simplejson/simplejson/issues/15
* Updated documentation with information about JSONDecodeError
* Force unicode linebreak characters to be escaped (U+2028 and U+2029)
  http://timelessrepo.com/json-isnt-a-javascript-subset
* Moved documentation from a git submodule to
  https://simplejson.readthedocs.io/

Version 2.1.6 released 2011-05-08

* Prevent segfaults with deeply nested JSON documents
  https://github.com/simplejson/simplejson/issues/11
* Fix compatibility with Python 2.5
  https://github.com/simplejson/simplejson/issues/5

Version 2.1.5 released 2011-04-17

* Built sdist tarball with setuptools_git installed. Argh.

Version 2.1.4 released 2011-04-17

* Does not try to build the extension when using PyPy
* Trailing whitespace after commas no longer emitted when indent is used
* Migrated to github http://github.com/simplejson/simplejson

Version 2.1.3 released 2011-01-17

* Support the sort_keys option in C encoding speedups
  http://code.google.com/p/simplejson/issues/detail?id=86
* Allow use_decimal to work with dump()
  http://code.google.com/p/simplejson/issues/detail?id=87

Version 2.1.2 released 2010-11-01

* Correct wrong end when object_pairs_hook is used
  http://code.google.com/p/simplejson/issues/detail?id=85
* Correct output for indent=0
  http://bugs.python.org/issue10019
* Correctly raise TypeError when non-string keys are used with speedups
  http://code.google.com/p/simplejson/issues/detail?id=82
* Fix the endlineno, endcolno attributes of the JSONDecodeError exception.
  http://code.google.com/p/simplejson/issues/detail?id=81

Version 2.1.1 released 2010-03-31

* Change how setup.py imports ez_setup.py to try and workaround old versions
  of setuptools.
  http://code.google.com/p/simplejson/issues/detail?id=75
* Fix compilation on Windows platform (and other platforms with very
  picky compilers)
* Corrected simplejson.__version__ and other minor doc changes.
* Do not fail speedups tests if speedups could not be built.
  http://code.google.com/p/simplejson/issues/detail?id=73

Version 2.1.0 released 2010-03-10

* Decimal serialization officially supported for encoding with
  use_decimal=True. For encoding this encodes Decimal objects and
  for decoding it implies parse_float=Decimal
* Python 2.4 no longer supported (may still work, but no longer tested)
* Decoding performance and memory utilization enhancements
  http://bugs.python.org/issue7451
* JSONEncoderForHTML class for escaping &, <, >
  http://code.google.com/p/simplejson/issues/detail?id=66
* Memoization of object keys during encoding (when using speedups)
* Encoder changed to use PyIter_Next for list iteration to avoid
  potential threading issues
* Encoder changed to use iteritems rather than PyDict_Next in order to
  support dict subclasses that have a well defined ordering
  http://bugs.python.org/issue6105
* indent encoding parameter changed to be a string rather than an integer
  (integer use still supported for backwards compatibility)
  http://code.google.com/p/simplejson/issues/detail?id=56
* Test suite (python setup.py test) now automatically runs with and without
  speedups
  http://code.google.com/p/simplejson/issues/detail?id=55
* Fixed support for older versions of easy_install (e.g. stock Mac OS X config)
  http://code.google.com/p/simplejson/issues/detail?id=54
* Fixed str/unicode mismatches when using ensure_ascii=False
  http://code.google.com/p/simplejson/issues/detail?id=48
* Fixed error message when parsing an array with trailing comma with speedups
  http://code.google.com/p/simplejson/issues/detail?id=46
* Refactor decoder errors to raise JSONDecodeError instead of ValueError
  http://code.google.com/p/simplejson/issues/detail?id=45
* New ordered_pairs_hook feature in decoder which makes it possible to
  preserve key order. http://bugs.python.org/issue5381
* Fixed containerless unicode float decoding (same bug as 2.0.4, oops!)
  http://code.google.com/p/simplejson/issues/detail?id=43
* Share PosInf definition between encoder and decoder
* Minor reformatting to make it easier to backport simplejson changes
  to Python 2.7/3.1 json module

Version 2.0.9 released 2009-02-18

* Adds cyclic GC to the Encoder and Scanner speedups, which could've
  caused uncollectible cycles in some cases when using custom parser
  or encoder functions

Version 2.0.8 released 2009-02-15

* Documentation fixes
* Fixes encoding True and False as keys
* Fixes checking for True and False by identity for several parameters

Version 2.0.7 released 2009-01-04

* Documentation fixes
* C extension now always returns unicode strings when the input string is
  unicode, even for empty strings

Version 2.0.6 released 2008-12-19

* Windows build fixes

Version 2.0.5 released 2008-11-23

* Fixes a segfault in the C extension when using check_circular=False and
  encoding an invalid document

Version 2.0.4 released 2008-10-24

* Fixes a parsing error in the C extension when the JSON document is (only)
  a floating point number. It would consume one too few characters in that
  case, and claim the document invalid.

Version 2.0.3 released 2008-10-11

* Fixes reference leaks in the encoding speedups (sorry about that!)
* Fixes doctest suite for Python 2.6
* More optimizations for the decoder

Version 2.0.2 released 2008-10-06

* Fixes MSVC2003 build regression
* Fixes Python 2.4 compatibility in _speedups.c

Version 2.0.1 released 2008-09-29

* Fixes long encoding regression introduced in 2.0.0
* Fixes MinGW build regression introduced in 2.0.0

Version 2.0.0 released 2008-09-27

* optimized Python encoding path
* optimized Python decoding path
* optimized C encoding path
* optimized C decoding path
* switched to sphinx docs (nearly the same as the json module in python 2.6)

Version 1.9.3 released 2008-09-23

* Decoding is significantly faster (for our internal benchmarks)
* Pretty-printing tool changed from simplejson to simplejson.tool for better
  Python 2.6 comaptibility
* Misc. bug fixes

Version 1.9 released 2008-05-03

* Rewrote test suite with unittest and doctest (no more nosetest dependency)
* Better PEP 7 and PEP 8 source compliance
* Removed simplejson.jsonfilter demo module
* simplejson.jsonfilter is no longer included

Version 1.8.1 released 2008-03-24

* Optional C extension for accelerating the decoding of JSON strings
* Command line interface for pretty-printing JSON (via python -msimplejson)
* Decoding of integers and floats is now extensible (e.g. to use Decimal) via
  parse_int, parse_float options.
* Subversion and issue tracker moved to google code:
  http://code.google.com/p/simplejson/
* "/" is no longer escaped, so if you're embedding JSON directly in HTML
  you'll want to use .replace("/", "\\/") to prevent a close-tag attack.

Version 1.7 released 2007-03-18

* Improves encoding performance with an optional C extension to speed up
  str/unicode encoding (by 10-150x or so), which yields an overall speed
  boost of 2x+ (JSON is string-heavy).
* Support for encoding unicode code points outside the BMP to UTF-16
  surrogate code pairs (specified by the Strings section of RFC 4627).

Version 1.6 released 2007-03-03

* Improved str support for encoding. Previous versions of simplejson
  integrated strings directly into the output stream, this version ensures
  they're of a particular encoding (default is UTF-8) so that the output
  stream is valid.

Version 1.5 released 2007-01-18

* Better Python 2.5 compatibility
* Better Windows compatibility
* indent encoding parameter for pretty printing
* separators encoding parameter for generating optimally compact JSON

Version 1.3 released 2006-04-01

* The optional object_hook function is called upon decoding of any JSON
  object literal, and its return value is used instead of the dict that
  would normally be used. This can be used to efficiently implement
  features such as JSON-RPC class hinting, or other custom decodings of
  JSON. See the documentation for more information.

Version 1.1 released 2005-12-31

* Renamed from simple_json to simplejson to comply with PEP 8 module naming
  guidelines
* Full set of documentation
* More tests
* The encoder and decoder have been extended to understand NaN, Infinity, and
  -Infinity (but this can be turned off via allow_nan=False for strict JSON
  compliance)
* The decoder's scanner has been fixed so that it no longer accepts invalid
  JSON documents
* The decoder now reports line and column information as well as character
  numbers for easier debugging
* The encoder now has a circular reference checker, which can be optionally
  disabled with check_circular=False
* dump, dumps, load, loads now accept an optional cls kwarg to use an
  alternate JSONEncoder or JSONDecoder class for convenience.
* The read/write compatibility shim for json-py now have deprecation warnings

Version 1.0 released 2005-12-25

 * Initial release
PK�(�\�/�(__"doc/alt-python37-unshare/README.mdnu�[���# unshare

[![PyPI](https://img.shields.io/pypi/v/unshare.svg?color=green&logo=unshare&style=plastic)](https://pypi.org/project/unshare/)


```bash
pip3 install unshare
```

<hr>

Python extension for C's unshare call. <br>
See [man 2 unshare](http://man7.org/linux/man-pages/man2/unshare.2.html).


**Note**: This is targeted for only Linux based platforms.


# Usage

`unshare(flags)` where supported flags are `CLONE_NEWNS`, `CLONE_NEWUTS`, `CLONE_NEWPID`, `CLONE_NEWUSER`, `CLONE_NEWIPC`, `CLONE_NEWNET`, `CLONE_THREAD`. <br>
Multiple flags can be used using the bitwise or operator.

# Example usage

```python3
import unshare
unshare.unshare(unshare.CLONE_NEWUTS)
```

The following screenshot is taken from a sample script which uses the unshare library.

![](https://i.imgur.com/B8X0LT8.png)


# License

This project is licensed under [GPLv3](./LICENSE).PK�(�\�y��|�|$doc/alt-python37-pyrsistent/PKG-INFOnu�[���Metadata-Version: 1.1
Name: pyrsistent
Version: 0.14.11
Summary: Persistent/Functional/Immutable data structures
Home-page: http://github.com/tobgu/pyrsistent/
Author: Tobias Gustafsson
Author-email: tobias.l.gustafsson@gmail.com
License: MIT
Description: Pyrsistent
        ==========
        .. image:: https://travis-ci.org/tobgu/pyrsistent.png?branch=master
            :target: https://travis-ci.org/tobgu/pyrsistent
        
        .. image:: https://badge.fury.io/py/pyrsistent.svg
            :target: https://badge.fury.io/py/pyrsistent
        
        .. image:: https://coveralls.io/repos/tobgu/pyrsistent/badge.svg?branch=master&service=github
            :target: https://coveralls.io/github/tobgu/pyrsistent?branch=master
        
        
        .. _Pyrthon: https://www.github.com/tobgu/pyrthon/
        
        Pyrsistent is a number of persistent collections (by some referred to as functional data structures). Persistent in 
        the sense that they are immutable.
        
        All methods on a data structure that would normally mutate it instead return a new copy of the structure containing the
        requested updates. The original structure is left untouched.
        
        This will simplify the reasoning about what a program does since no hidden side effects ever can take place to these
        data structures. You can rest assured that the object you hold a reference to will remain the same throughout its
        lifetime and need not worry that somewhere five stack levels below you in the darkest corner of your application
        someone has decided to remove that element that you expected to be there.
        
        Pyrsistent is influenced by persistent data structures such as those found in the standard library of Clojure. The
        data structures are designed to share common elements through path copying.
        It aims at taking these concepts and make them as pythonic as possible so that they can be easily integrated into any python
        program without hassle.
        
        If you want to go all in on persistent data structures and use literal syntax to define them in your code rather
        than function calls check out Pyrthon_.
        
        Examples
        --------
        .. _Sequence: collections_
        .. _Hashable: collections_
        .. _Mapping: collections_
        .. _Mappings: collections_
        .. _Set: collections_
        .. _collections: https://docs.python.org/3/library/collections.abc.html
        .. _documentation: http://pyrsistent.readthedocs.org/
        
        The collection types and key features currently implemented are:
        
        * PVector_, similar to a python list
        * PMap_, similar to dict
        * PSet_, similar to set
        * PRecord_, a PMap on steroids with fixed fields, optional type and invariant checking and much more
        * PClass_, a Python class fixed fields, optional type and invariant checking and much more
        * `Checked collections`_, PVector, PMap and PSet with optional type and invariance checks and more
        * PBag, similar to collections.Counter
        * PList, a classic singly linked list
        * PDeque, similar to collections.deque
        * Immutable object type (immutable) built on the named tuple
        * freeze_ and thaw_ functions to convert between pythons standard collections and pyrsistent collections.
        * Flexible transformations_ of arbitrarily complex structures built from PMaps and PVectors.
        
        Below are examples of common usage patterns for some of the structures and features. More information and
        full documentation for all data structures is available in the documentation_.
        
        .. _PVector:
        
        PVector
        ~~~~~~~
        With full support for the Sequence_ protocol PVector is meant as a drop in replacement to the built in list from a readers
        point of view. Write operations of course differ since no in place mutation is done but naming should be in line
        with corresponding operations on the built in list.
        
        Support for the Hashable_ protocol also means that it can be used as key in Mappings_.
        
        Appends are amortized O(1). Random access and insert is log32(n) where n is the size of the vector.
        
        .. code:: python
        
            >>> from pyrsistent import v, pvector
        
            # No mutation of vectors once created, instead they
            # are "evolved" leaving the original untouched
            >>> v1 = v(1, 2, 3)
            >>> v2 = v1.append(4)
            >>> v3 = v2.set(1, 5)
            >>> v1
            pvector([1, 2, 3])
            >>> v2
            pvector([1, 2, 3, 4])
            >>> v3
            pvector([1, 5, 3, 4])
        
            # Random access and slicing
            >>> v3[1]
            5
            >>> v3[1:3]
            pvector([5, 3])
        
            # Iteration
            >>> list(x + 1 for x in v3)
            [2, 6, 4, 5]
            >>> pvector(2 * x for x in range(3))
            pvector([0, 2, 4])
        
        .. _PMap:
        
        PMap
        ~~~~
        With full support for the Mapping_ protocol PMap is meant as a drop in replacement to the built in dict from a readers point
        of view. Support for the Hashable_ protocol also means that it can be used as key in other Mappings_.
        
        Random access and insert is log32(n) where n is the size of the map.
        
        .. code:: python
        
            >>> from pyrsistent import m, pmap, v
        
            # No mutation of maps once created, instead they are
            # "evolved" leaving the original untouched
            >>> m1 = m(a=1, b=2)
            >>> m2 = m1.set('c', 3)
            >>> m3 = m2.set('a', 5)
            >>> m1
            pmap({'a': 1, 'b': 2})
            >>> m2
            pmap({'a': 1, 'c': 3, 'b': 2})
            >>> m3
            pmap({'a': 5, 'c': 3, 'b': 2})
            >>> m3['a']
            5
        
            # Evolution of nested persistent structures
            >>> m4 = m(a=5, b=6, c=v(1, 2))
            >>> m4.transform(('c', 1), 17)
            pmap({'a': 5, 'c': pvector([1, 17]), 'b': 6})
            >>> m5 = m(a=1, b=2)
        
            # Evolve by merging with other mappings
            >>> m5.update(m(a=2, c=3), {'a': 17, 'd': 35})
            pmap({'a': 17, 'c': 3, 'b': 2, 'd': 35})
            >>> pmap({'x': 1, 'y': 2}) + pmap({'y': 3, 'z': 4})
            pmap({'y': 3, 'x': 1, 'z': 4})
        
            # Dict-like methods to convert to list and iterate
            >>> m3.items()
            pvector([('a', 5), ('c', 3), ('b', 2)])
            >>> list(m3)
            ['a', 'c', 'b']
        
        .. _PSet:
        
        PSet
        ~~~~
        With full support for the Set_ protocol PSet is meant as a drop in replacement to the built in set from a readers point
        of view. Support for the Hashable_ protocol also means that it can be used as key in Mappings_.
        
        Random access and insert is log32(n) where n is the size of the set.
        
        .. code:: python
        
            >>> from pyrsistent import s
        
            # No mutation of sets once created, you know the story...
            >>> s1 = s(1, 2, 3, 2)
            >>> s2 = s1.add(4)
            >>> s3 = s1.remove(1)
            >>> s1
            pset([1, 2, 3])
            >>> s2
            pset([1, 2, 3, 4])
            >>> s3
            pset([2, 3])
        
            # Full support for set operations
            >>> s1 | s(3, 4, 5)
            pset([1, 2, 3, 4, 5])
            >>> s1 & s(3, 4, 5)
            pset([3])
            >>> s1 < s2
            True
            >>> s1 < s(3, 4, 5)
            False
        
        .. _PRecord:
        
        PRecord
        ~~~~~~~
        A PRecord is a PMap with a fixed set of specified fields. Records are declared as python classes inheriting
        from PRecord. Because it is a PMap it has full support for all Mapping methods such as iteration and element
        access using subscript notation.
        
        .. code:: python
        
            >>> from pyrsistent import PRecord, field
            >>> class ARecord(PRecord):
            ...     x = field()
            ...
            >>> r = ARecord(x=3)
            >>> r
            ARecord(x=3)
            >>> r.x
            3
            >>> r.set(x=2)
            ARecord(x=2)
            >>> r.set(y=2)
            Traceback (most recent call last):
            AttributeError: 'y' is not among the specified fields for ARecord
        
        Type information
        ****************
        It is possible to add type information to the record to enforce type checks. Multiple allowed types can be specified
        by providing an iterable of types.
        
        .. code:: python
        
            >>> class BRecord(PRecord):
            ...     x = field(type=int)
            ...     y = field(type=(int, type(None)))
            ...
            >>> BRecord(x=3, y=None)
            BRecord(y=None, x=3)
            >>> BRecord(x=3.0)
            Traceback (most recent call last):
            PTypeError: Invalid type for field BRecord.x, was float
        
        
        Custom types (classes) that are iterable should be wrapped in a tuple to prevent their
        members being added to the set of valid types.  Although Enums in particular are now 
        supported without wrapping, see #83 for more information.
        
        Mandatory fields
        ****************
        Fields are not mandatory by default but can be specified as such. If fields are missing an
        *InvariantException* will be thrown which contains information about the missing fields.
        
        .. code:: python
        
            >>> from pyrsistent import InvariantException
            >>> class CRecord(PRecord):
            ...     x = field(mandatory=True)
            ...
            >>> r = CRecord(x=3)
            >>> try:
            ...    r.discard('x')
            ... except InvariantException as e:
            ...    print(e.missing_fields)
            ...
            ('CRecord.x',)
        
        Invariants
        **********
        It is possible to add invariants that must hold when evolving the record. Invariants can be
        specified on both field and record level. If invariants fail an *InvariantException* will be
        thrown which contains information about the failing invariants. An invariant function should
        return a tuple consisting of a boolean that tells if the invariant holds or not and an object
        describing the invariant. This object can later be used to identify which invariant that failed.
        
        The global invariant function is only executed if all field invariants hold.
        
        Global invariants are inherited to subclasses.
        
        .. code:: python
        
            >>> class RestrictedVector(PRecord):
            ...     __invariant__ = lambda r: (r.y >= r.x, 'x larger than y')
            ...     x = field(invariant=lambda x: (x > 0, 'x negative'))
            ...     y = field(invariant=lambda y: (y > 0, 'y negative'))
            ...
            >>> r = RestrictedVector(y=3, x=2)
            >>> try:
            ...    r.set(x=-1, y=-2)
            ... except InvariantException as e:
            ...    print(e.invariant_errors)
            ...
            ('y negative', 'x negative')
            >>> try:
            ...    r.set(x=2, y=1)
            ... except InvariantException as e:
            ...    print(e.invariant_errors)
            ...
            ('x larger than y',)
        
        Invariants may also contain multiple assertions. For those cases the invariant function should
        return a tuple of invariant tuples as described above. This structure is reflected in the
        invariant_errors attribute of the exception which will contain tuples with data from all failed
        invariants. Eg:
        
        .. code:: python
        
            >>> class EvenX(PRecord):
            ...     x = field(invariant=lambda x: ((x > 0, 'x negative'), (x % 2 == 0, 'x odd')))
            ...
            >>> try:
            ...    EvenX(x=-1)
            ... except InvariantException as e:
            ...    print(e.invariant_errors)
            ...
            (('x negative', 'x odd'),)
        
        
        Factories
        *********
        It's possible to specify factory functions for fields. The factory function receives whatever
        is supplied as field value and the actual returned by the factory is assigned to the field
        given that any type and invariant checks hold.
        PRecords have a default factory specified as a static function on the class, create(). It takes
        a *Mapping* as argument and returns an instance of the specific record.
        If a record has fields of type PRecord the create() method of that record will
        be called to create the "sub record" if no factory has explicitly been specified to override
        this behaviour.
        
        .. code:: python
        
            >>> class DRecord(PRecord):
            ...     x = field(factory=int)
            ...
            >>> class ERecord(PRecord):
            ...     d = field(type=DRecord)
            ...
            >>> ERecord.create({'d': {'x': '1'}})
            ERecord(d=DRecord(x=1))
        
        Collection fields
        *****************
        It is also possible to have fields with ``pyrsistent`` collections.
        
        .. code:: python
        
           >>> from pyrsistent import pset_field, pmap_field, pvector_field
           >>> class MultiRecord(PRecord):
           ...     set_of_ints = pset_field(int)
           ...     map_int_to_str = pmap_field(int, str)
           ...     vector_of_strs = pvector_field(str)
           ...
        	
        Serialization
        *************
        PRecords support serialization back to dicts. Default serialization will take keys and values
        "as is" and output them into a dict. It is possible to specify custom serialization functions
        to take care of fields that require special treatment.
        
        .. code:: python
        
            >>> from datetime import date
            >>> class Person(PRecord):
            ...     name = field(type=unicode)
            ...     birth_date = field(type=date,
            ...                        serializer=lambda format, d: d.strftime(format['date']))
            ...
            >>> john = Person(name=u'John', birth_date=date(1985, 10, 21))
            >>> john.serialize({'date': '%Y-%m-%d'})
            {'birth_date': '1985-10-21', 'name': u'John'}
        
        
        .. _instar: https://github.com/boxed/instar/
        
        .. _PClass:
        
        PClass
        ~~~~~~
        A PClass is a python class with a fixed set of specified fields. PClasses are declared as python classes inheriting
        from PClass. It is defined the same way that PRecords are and behaves like a PRecord in all aspects except that it
        is not a PMap and hence not a collection but rather a plain Python object.
        
        .. code:: python
        
            >>> from pyrsistent import PClass, field
            >>> class AClass(PClass):
            ...     x = field()
            ...
            >>> a = AClass(x=3)
            >>> a
            AClass(x=3)
            >>> a.x
            3
        
        
        Checked collections
        ~~~~~~~~~~~~~~~~~~~
        Checked collections currently come in three flavors: CheckedPVector, CheckedPMap and CheckedPSet.
        
        .. code:: python
        
            >>> from pyrsistent import CheckedPVector, CheckedPMap, CheckedPSet, thaw
            >>> class Positives(CheckedPSet):
            ...     __type__ = (long, int)
            ...     __invariant__ = lambda n: (n >= 0, 'Negative')
            ...
            >>> class Lottery(PRecord):
            ...     name = field(type=str)
            ...     numbers = field(type=Positives, invariant=lambda p: (len(p) > 0, 'No numbers'))
            ...
            >>> class Lotteries(CheckedPVector):
            ...     __type__ = Lottery
            ...
            >>> class LotteriesByDate(CheckedPMap):
            ...     __key_type__ = date
            ...     __value_type__ = Lotteries
            ...
            >>> lotteries = LotteriesByDate.create({date(2015, 2, 15): [{'name': 'SuperLotto', 'numbers': {1, 2, 3}},
            ...                                                         {'name': 'MegaLotto',  'numbers': {4, 5, 6}}],
            ...                                     date(2015, 2, 16): [{'name': 'SuperLotto', 'numbers': {3, 2, 1}},
            ...                                                         {'name': 'MegaLotto',  'numbers': {6, 5, 4}}]})
            >>> lotteries
            LotteriesByDate({datetime.date(2015, 2, 15): Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')]), datetime.date(2015, 2, 16): Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')])})
        
            # The checked versions support all operations that the corresponding
            # unchecked types do
            >>> lottery_0215 = lotteries[date(2015, 2, 15)]
            >>> lottery_0215.transform([0, 'name'], 'SuperDuperLotto')
            Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperDuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')])
        
            # But also makes asserts that types and invariants hold
            >>> lottery_0215.transform([0, 'name'], 999)
            Traceback (most recent call last):
            PTypeError: Invalid type for field Lottery.name, was int
        
            >>> lottery_0215.transform([0, 'numbers'], set())
            Traceback (most recent call last):
            InvariantException: Field invariant failed
        
            # They can be converted back to python built ins with either thaw()
            # or serialize() (which provides possibilities to customize serialization)
            >>> thaw(lottery_0215)
            [{'numbers': set([1, 2, 3]), 'name': 'SuperLotto'}, {'numbers': set([4, 5, 6]), 'name': 'MegaLotto'}]
            >>> lottery_0215.serialize()
            [{'numbers': set([1, 2, 3]), 'name': 'SuperLotto'}, {'numbers': set([4, 5, 6]), 'name': 'MegaLotto'}]
        
        .. _transformations:
        
        Transformations
        ~~~~~~~~~~~~~~~
        Transformations are inspired by the cool library instar_ for Clojure. They let you evolve PMaps and PVectors
        with arbitrarily deep/complex nesting using simple syntax and flexible matching syntax.
        
        The first argument to transformation is the path that points out the value to transform. The
        second is the transformation to perform. If the transformation is callable it will be applied
        to the value(s) matching the path. The path may also contain callables. In that case they are
        treated as matchers. If the matcher returns True for a specific key it is considered for transformation.
        
        .. code:: python
        
            # Basic examples
            >>> from pyrsistent import inc, freeze, thaw, rex, ny, discard
            >>> v1 = freeze([1, 2, 3, 4, 5])
            >>> v1.transform([2], inc)
            pvector([1, 2, 4, 4, 5])
            >>> v1.transform([lambda ix: 0 < ix < 4], 8)
            pvector([1, 8, 8, 8, 5])
            >>> v1.transform([lambda ix, v: ix == 0 or v == 5], 0)
            pvector([0, 2, 3, 4, 0])
        
            # The (a)ny matcher can be used to match anything
            >>> v1.transform([ny], 8)
            pvector([8, 8, 8, 8, 8])
        
            # Regular expressions can be used for matching
            >>> scores = freeze({'John': 12, 'Joseph': 34, 'Sara': 23})
            >>> scores.transform([rex('^Jo')], 0)
            pmap({'Joseph': 0, 'Sara': 23, 'John': 0})
        
            # Transformations can be done on arbitrarily deep structures
            >>> news_paper = freeze({'articles': [{'author': 'Sara', 'content': 'A short article'},
            ...                                   {'author': 'Steve', 'content': 'A slightly longer article'}],
            ...                      'weather': {'temperature': '11C', 'wind': '5m/s'}})
            >>> short_news = news_paper.transform(['articles', ny, 'content'], lambda c: c[:25] + '...' if len(c) > 25 else c)
            >>> very_short_news = news_paper.transform(['articles', ny, 'content'], lambda c: c[:15] + '...' if len(c) > 15 else c)
            >>> very_short_news.articles[0].content
            'A short article'
            >>> very_short_news.articles[1].content
            'A slightly long...'
        
            # When nothing has been transformed the original data structure is kept
            >>> short_news is news_paper
            True
            >>> very_short_news is news_paper
            False
            >>> very_short_news.articles[0] is news_paper.articles[0]
            True
        
            # There is a special transformation that can be used to discard elements. Also
            # multiple transformations can be applied in one call
            >>> thaw(news_paper.transform(['weather'], discard, ['articles', ny, 'content'], discard))
            {'articles': [{'author': 'Sara'}, {'author': 'Steve'}]}
        
        Evolvers
        ~~~~~~~~
        PVector, PMap and PSet all have support for a concept dubbed *evolvers*. An evolver acts like a mutable
        view of the underlying persistent data structure with "transaction like" semantics. No updates of the original
        data structure is ever performed, it is still fully immutable.
        
        The evolvers have a very limited API by design to discourage excessive, and inappropriate, usage as that would
        take us down the mutable road. In principle only basic mutation and element access functions are supported.
        Check out the documentation_ of each data structure for specific examples.
        
        Examples of when you may want to use an evolver instead of working directly with the data structure include:
        
        * Multiple updates are done to the same data structure and the intermediate results are of no
          interest. In this case using an evolver may be a more efficient and easier to work with.
        * You need to pass a vector into a legacy function or a function that you have no control
          over which performs in place mutations. In this case pass an evolver instance
          instead and then create a new pvector from the evolver once the function returns.
        
        .. code:: python
        
            >>> from pyrsistent import v
        
            # In place mutation as when working with the built in counterpart
            >>> v1 = v(1, 2, 3)
            >>> e = v1.evolver()
            >>> e[1] = 22
            >>> e = e.append(4)
            >>> e = e.extend([5, 6])
            >>> e[5] += 1
            >>> len(e)
            6
        
            # The evolver is considered *dirty* when it contains changes compared to the underlying vector
            >>> e.is_dirty()
            True
        
            # But the underlying pvector still remains untouched
            >>> v1
            pvector([1, 2, 3])
        
            # Once satisfied with the updates you can produce a new pvector containing the updates.
            # The new pvector will share data with the original pvector in the same way that would have
            # been done if only using operations on the pvector.
            >>> v2 = e.persistent()
            >>> v2
            pvector([1, 22, 3, 4, 5, 7])
        
            # The evolver is now no longer considered *dirty* as it contains no differences compared to the
            # pvector just produced.
            >>> e.is_dirty()
            False
        
            # You may continue to work with the same evolver without affecting the content of v2
            >>> e[0] = 11
        
            # Or create a new evolver from v2. The two evolvers can be updated independently but will both
            # share data with v2 where possible.
            >>> e2 = v2.evolver()
            >>> e2[0] = 1111
            >>> e.persistent()
            pvector([11, 22, 3, 4, 5, 7])
            >>> e2.persistent()
            pvector([1111, 22, 3, 4, 5, 7])
        
        .. _freeze:
        .. _thaw:
        
        freeze and thaw
        ~~~~~~~~~~~~~~~
        These functions are great when your cozy immutable world has to interact with the evil mutable world outside.
        
        .. code:: python
        
            >>> from pyrsistent import freeze, thaw, v, m
            >>> freeze([1, {'a': 3}])
            pvector([1, pmap({'a': 3})])
            >>> thaw(v(1, m(a=3)))
            [1, {'a': 3}]
        
        Compatibility
        -------------
        
        Pyrsistent is developed and tested on Python 2.6, 2.7, 3.4, 3.5, 3.6 and PyPy (Python 2 and 3 compatible). It will most
        likely work on all other versions >= 3.4 but no guarantees are given. :)
        
        Compatibility issues
        ~~~~~~~~~~~~~~~~~~~~
        
        .. _27: https://github.com/tobgu/pyrsistent/issues/27
        
        There is currently one known compatibility issue when comparing built in sets and frozensets to PSets as discussed in 27_.
        It affects python 2 versions < 2.7.8 and python 3 versions < 3.4.0 and is due to a bug described in
        http://bugs.python.org/issue8743.
        
        Comparisons will fail or be incorrect when using the set/frozenset as left hand side of the comparison. As a workaround
        you need to either upgrade Python to a more recent version, avoid comparing sets/frozensets with PSets or always make
        sure to convert both sides of the comparison to the same type before performing the comparison.
        
        Performance
        -----------
        
        Pyrsistent is developed with performance in mind. Still, while some operations are nearly on par with their built in, 
        mutable, counterparts in terms of speed, other operations are slower. In the cases where attempts at
        optimizations have been done, speed has generally been valued over space.
        
        Pyrsistent comes with two API compatible flavors of PVector (on which PMap and PSet are based), one pure Python 
        implementation and one implemented as a C extension. The latter generally being 2 - 20 times faster than the former.
        The C extension will be used automatically when possible.
        
        The pure python implementation is fully PyPy compatible. Running it under PyPy speeds operations up considerably if 
        the structures are used heavily (if JITed), for some cases the performance is almost on par with the built in counterparts.
        
        Type hints
        ----------
        
        PEP 561 style type hints for use with mypy and various editors are available for most types and functions in pyrsistent.
        
        Type classes for annotating your own code with pyrsistent types are also available under pyrsistent.typing.
        
        Installation
        ------------
        
        pip install pyrsistent
        
        Documentation
        -------------
        
        Available at http://pyrsistent.readthedocs.org/
        
        Brief presentation available at http://slides.com/tobiasgustafsson/immutability-and-python/
        
        Contributors
        ------------
        
        Tobias Gustafsson https://github.com/tobgu
        
        Christopher Armstrong https://github.com/radix
        
        Anders Hovmöller https://github.com/boxed
        
        Itamar Turner-Trauring https://github.com/itamarst
        
        Jonathan Lange https://github.com/jml
        
        Richard Futrell https://github.com/Futrell
        
        Jakob Hollenstein https://github.com/jkbjh
        
        David Honour https://github.com/foolswood
        
        David R. MacIver https://github.com/DRMacIver
        
        Marcus Ewert https://github.com/sarum90
        
        Jean-Paul Calderone https://github.com/exarkun
        
        Douglas Treadwell https://github.com/douglas-treadwell
        
        Travis Parker https://github.com/teepark
        
        Julian Berman https://github.com/Julian
        
        Dennis Tomas https://github.com/dtomas
        
        Neil Vyas https://github.com/neilvyas
        
        doozr https://github.com/doozr
        
        Kamil Galuszka https://github.com/galuszkak
        
        Tsuyoshi Hombashi https://github.com/thombashi
        
        nattofriends https://github.com/nattofriends
        
        agberk https://github.com/agberk
        
        Waleed Khan https://github.com/arxanas
        
        Jean-Louis Fuchs https://github.com/ganwell
        
        Carlos Corbacho https://github.com/ccorbacho
        
        Felix Yan https://github.com/felixonmars
        
        benrg https://github.com/benrg
        
        Contributing
        ------------
        
        Want to contribute? That's great! If you experience problems please log them on GitHub. If you want to contribute code,
        please fork the repository and submit a pull request.
        
        Run tests
        ~~~~~~~~~
        .. _tox: https://tox.readthedocs.io/en/latest/
        
        Tests can be executed using tox_.
        
        Install tox: ``pip install tox``
        
        Run test for Python 2.7: ``tox -epy27``
        
        Release
        ~~~~~~~
        * Update CHANGES.txt
        * Update README with any new contributors and potential info needed.
        * Update _pyrsistent_version.py
        * python setup.py sdist upload
        * Commit and tag with new version: git add -u . && git commit -m 'Prepare version vX.Y.Z' && git tag -a vX.Y.Z -m 'vX.Y.Z'
        * Push commit and tags: git push && git push --tags
        
        Project status
        --------------
        Pyrsistent can be considered stable and mature (who knows, there may even be a 1.0 some day :-)). The project is
        maintained, bugs fixed, PRs reviewed and merged and new releases made. I currently do not have time for development
        of new features or functionality which I don't have use for myself. I'm more than happy to take PRs for new
        functionality though!
        
        There are a bunch of issues marked with ``enhancement`` and ``help wanted`` that contain requests for new functionality
        that would be nice to include. The level of difficulty and extend of the issues varies, please reach out to me if you're
        interested in working on any of them.
        
        If you feel that you have a grand master plan for where you would like Pyrsistent to go and have the time to put into
        it please don't hesitate to discuss this with me and submit PRs for it. If all goes well I'd be more than happy to add
        additional maintainers to the project!
        
Platform: UNKNOWN
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2.7
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 :: Implementation :: PyPy
PK�(�\�?��c�c"doc/alt-python37-pyrsistent/READMEnu�[���Pyrsistent
==========
.. image:: https://travis-ci.org/tobgu/pyrsistent.png?branch=master
    :target: https://travis-ci.org/tobgu/pyrsistent

.. image:: https://badge.fury.io/py/pyrsistent.svg
    :target: https://badge.fury.io/py/pyrsistent

.. image:: https://coveralls.io/repos/tobgu/pyrsistent/badge.svg?branch=master&service=github
    :target: https://coveralls.io/github/tobgu/pyrsistent?branch=master


.. _Pyrthon: https://www.github.com/tobgu/pyrthon/

Pyrsistent is a number of persistent collections (by some referred to as functional data structures). Persistent in 
the sense that they are immutable.

All methods on a data structure that would normally mutate it instead return a new copy of the structure containing the
requested updates. The original structure is left untouched.

This will simplify the reasoning about what a program does since no hidden side effects ever can take place to these
data structures. You can rest assured that the object you hold a reference to will remain the same throughout its
lifetime and need not worry that somewhere five stack levels below you in the darkest corner of your application
someone has decided to remove that element that you expected to be there.

Pyrsistent is influenced by persistent data structures such as those found in the standard library of Clojure. The
data structures are designed to share common elements through path copying.
It aims at taking these concepts and make them as pythonic as possible so that they can be easily integrated into any python
program without hassle.

If you want to go all in on persistent data structures and use literal syntax to define them in your code rather
than function calls check out Pyrthon_.

Examples
--------
.. _Sequence: collections_
.. _Hashable: collections_
.. _Mapping: collections_
.. _Mappings: collections_
.. _Set: collections_
.. _collections: https://docs.python.org/3/library/collections.abc.html
.. _documentation: http://pyrsistent.readthedocs.org/

The collection types and key features currently implemented are:

* PVector_, similar to a python list
* PMap_, similar to dict
* PSet_, similar to set
* PRecord_, a PMap on steroids with fixed fields, optional type and invariant checking and much more
* PClass_, a Python class fixed fields, optional type and invariant checking and much more
* `Checked collections`_, PVector, PMap and PSet with optional type and invariance checks and more
* PBag, similar to collections.Counter
* PList, a classic singly linked list
* PDeque, similar to collections.deque
* Immutable object type (immutable) built on the named tuple
* freeze_ and thaw_ functions to convert between pythons standard collections and pyrsistent collections.
* Flexible transformations_ of arbitrarily complex structures built from PMaps and PVectors.

Below are examples of common usage patterns for some of the structures and features. More information and
full documentation for all data structures is available in the documentation_.

.. _PVector:

PVector
~~~~~~~
With full support for the Sequence_ protocol PVector is meant as a drop in replacement to the built in list from a readers
point of view. Write operations of course differ since no in place mutation is done but naming should be in line
with corresponding operations on the built in list.

Support for the Hashable_ protocol also means that it can be used as key in Mappings_.

Appends are amortized O(1). Random access and insert is log32(n) where n is the size of the vector.

.. code:: python

    >>> from pyrsistent import v, pvector

    # No mutation of vectors once created, instead they
    # are "evolved" leaving the original untouched
    >>> v1 = v(1, 2, 3)
    >>> v2 = v1.append(4)
    >>> v3 = v2.set(1, 5)
    >>> v1
    pvector([1, 2, 3])
    >>> v2
    pvector([1, 2, 3, 4])
    >>> v3
    pvector([1, 5, 3, 4])

    # Random access and slicing
    >>> v3[1]
    5
    >>> v3[1:3]
    pvector([5, 3])

    # Iteration
    >>> list(x + 1 for x in v3)
    [2, 6, 4, 5]
    >>> pvector(2 * x for x in range(3))
    pvector([0, 2, 4])

.. _PMap:

PMap
~~~~
With full support for the Mapping_ protocol PMap is meant as a drop in replacement to the built in dict from a readers point
of view. Support for the Hashable_ protocol also means that it can be used as key in other Mappings_.

Random access and insert is log32(n) where n is the size of the map.

.. code:: python

    >>> from pyrsistent import m, pmap, v

    # No mutation of maps once created, instead they are
    # "evolved" leaving the original untouched
    >>> m1 = m(a=1, b=2)
    >>> m2 = m1.set('c', 3)
    >>> m3 = m2.set('a', 5)
    >>> m1
    pmap({'a': 1, 'b': 2})
    >>> m2
    pmap({'a': 1, 'c': 3, 'b': 2})
    >>> m3
    pmap({'a': 5, 'c': 3, 'b': 2})
    >>> m3['a']
    5

    # Evolution of nested persistent structures
    >>> m4 = m(a=5, b=6, c=v(1, 2))
    >>> m4.transform(('c', 1), 17)
    pmap({'a': 5, 'c': pvector([1, 17]), 'b': 6})
    >>> m5 = m(a=1, b=2)

    # Evolve by merging with other mappings
    >>> m5.update(m(a=2, c=3), {'a': 17, 'd': 35})
    pmap({'a': 17, 'c': 3, 'b': 2, 'd': 35})
    >>> pmap({'x': 1, 'y': 2}) + pmap({'y': 3, 'z': 4})
    pmap({'y': 3, 'x': 1, 'z': 4})

    # Dict-like methods to convert to list and iterate
    >>> m3.items()
    pvector([('a', 5), ('c', 3), ('b', 2)])
    >>> list(m3)
    ['a', 'c', 'b']

.. _PSet:

PSet
~~~~
With full support for the Set_ protocol PSet is meant as a drop in replacement to the built in set from a readers point
of view. Support for the Hashable_ protocol also means that it can be used as key in Mappings_.

Random access and insert is log32(n) where n is the size of the set.

.. code:: python

    >>> from pyrsistent import s

    # No mutation of sets once created, you know the story...
    >>> s1 = s(1, 2, 3, 2)
    >>> s2 = s1.add(4)
    >>> s3 = s1.remove(1)
    >>> s1
    pset([1, 2, 3])
    >>> s2
    pset([1, 2, 3, 4])
    >>> s3
    pset([2, 3])

    # Full support for set operations
    >>> s1 | s(3, 4, 5)
    pset([1, 2, 3, 4, 5])
    >>> s1 & s(3, 4, 5)
    pset([3])
    >>> s1 < s2
    True
    >>> s1 < s(3, 4, 5)
    False

.. _PRecord:

PRecord
~~~~~~~
A PRecord is a PMap with a fixed set of specified fields. Records are declared as python classes inheriting
from PRecord. Because it is a PMap it has full support for all Mapping methods such as iteration and element
access using subscript notation.

.. code:: python

    >>> from pyrsistent import PRecord, field
    >>> class ARecord(PRecord):
    ...     x = field()
    ...
    >>> r = ARecord(x=3)
    >>> r
    ARecord(x=3)
    >>> r.x
    3
    >>> r.set(x=2)
    ARecord(x=2)
    >>> r.set(y=2)
    Traceback (most recent call last):
    AttributeError: 'y' is not among the specified fields for ARecord

Type information
****************
It is possible to add type information to the record to enforce type checks. Multiple allowed types can be specified
by providing an iterable of types.

.. code:: python

    >>> class BRecord(PRecord):
    ...     x = field(type=int)
    ...     y = field(type=(int, type(None)))
    ...
    >>> BRecord(x=3, y=None)
    BRecord(y=None, x=3)
    >>> BRecord(x=3.0)
    Traceback (most recent call last):
    PTypeError: Invalid type for field BRecord.x, was float


Custom types (classes) that are iterable should be wrapped in a tuple to prevent their
members being added to the set of valid types.  Although Enums in particular are now 
supported without wrapping, see #83 for more information.

Mandatory fields
****************
Fields are not mandatory by default but can be specified as such. If fields are missing an
*InvariantException* will be thrown which contains information about the missing fields.

.. code:: python

    >>> from pyrsistent import InvariantException
    >>> class CRecord(PRecord):
    ...     x = field(mandatory=True)
    ...
    >>> r = CRecord(x=3)
    >>> try:
    ...    r.discard('x')
    ... except InvariantException as e:
    ...    print(e.missing_fields)
    ...
    ('CRecord.x',)

Invariants
**********
It is possible to add invariants that must hold when evolving the record. Invariants can be
specified on both field and record level. If invariants fail an *InvariantException* will be
thrown which contains information about the failing invariants. An invariant function should
return a tuple consisting of a boolean that tells if the invariant holds or not and an object
describing the invariant. This object can later be used to identify which invariant that failed.

The global invariant function is only executed if all field invariants hold.

Global invariants are inherited to subclasses.

.. code:: python

    >>> class RestrictedVector(PRecord):
    ...     __invariant__ = lambda r: (r.y >= r.x, 'x larger than y')
    ...     x = field(invariant=lambda x: (x > 0, 'x negative'))
    ...     y = field(invariant=lambda y: (y > 0, 'y negative'))
    ...
    >>> r = RestrictedVector(y=3, x=2)
    >>> try:
    ...    r.set(x=-1, y=-2)
    ... except InvariantException as e:
    ...    print(e.invariant_errors)
    ...
    ('y negative', 'x negative')
    >>> try:
    ...    r.set(x=2, y=1)
    ... except InvariantException as e:
    ...    print(e.invariant_errors)
    ...
    ('x larger than y',)

Invariants may also contain multiple assertions. For those cases the invariant function should
return a tuple of invariant tuples as described above. This structure is reflected in the
invariant_errors attribute of the exception which will contain tuples with data from all failed
invariants. Eg:

.. code:: python

    >>> class EvenX(PRecord):
    ...     x = field(invariant=lambda x: ((x > 0, 'x negative'), (x % 2 == 0, 'x odd')))
    ...
    >>> try:
    ...    EvenX(x=-1)
    ... except InvariantException as e:
    ...    print(e.invariant_errors)
    ...
    (('x negative', 'x odd'),)


Factories
*********
It's possible to specify factory functions for fields. The factory function receives whatever
is supplied as field value and the actual returned by the factory is assigned to the field
given that any type and invariant checks hold.
PRecords have a default factory specified as a static function on the class, create(). It takes
a *Mapping* as argument and returns an instance of the specific record.
If a record has fields of type PRecord the create() method of that record will
be called to create the "sub record" if no factory has explicitly been specified to override
this behaviour.

.. code:: python

    >>> class DRecord(PRecord):
    ...     x = field(factory=int)
    ...
    >>> class ERecord(PRecord):
    ...     d = field(type=DRecord)
    ...
    >>> ERecord.create({'d': {'x': '1'}})
    ERecord(d=DRecord(x=1))

Collection fields
*****************
It is also possible to have fields with ``pyrsistent`` collections.

.. code:: python

   >>> from pyrsistent import pset_field, pmap_field, pvector_field
   >>> class MultiRecord(PRecord):
   ...     set_of_ints = pset_field(int)
   ...     map_int_to_str = pmap_field(int, str)
   ...     vector_of_strs = pvector_field(str)
   ...
	
Serialization
*************
PRecords support serialization back to dicts. Default serialization will take keys and values
"as is" and output them into a dict. It is possible to specify custom serialization functions
to take care of fields that require special treatment.

.. code:: python

    >>> from datetime import date
    >>> class Person(PRecord):
    ...     name = field(type=unicode)
    ...     birth_date = field(type=date,
    ...                        serializer=lambda format, d: d.strftime(format['date']))
    ...
    >>> john = Person(name=u'John', birth_date=date(1985, 10, 21))
    >>> john.serialize({'date': '%Y-%m-%d'})
    {'birth_date': '1985-10-21', 'name': u'John'}


.. _instar: https://github.com/boxed/instar/

.. _PClass:

PClass
~~~~~~
A PClass is a python class with a fixed set of specified fields. PClasses are declared as python classes inheriting
from PClass. It is defined the same way that PRecords are and behaves like a PRecord in all aspects except that it
is not a PMap and hence not a collection but rather a plain Python object.

.. code:: python

    >>> from pyrsistent import PClass, field
    >>> class AClass(PClass):
    ...     x = field()
    ...
    >>> a = AClass(x=3)
    >>> a
    AClass(x=3)
    >>> a.x
    3


Checked collections
~~~~~~~~~~~~~~~~~~~
Checked collections currently come in three flavors: CheckedPVector, CheckedPMap and CheckedPSet.

.. code:: python

    >>> from pyrsistent import CheckedPVector, CheckedPMap, CheckedPSet, thaw
    >>> class Positives(CheckedPSet):
    ...     __type__ = (long, int)
    ...     __invariant__ = lambda n: (n >= 0, 'Negative')
    ...
    >>> class Lottery(PRecord):
    ...     name = field(type=str)
    ...     numbers = field(type=Positives, invariant=lambda p: (len(p) > 0, 'No numbers'))
    ...
    >>> class Lotteries(CheckedPVector):
    ...     __type__ = Lottery
    ...
    >>> class LotteriesByDate(CheckedPMap):
    ...     __key_type__ = date
    ...     __value_type__ = Lotteries
    ...
    >>> lotteries = LotteriesByDate.create({date(2015, 2, 15): [{'name': 'SuperLotto', 'numbers': {1, 2, 3}},
    ...                                                         {'name': 'MegaLotto',  'numbers': {4, 5, 6}}],
    ...                                     date(2015, 2, 16): [{'name': 'SuperLotto', 'numbers': {3, 2, 1}},
    ...                                                         {'name': 'MegaLotto',  'numbers': {6, 5, 4}}]})
    >>> lotteries
    LotteriesByDate({datetime.date(2015, 2, 15): Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')]), datetime.date(2015, 2, 16): Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')])})

    # The checked versions support all operations that the corresponding
    # unchecked types do
    >>> lottery_0215 = lotteries[date(2015, 2, 15)]
    >>> lottery_0215.transform([0, 'name'], 'SuperDuperLotto')
    Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperDuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')])

    # But also makes asserts that types and invariants hold
    >>> lottery_0215.transform([0, 'name'], 999)
    Traceback (most recent call last):
    PTypeError: Invalid type for field Lottery.name, was int

    >>> lottery_0215.transform([0, 'numbers'], set())
    Traceback (most recent call last):
    InvariantException: Field invariant failed

    # They can be converted back to python built ins with either thaw()
    # or serialize() (which provides possibilities to customize serialization)
    >>> thaw(lottery_0215)
    [{'numbers': set([1, 2, 3]), 'name': 'SuperLotto'}, {'numbers': set([4, 5, 6]), 'name': 'MegaLotto'}]
    >>> lottery_0215.serialize()
    [{'numbers': set([1, 2, 3]), 'name': 'SuperLotto'}, {'numbers': set([4, 5, 6]), 'name': 'MegaLotto'}]

.. _transformations:

Transformations
~~~~~~~~~~~~~~~
Transformations are inspired by the cool library instar_ for Clojure. They let you evolve PMaps and PVectors
with arbitrarily deep/complex nesting using simple syntax and flexible matching syntax.

The first argument to transformation is the path that points out the value to transform. The
second is the transformation to perform. If the transformation is callable it will be applied
to the value(s) matching the path. The path may also contain callables. In that case they are
treated as matchers. If the matcher returns True for a specific key it is considered for transformation.

.. code:: python

    # Basic examples
    >>> from pyrsistent import inc, freeze, thaw, rex, ny, discard
    >>> v1 = freeze([1, 2, 3, 4, 5])
    >>> v1.transform([2], inc)
    pvector([1, 2, 4, 4, 5])
    >>> v1.transform([lambda ix: 0 < ix < 4], 8)
    pvector([1, 8, 8, 8, 5])
    >>> v1.transform([lambda ix, v: ix == 0 or v == 5], 0)
    pvector([0, 2, 3, 4, 0])

    # The (a)ny matcher can be used to match anything
    >>> v1.transform([ny], 8)
    pvector([8, 8, 8, 8, 8])

    # Regular expressions can be used for matching
    >>> scores = freeze({'John': 12, 'Joseph': 34, 'Sara': 23})
    >>> scores.transform([rex('^Jo')], 0)
    pmap({'Joseph': 0, 'Sara': 23, 'John': 0})

    # Transformations can be done on arbitrarily deep structures
    >>> news_paper = freeze({'articles': [{'author': 'Sara', 'content': 'A short article'},
    ...                                   {'author': 'Steve', 'content': 'A slightly longer article'}],
    ...                      'weather': {'temperature': '11C', 'wind': '5m/s'}})
    >>> short_news = news_paper.transform(['articles', ny, 'content'], lambda c: c[:25] + '...' if len(c) > 25 else c)
    >>> very_short_news = news_paper.transform(['articles', ny, 'content'], lambda c: c[:15] + '...' if len(c) > 15 else c)
    >>> very_short_news.articles[0].content
    'A short article'
    >>> very_short_news.articles[1].content
    'A slightly long...'

    # When nothing has been transformed the original data structure is kept
    >>> short_news is news_paper
    True
    >>> very_short_news is news_paper
    False
    >>> very_short_news.articles[0] is news_paper.articles[0]
    True

    # There is a special transformation that can be used to discard elements. Also
    # multiple transformations can be applied in one call
    >>> thaw(news_paper.transform(['weather'], discard, ['articles', ny, 'content'], discard))
    {'articles': [{'author': 'Sara'}, {'author': 'Steve'}]}

Evolvers
~~~~~~~~
PVector, PMap and PSet all have support for a concept dubbed *evolvers*. An evolver acts like a mutable
view of the underlying persistent data structure with "transaction like" semantics. No updates of the original
data structure is ever performed, it is still fully immutable.

The evolvers have a very limited API by design to discourage excessive, and inappropriate, usage as that would
take us down the mutable road. In principle only basic mutation and element access functions are supported.
Check out the documentation_ of each data structure for specific examples.

Examples of when you may want to use an evolver instead of working directly with the data structure include:

* Multiple updates are done to the same data structure and the intermediate results are of no
  interest. In this case using an evolver may be a more efficient and easier to work with.
* You need to pass a vector into a legacy function or a function that you have no control
  over which performs in place mutations. In this case pass an evolver instance
  instead and then create a new pvector from the evolver once the function returns.

.. code:: python

    >>> from pyrsistent import v

    # In place mutation as when working with the built in counterpart
    >>> v1 = v(1, 2, 3)
    >>> e = v1.evolver()
    >>> e[1] = 22
    >>> e = e.append(4)
    >>> e = e.extend([5, 6])
    >>> e[5] += 1
    >>> len(e)
    6

    # The evolver is considered *dirty* when it contains changes compared to the underlying vector
    >>> e.is_dirty()
    True

    # But the underlying pvector still remains untouched
    >>> v1
    pvector([1, 2, 3])

    # Once satisfied with the updates you can produce a new pvector containing the updates.
    # The new pvector will share data with the original pvector in the same way that would have
    # been done if only using operations on the pvector.
    >>> v2 = e.persistent()
    >>> v2
    pvector([1, 22, 3, 4, 5, 7])

    # The evolver is now no longer considered *dirty* as it contains no differences compared to the
    # pvector just produced.
    >>> e.is_dirty()
    False

    # You may continue to work with the same evolver without affecting the content of v2
    >>> e[0] = 11

    # Or create a new evolver from v2. The two evolvers can be updated independently but will both
    # share data with v2 where possible.
    >>> e2 = v2.evolver()
    >>> e2[0] = 1111
    >>> e.persistent()
    pvector([11, 22, 3, 4, 5, 7])
    >>> e2.persistent()
    pvector([1111, 22, 3, 4, 5, 7])

.. _freeze:
.. _thaw:

freeze and thaw
~~~~~~~~~~~~~~~
These functions are great when your cozy immutable world has to interact with the evil mutable world outside.

.. code:: python

    >>> from pyrsistent import freeze, thaw, v, m
    >>> freeze([1, {'a': 3}])
    pvector([1, pmap({'a': 3})])
    >>> thaw(v(1, m(a=3)))
    [1, {'a': 3}]

Compatibility
-------------

Pyrsistent is developed and tested on Python 2.6, 2.7, 3.4, 3.5, 3.6 and PyPy (Python 2 and 3 compatible). It will most
likely work on all other versions >= 3.4 but no guarantees are given. :)

Compatibility issues
~~~~~~~~~~~~~~~~~~~~

.. _27: https://github.com/tobgu/pyrsistent/issues/27

There is currently one known compatibility issue when comparing built in sets and frozensets to PSets as discussed in 27_.
It affects python 2 versions < 2.7.8 and python 3 versions < 3.4.0 and is due to a bug described in
http://bugs.python.org/issue8743.

Comparisons will fail or be incorrect when using the set/frozenset as left hand side of the comparison. As a workaround
you need to either upgrade Python to a more recent version, avoid comparing sets/frozensets with PSets or always make
sure to convert both sides of the comparison to the same type before performing the comparison.

Performance
-----------

Pyrsistent is developed with performance in mind. Still, while some operations are nearly on par with their built in, 
mutable, counterparts in terms of speed, other operations are slower. In the cases where attempts at
optimizations have been done, speed has generally been valued over space.

Pyrsistent comes with two API compatible flavors of PVector (on which PMap and PSet are based), one pure Python 
implementation and one implemented as a C extension. The latter generally being 2 - 20 times faster than the former.
The C extension will be used automatically when possible.

The pure python implementation is fully PyPy compatible. Running it under PyPy speeds operations up considerably if 
the structures are used heavily (if JITed), for some cases the performance is almost on par with the built in counterparts.

Type hints
----------

PEP 561 style type hints for use with mypy and various editors are available for most types and functions in pyrsistent.

Type classes for annotating your own code with pyrsistent types are also available under pyrsistent.typing.

Installation
------------

pip install pyrsistent

Documentation
-------------

Available at http://pyrsistent.readthedocs.org/

Brief presentation available at http://slides.com/tobiasgustafsson/immutability-and-python/

Contributors
------------

Tobias Gustafsson https://github.com/tobgu

Christopher Armstrong https://github.com/radix

Anders Hovmöller https://github.com/boxed

Itamar Turner-Trauring https://github.com/itamarst

Jonathan Lange https://github.com/jml

Richard Futrell https://github.com/Futrell

Jakob Hollenstein https://github.com/jkbjh

David Honour https://github.com/foolswood

David R. MacIver https://github.com/DRMacIver

Marcus Ewert https://github.com/sarum90

Jean-Paul Calderone https://github.com/exarkun

Douglas Treadwell https://github.com/douglas-treadwell

Travis Parker https://github.com/teepark

Julian Berman https://github.com/Julian

Dennis Tomas https://github.com/dtomas

Neil Vyas https://github.com/neilvyas

doozr https://github.com/doozr

Kamil Galuszka https://github.com/galuszkak

Tsuyoshi Hombashi https://github.com/thombashi

nattofriends https://github.com/nattofriends

agberk https://github.com/agberk

Waleed Khan https://github.com/arxanas

Jean-Louis Fuchs https://github.com/ganwell

Carlos Corbacho https://github.com/ccorbacho

Felix Yan https://github.com/felixonmars

benrg https://github.com/benrg

Contributing
------------

Want to contribute? That's great! If you experience problems please log them on GitHub. If you want to contribute code,
please fork the repository and submit a pull request.

Run tests
~~~~~~~~~
.. _tox: https://tox.readthedocs.io/en/latest/

Tests can be executed using tox_.

Install tox: ``pip install tox``

Run test for Python 2.7: ``tox -epy27``

Release
~~~~~~~
* Update CHANGES.txt
* Update README with any new contributors and potential info needed.
* Update _pyrsistent_version.py
* python setup.py sdist upload
* Commit and tag with new version: git add -u . && git commit -m 'Prepare version vX.Y.Z' && git tag -a vX.Y.Z -m 'vX.Y.Z'
* Push commit and tags: git push && git push --tags

Project status
--------------
Pyrsistent can be considered stable and mature (who knows, there may even be a 1.0 some day :-)). The project is
maintained, bugs fixed, PRs reviewed and merged and new releases made. I currently do not have time for development
of new features or functionality which I don't have use for myself. I'm more than happy to take PRs for new
functionality though!

There are a bunch of issues marked with ``enhancement`` and ``help wanted`` that contain requests for new functionality
that would be nice to include. The level of difficulty and extend of the issues varies, please reach out to me if you're
interested in working on any of them.

If you feel that you have a grand master plan for where you would like Pyrsistent to go and have the time to put into
it please don't hesitate to discuss this with me and submit PRs for it. If all goes well I'd be more than happy to add
additional maintainers to the project!
PK�(�\�;Θ$$'doc/alt-python37-pyrsistent/LICENCE.mitnu�[���Copyright (c) 2019 Tobias Gustafsson

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.PK�(�\�*=�@5@5'doc/alt-python37-pyrsistent/CHANGES.txtnu�[���Revision history
----------------
0.14.11, 2019-02-21
 * Fix #152 Don't use __builtin_popcount, this hopefully fixes #147 Error in pvectorc.cp37-win_amd64.pyd file, as well.
   Thanks @benrg for this!
 * Fix #151 Fix compatibility for hypothesis 4. Thanks @felixonmars for this!

0.14.10, 2019-02-09
 * Fix #148, only require pytest-runner if running tests. Thanks @ccorbacho for this!

0.14.9, 2019-01-06
 * Fix #144, Compile pvectormodule.c on windows. Thanks @ganwell for this!

0.14.8, 2018-12-19
 * Fix #142, Improve type stubs. Thanks @arxanas for this!

0.14.7, 2018-11-20
 * Fix #102, add PEP 561 type annotation stubs for most pyrsistent types. Thanks @nattofriends for this!

0.14.6, 2018-11-17
 * Fix #135, Type classes for Python 3 type annotations of pyrsistent types. Thanks @nattofriends for this!
 * Fix #128, Allow PClass and PRecord to ignore input parameters to constructor that are not part of the spec
   instead of blowing up with a type error. Thanks @agberk for this!

0.14.5, 2018-10-14
 * Fix #137, deprecation warnings in Python 3.7. Thanks @thombashi for this!
 * Fix #129, building via setuptools and setup.py. Thanks @galuszkak for this!

0.14.4, 2018-07-08
 * Fix #133, minor Python 3.7 compatibility issue. Pyrsistent is now officially Python 3.7 compliant!

v0.14.3, 2018-06-11
 * Fix #123 regression where type names break sequence fields. Thanks @doozr for this!
 * Fix #124 using the class name to make AttributeError on __getattr__ more informative for PRecords.
   Thanks @neilvyas for this!
 * Fix #125 how fields handle type arguments. Thanks @neilvyas for this!

v0.14.2, 2017-12-06
 * Fix #121, regression in PClass.set() introduced in 0.14.1.

v0.14.1, 2017-11-27
 * Equality check performance improvements for pvectors and pmaps. Thanks @dtomas for this!
 * Avoid calling factories multiple times for fields that do not change, see PR #120 for for
   details. Thanks @teepark for this!

v0.14.0, 2017-10-08
 * Fix #117, pmap now accepts iterators as input to constructor. Thanks @Julian for this!
 * Drop support for Python 2.6. Nothing has been done in this release that will explicitly
   break pyrsistent for 2.6 but it will not be considered moving forward.  Dropping 2.6
   support is the reason for stepping the second decimal instead of the third.

v0.13.0, 2017-09-01
 * Fix #113, Skip field factories when loading pickled objects. There is a
   minor backwards incompatibilty in the behaviour because of this. Thanks
   @teepark for fi this!
 * Fix #116, negative indexing for pdeques. Thanks @Julian for this!

v0.12.3, 2017-06-04
 * Fix #83, make it possible to use Python 3 enums as field type without having to wrap it in
   a list or tuple. Thanks @douglas-treadwell for this!

v0.12.2, 2017-05-30
 * Fix #108, now possible to use the values in predicates to transform. Thanks @exarkus for this!
 * Fix #107, support multiple level of __invariant__ inheritance. Thanks @exarkus for this!

v0.12.1, 2017-02-26
 * Fix #97, initialize CheckedPVector from iterator-
 * Fix #97, cache hash value on PMap. Thanks @sarum90 for this!

v0.12.0, 2017-01-06
 * Fix #87, add function get_in() for access to elements in deeply nested structures.
 * Fix #91, add method update() to pset and pbag.
 * Fix #92, incorrect discard of elements in transform on pvector
 * This is a release candidate for 1.0 as I now consider pyrsistent fairly stable.

v0.11.13, 2016-04-03
 * Fix #84, pvector segfault in CPython 3 when repr of contained object raises Exception.
 * Update README to cover for issue described in #83.

v0.11.12, 2016-02-06
 * Minor modifications of tests to allow testing as requested in #79 and #80.
 * Also run CI tests under python 3.5

v0.11.11, 2016-01-31
 * #78, include tests in pypi dist.

v0.11.10, 2015-12-27, NOTE! This release contains a backwards incompatible change
                      despite only stepping the patch version number. See below.
 * Implement #74, attribute access on PClass evolver
 * Implement #75, lazily evaluated invariant messages by providing a
   callable with no arguments.
 * Initial values on fields can now be evaluated on object creation
   by providing a callable with no arguments.

   NOTE! If you previously had callables as initial values this change means that those
         will be called upon object creation which may not be what you want. As
         a temporary workaround a callable returning a callable can be used. This
         feature and the concept of initial values will likely change slightly in the future.
         See #77 and and #76 for more information.

v0.11.9, 2015-11-01
 * Added PVector.remove(), thanks @radix for initiating this!

v0.11.8, 2015-10-18
 * Fix #66, UnicodeDecodeError when doing pip install in environments with ascii encoding as default.
   Thanks @foolswood!
 * Implement support for multiple types in pmap_field(), pvector_field() and pset_field(). Thanks @itamarst!

v0.11.7, 2015-10-03
 * Fix #52, occasional SEGFAULTs due to misplaced call to PyObject_GC_Track. Thanks @jkbjh for this!
 * Fix #42, complete support for delete. Now also on the C-implementation of the PVectorEvolver.
   Thanks @itamarst for contributing a whole bunch of Hypothesis test cases covering the evolver operations!

v0.11.6, 2015-09-30
 * Add +, -, & and | operations to PBag. Thanks @Futrell for this!

v0.11.5, 2015-09-29
 * Fix bug introduced in 0.11.4 that prevented multi level inheritance from PClass.
 * Make PClassMeta public for friendlier subclassing

v0.11.4, 2015-09-28
 * Fix #59, make it possible to create weakrefs to all collection types.
   Thanks @itamarst for reporting it.
 * Fix #58, add __str__ to InvariantException. Thanks @tomprince for reporting it.

v0.11.3, 2015-09-15
  * Fix #57, support pickling of PClasses and PRecords using pmap_field, pvector_field, and pset_field.
    Thanks @radix for reporting this and submitting a fix for it!

v0.11.2, 2015-09-09
  * Fix bug causing potential element loss when reallocating PMap. Thanks to @jml for finding
    this and submitting a PR with a fix!
  * Removed python 3.2 test build from Travis. There is nothing breaking 3.2 compatibility in this
    release but there will be no effort moving forward to keep the 3.2 compatibility.

v0.11.1, 2015-08-24
  * Fix #51, PClass.set() broken when used with string+value argument.
  * #50, make it possible to specify more than one assertion in an invariant
  * #48, make it possible to make recursive type references by using a string
    as type specification.

v0.11.0, 2015-07-11
  * #42, delete() function added to PVector to allow deletion of elements by index
    and range. Will perform a full copy of the vector, no structural sharing.
    Thanks @radix for helping out with this one!
  * Fix #39, explicitly disallow ordering for PMap and PBag, Python 3 style
  * Fix #37, PMap.values()/keys()/items() now returns PVectors instead of lists

v0.10.3, 2015-06-13
  * Fix #40, make it possible to disable the C extension by setting the
    PYRSISTENT_NO_C_EXTENSION environment variable.

v0.10.2, 2015-06-07
  * Fix #38, construction from serialized object for pvector/pset/pmap fields.

v0.10.1, 2015-04-27
  * Fix broken README.rst

v10.0.0, 2015-04-27
  * New type PClass, a persistent version of a Python object. Related to issues #30 and #32.
    Thanks @exarkun and @radix for input on this one!
  * Rename PRecordTypeError -> PTypeError, it is now also raised by PClass
  * New convenience functions, pvector_field, pmap_field and pset_field to create PRecord/PClass
    fields for checked collections. Issues #26 and #36. Thanks to @itamarst for this!
  * Removed deprecated function set_in() on PMap and PVector.
  * Removed deprecated factory function pclass.
  * Major internal restructuring breaking pyrsistent.py into multiple files. This should
    not affect those only using the public interface but if you experience problems please
    let me know.

v0.9.4, 2015-04-20
  * Fix #34, PVector now compares against built in list type

v0.9.3, 2015-04-06
  * Rename pclass back to immutable and deprecate the usage of the pclass function. PClass will be used by
    a new, different type in upcoming releases.
  * Documentation strings for the exceptions introduced in 0.9.2.

v0.9.2, 2015-04-03
  * More informative type errors from checked types, issue #30
  * Support multiple optional types, issue #28

v0.9.1, 2015-02-25
  * Multi level serialization for checked types

v0.9.0, 2015-02-25, Lots of new stuff in this release!
  * Checked types, checked versions of PVector, PMap, PSet that support type and invariant specification.
    Currently lacking proper documentation but I'm working on it.
  * set_in() on PVector and PMap are now deprecated and will be removed in the next release.
    Use transform() instead. set_in() has been updated to use transform() for this release
    this means that some corner error cases behave slightly different than before.
  * Refactoring of the PVector to unify the type. Should not have any user impact as long as
    only the public interface of pyrsistent has been used. PVector is now an abstract base class
    with which the different implementations are registered.
  * Evolvers have been updated to return themselves for evolving operations to allow function chaining.
  * Richer exception messages for KeyErrors and IndexErrors specifying the key/index that caused the failure.
    Thanks @radix for this.
  * Missing attribute on PMaps when accessing with dot-notation now raises an AttributeError instead of a
    KeyError. Issue #21.
  * New function decorator @mutant that freezes all input arguments to a function and the return value.
  * Add __version__ to pyrsistent.py. Issue #23.
  * Fix pickling for pset. Issue #24.

v0.8.0, 2015-01-21
  * New type PRecord. Subtype of PMap that allows explicit, declarative field specification. Thanks @boxed
    for inspiration!
  * Efficient transformations of arbitrary complexity on PMap and PVector. Thanks @boxed for inspiration!
  * Breaking change to the evolver interface. What used to be .pvector(), .pmap() and .pset()
    on the different evolvers has now been unified so that all evolvers have one method .persistent()
    to produce the persistent counterpart. Sorry for any inconvenience.
  * Removed the tests directory from the package.
  * PMap and PSet now contains a copy-function to closer mimic the interface of the dict and set. These
    functions will simply return a reference to self.
  * Removed deprecated alias 'immutable' from pclass.

v0.7.1, 2015-01-17
  * Fixes #14 where a file executed (unexpectedly) during installation was not python 3 compatible.

v0.7.0, 2015-01-04, No 1.0, instead a bunch of new stuff and one API breaking change to PMap.remove().
  * Evolvers for pvector, pmap and pset to allow simple and efficient updates of multiple elements
    in the collection. See the documentation for a closer description.
  * New method mset on pvector to update multiple values in one operation
  * Remove deprecated methods merge and merge_with on PMap
  * Change behavior of PMap.remove, it will now raise a KeyError if the element is not present.
    New method PMap.discard will instead return the original pmap if the element is not present.
    This aligns the PMap with how things are done in the PSet and is closer to the behavior of the
    built in counterparts.

v0.6.3, 2014-11-27
  * Python 2.6 support, thanks @wrmsr!
  * PMap.merge/merge_with renamed to update/update_with. merge/merge_with remains but will be
    removed for 1.0.
  * This is a release candidate for 1.0! Please be aware that PMap.merge/merge_with and immutable()
    will be removed for 1.0.

v0.6.2, 2014-11-03
  * Fix typo causing the pure python vector to be used even if the C implementation was
    available. Thanks @zerc for finding it!

v0.6.1, 2014-10-31
  * Renamed 'immutable' to 'pclass' for consistency but left immutable for compatibility.

v0.6.0, 2014-10-25
  * New data structure, persistent linked list
  * New data structure, persistent double ended queue

v0.5.0, 2014-09-24
  * New data structure, persistent bag / multiset
  * New functions freeze and thaw to recursively convert between python
    built in data types and corresponding pyrsistent data types.
  * All data structures can now be pickled
  * New function merge_in on persistent map which allows a user
    supplied function to implement the merge strategy.

v0.4.0, 2014-09-20
  * Full Python 3 support.
  * Immutable object implemented.
  * Bug fixes in PVector.__repr__() and PMap.__hash__() and index check of PVector.
  * Repr changed to be fully cut and paste compatible
  * Changed assoc() -> set(), assoc_in() -> set_in(), massoc() -> mset().
    Sorry for the API breaking change but I think those names are more pythonic.
  * Improved documentation.

v0.3.1, 2014-06-29
  * assoc() on PSet renamed back to add()

v0.3.0, 2014-06-28
  * Full Sequence protocol support for PVector
  * Full Mapping protocol support for PMap
  * Full Set protocol support for PSet
  * assoc_in() support for both PMap and PVector
  * merge() support for PMap
  * Performance improvements to the PVector C extension speed up allocation

v0.2.1, 2014-06-21
  * Supply the tests with the distribution

v0.2.0, 2014-06-21
  * New C extension with an optimized version of the persistent vector
  * Updated API slightly

v0.1.0, 2013-11-10
  * Initial release.


TODO (in no particular order)
-----------------------------
- Versioned data structure where the different versions can be accessed by index?
- Ordered sets and maps
- A good performance measurement suite
PK�(�\�����$doc/alt-python37-markupsafe/PKG-INFOnu�[���Metadata-Version: 2.1
Name: MarkupSafe
Version: 2.0.1
Summary: Safely add untrusted strings to HTML/XML markup.
Home-page: https://palletsprojects.com/p/markupsafe/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
Maintainer: Pallets
Maintainer-email: contact@palletsprojects.com
License: BSD-3-Clause
Project-URL: Donate, https://palletsprojects.com/donate
Project-URL: Documentation, https://markupsafe.palletsprojects.com/
Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/
Project-URL: Source Code, https://github.com/pallets/markupsafe/
Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/
Project-URL: Twitter, https://twitter.com/PalletsTeam
Project-URL: Chat, https://discord.gg/pallets
Description: MarkupSafe
        ==========
        
        MarkupSafe implements a text object that escapes characters so it is
        safe to use in HTML and XML. Characters that have special meanings are
        replaced so that they display as the actual characters. This mitigates
        injection attacks, meaning untrusted user input can safely be displayed
        on a page.
        
        
        Installing
        ----------
        
        Install and update using `pip`_:
        
        .. code-block:: text
        
            pip install -U MarkupSafe
        
        .. _pip: https://pip.pypa.io/en/stable/quickstart/
        
        
        Examples
        --------
        
        .. code-block:: pycon
        
            >>> from markupsafe import Markup, escape
        
            >>> # escape replaces special characters and wraps in Markup
            >>> escape("<script>alert(document.cookie);</script>")
            Markup('&lt;script&gt;alert(document.cookie);&lt;/script&gt;')
        
            >>> # wrap in Markup to mark text "safe" and prevent escaping
            >>> Markup("<strong>Hello</strong>")
            Markup('<strong>hello</strong>')
        
            >>> escape(Markup("<strong>Hello</strong>"))
            Markup('<strong>hello</strong>')
        
            >>> # Markup is a str subclass
            >>> # methods and operators escape their arguments
            >>> template = Markup("Hello <em>{name}</em>")
            >>> template.format(name='"World"')
            Markup('Hello <em>&#34;World&#34;</em>')
        
        
        Donate
        ------
        
        The Pallets organization develops and supports MarkupSafe and other
        popular packages. In order to grow the community of contributors and
        users, and allow the maintainers to devote more time to the projects,
        `please donate today`_.
        
        .. _please donate today: https://palletsprojects.com/donate
        
        
        Links
        -----
        
        -   Documentation: https://markupsafe.palletsprojects.com/
        -   Changes: https://markupsafe.palletsprojects.com/changes/
        -   PyPI Releases: https://pypi.org/project/MarkupSafe/
        -   Source Code: https://github.com/pallets/markupsafe/
        -   Issue Tracker: https://github.com/pallets/markupsafe/issues/
        -   Website: https://palletsprojects.com/p/markupsafe/
        -   Twitter: https://twitter.com/PalletsTeam
        -   Chat: https://discord.gg/pallets
        
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Text Processing :: Markup :: HTML
Requires-Python: >=3.6
Description-Content-Type: text/x-rst
PK�(�\[a���'doc/alt-python37-markupsafe/LICENSE.rstnu�[���Copyright 2010 Pallets

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.
PK�(�\
��pXX'doc/alt-python37-markupsafe/CHANGES.rstnu�[���Version 2.0.1
-------------

Released 2021-05-18

-   Mark top-level names as exported so type checking understands
    imports in user projects. :pr:`215`
-   Fix some types that weren't available in Python 3.6.0. :pr:`215`


Version 2.0.0
-------------

Released 2021-05-11

-   Drop Python 2.7, 3.4, and 3.5 support.
-   ``Markup.unescape`` uses :func:`html.unescape` to support HTML5
    character references. :pr:`117`
-   Add type annotations for static typing tools. :pr:`149`


Version 1.1.1
-------------

Released 2019-02-23

-   Fix segfault when ``__html__`` method raises an exception when using
    the C speedups. The exception is now propagated correctly. :pr:`109`


Version 1.1.0
-------------

Released 2018-11-05

-   Drop support for Python 2.6 and 3.3.
-   Build wheels for Linux, Mac, and Windows, allowing systems without
    a compiler to take advantage of the C extension speedups. :pr:`104`
-   Use newer CPython API on Python 3, resulting in a 1.5x speedup.
    :pr`64`
-   ``escape`` wraps ``__html__`` result in ``Markup``, consistent with
    documented behavior. :pr:`69`


Version 1.0
-----------

Released 2017-03-07

-   Fixed custom types not invoking ``__unicode__`` when used with
    ``format()``.
-   Added ``__version__`` module attribute.
-   Improve unescape code to leave lone ampersands alone.


Version 0.18
------------

Released 2013-05-22

-   Fixed ``__mul__`` and string splitting on Python 3.


Version 0.17
------------

Released 2013-05-21

-   Fixed a bug with broken interpolation on tuples.


Version 0.16
------------

Released 2013-05-20

-   Improved Python 3 Support and removed 2to3.
-   Removed support for Python 3.2 and 2.5.


Version 0.15
------------

Released 2011-07-20

-   Fixed a typo that caused the library to fail to install on pypy and
    jython.


Version 0.14
------------

Released 2011-07-20

-   Release fix for 0.13.


Version 0.13
------------

Released 2011-07-20

-   Do not attempt to compile extension for PyPy or Jython.
-   Work around some 64bit Windows issues.


Version 0.12
------------

Released 2011-02-17

-   Improved PyPy compatibility.
PK�(�\�b"���&doc/alt-python37-markupsafe/README.rstnu�[���MarkupSafe
==========

MarkupSafe implements a text object that escapes characters so it is
safe to use in HTML and XML. Characters that have special meanings are
replaced so that they display as the actual characters. This mitigates
injection attacks, meaning untrusted user input can safely be displayed
on a page.


Installing
----------

Install and update using `pip`_:

.. code-block:: text

    pip install -U MarkupSafe

.. _pip: https://pip.pypa.io/en/stable/quickstart/


Examples
--------

.. code-block:: pycon

    >>> from markupsafe import Markup, escape

    >>> # escape replaces special characters and wraps in Markup
    >>> escape("<script>alert(document.cookie);</script>")
    Markup('&lt;script&gt;alert(document.cookie);&lt;/script&gt;')

    >>> # wrap in Markup to mark text "safe" and prevent escaping
    >>> Markup("<strong>Hello</strong>")
    Markup('<strong>hello</strong>')

    >>> escape(Markup("<strong>Hello</strong>"))
    Markup('<strong>hello</strong>')

    >>> # Markup is a str subclass
    >>> # methods and operators escape their arguments
    >>> template = Markup("Hello <em>{name}</em>")
    >>> template.format(name='"World"')
    Markup('Hello <em>&#34;World&#34;</em>')


Donate
------

The Pallets organization develops and supports MarkupSafe and other
popular packages. In order to grow the community of contributors and
users, and allow the maintainers to devote more time to the projects,
`please donate today`_.

.. _please donate today: https://palletsprojects.com/donate


Links
-----

-   Documentation: https://markupsafe.palletsprojects.com/
-   Changes: https://markupsafe.palletsprojects.com/changes/
-   PyPI Releases: https://pypi.org/project/MarkupSafe/
-   Source Code: https://github.com/pallets/markupsafe/
-   Issue Tracker: https://github.com/pallets/markupsafe/issues/
-   Website: https://palletsprojects.com/p/markupsafe/
-   Twitter: https://twitter.com/PalletsTeam
-   Chat: https://discord.gg/pallets
PK�(�\�m���#�#doc/alt-python37-six/CHANGESnu�[���Changelog for six
=================

This file lists the changes in each six version.

1.15.0
------

- Pull request #331: Optimize `six.ensure_str` and `six.ensure_binary`.

1.14.0
------

- Issue #288, pull request #289: Add `six.assertNotRegex`.

- Issue #317: `six.moves._dummy_thread` now points to the `_thread` module on
  Python 3.9+. Python 3.7 and later requires threading and deprecated the
  `_dummy_thread` module.

- Issue #308, pull request #314: Remove support for Python 2.6 and Python 3.2.

- Issue #250, issue #165, pull request #251: `six.wraps` now ignores missing
  attributes. This follows the Python 3.2+ standard library behavior.

1.13.0
------

- Issue #298, pull request #299: Add `six.moves.dbm_ndbm`.

- Issue #155: Add `six.moves.collections_abc`, which aliases the `collections`
  module on Python 2-3.2 and the `collections.abc` on Python 3.3 and greater.

- Pull request #304: Re-add distutils fallback in `setup.py`.

- Pull request #305: On Python 3.7, `with_metaclass` supports classes using PEP
  560 features.

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.
PK�(�\C�^&��doc/alt-python37-six/PKG-INFOnu�[���Metadata-Version: 1.2
Name: six
Version: 1.15.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 Python 2.7 and 3.3+.  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.
        
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.7, !=3.0.*, !=3.1.*, !=3.2.*
PK�(�\�^خ**doc/alt-python37-six/LICENSEnu�[���Copyright (c) 2010-2020 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.
PK�(�\�tٚ�doc/alt-python37-six/README.rstnu�[���.. 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 Python 2.7 and 3.3+.  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.
PK�(�\?rfYGG"doc/alt-python37-filelock/PKG-INFOnu�[���Metadata-Version: 2.1
Name: filelock
Version: 3.4.2
Summary: A platform independent file lock.
Home-page: https://github.com/tox-dev/py-filelock
Author: Benedikt Schmitt
Author-email: benedikt@benediktschmitt.de
License: Unlicense
Download-URL: https://github.com/tox-dev/py-filelock/archive/main.zip
Project-URL: Source, https://github.com/tox-dev/py-filelock
Project-URL: Tracker, https://github.com/tox-dev/py-filelock/issues
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: Public Domain
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Topic :: Internet
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: System
Requires-Python: >=3.7
Description-Content-Type: text/markdown
Provides-Extra: docs
Provides-Extra: testing
License-File: LICENSE

# py-filelock

[![PyPI](https://img.shields.io/pypi/v/filelock?style=flat-square)](https://pypi.org/project/filelock/)
[![Supported Python
versions](https://img.shields.io/pypi/pyversions/filelock.svg)](https://pypi.org/project/filelock/)
[![Documentation
status](https://readthedocs.org/projects/py-filelock/badge/?version=latest&style=flat-square)](https://py-filelock.readthedocs.io/en/latest/?badge=latest)
[![Code style:
black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![Downloads](https://pepy.tech/badge/filelock/month)](https://pepy.tech/project/filelock/month)
[![check](https://github.com/tox-dev/py-filelock/actions/workflows/check.yml/badge.svg)](https://github.com/tox-dev/py-filelock/actions/workflows/check.yml)

For more information checkout the [official documentation](https://py-filelock.readthedocs.io/en/latest/api.html).


PK�(�\���a��!doc/alt-python37-filelock/LICENSEnu�[���This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.

In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.

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 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.

For more information, please refer to <http://unlicense.org>
PK�(�\�Ts�~~#doc/alt-python37-filelock/README.mdnu�[���# py-filelock

[![PyPI](https://img.shields.io/pypi/v/filelock?style=flat-square)](https://pypi.org/project/filelock/)
[![Supported Python
versions](https://img.shields.io/pypi/pyversions/filelock.svg)](https://pypi.org/project/filelock/)
[![Documentation
status](https://readthedocs.org/projects/py-filelock/badge/?version=latest&style=flat-square)](https://py-filelock.readthedocs.io/en/latest/?badge=latest)
[![Code style:
black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![Downloads](https://pepy.tech/badge/filelock/month)](https://pepy.tech/project/filelock/month)
[![check](https://github.com/tox-dev/py-filelock/actions/workflows/check.yml/badge.svg)](https://github.com/tox-dev/py-filelock/actions/workflows/check.yml)

For more information checkout the [official documentation](https://py-filelock.readthedocs.io/en/latest/api.html).
PK�(�\!���
�
 doc/alt-python37-jinja2/PKG-INFOnu�[���Metadata-Version: 2.1
Name: Jinja2
Version: 3.0.3
Summary: A very fast and expressive template engine.
Home-page: https://palletsprojects.com/p/jinja/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
Maintainer: Pallets
Maintainer-email: contact@palletsprojects.com
License: BSD-3-Clause
Project-URL: Donate, https://palletsprojects.com/donate
Project-URL: Documentation, https://jinja.palletsprojects.com/
Project-URL: Changes, https://jinja.palletsprojects.com/changes/
Project-URL: Source Code, https://github.com/pallets/jinja/
Project-URL: Issue Tracker, https://github.com/pallets/jinja/issues/
Project-URL: Twitter, https://twitter.com/PalletsTeam
Project-URL: Chat, https://discord.gg/pallets
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Text Processing :: Markup :: HTML
Requires-Python: >=3.6
Description-Content-Type: text/x-rst
Provides-Extra: i18n
License-File: LICENSE.rst

Jinja
=====

Jinja is a fast, expressive, extensible templating engine. Special
placeholders in the template allow writing code similar to Python
syntax. Then the template is passed data to render the final document.

It includes:

-   Template inheritance and inclusion.
-   Define and import macros within templates.
-   HTML templates can use autoescaping to prevent XSS from untrusted
    user input.
-   A sandboxed environment can safely render untrusted templates.
-   AsyncIO support for generating templates and calling async
    functions.
-   I18N support with Babel.
-   Templates are compiled to optimized Python code just-in-time and
    cached, or can be compiled ahead-of-time.
-   Exceptions point to the correct line in templates to make debugging
    easier.
-   Extensible filters, tests, functions, and even syntax.

Jinja's philosophy is that while application logic belongs in Python if
possible, it shouldn't make the template designer's job difficult by
restricting functionality too much.


Installing
----------

Install and update using `pip`_:

.. code-block:: text

    $ pip install -U Jinja2

.. _pip: https://pip.pypa.io/en/stable/getting-started/


In A Nutshell
-------------

.. code-block:: jinja

    {% extends "base.html" %}
    {% block title %}Members{% endblock %}
    {% block content %}
      <ul>
      {% for user in users %}
        <li><a href="{{ user.url }}">{{ user.username }}</a></li>
      {% endfor %}
      </ul>
    {% endblock %}


Donate
------

The Pallets organization develops and supports Jinja and other popular
packages. In order to grow the community of contributors and users, and
allow the maintainers to devote more time to the projects, `please
donate today`_.

.. _please donate today: https://palletsprojects.com/donate


Links
-----

-   Documentation: https://jinja.palletsprojects.com/
-   Changes: https://jinja.palletsprojects.com/changes/
-   PyPI Releases: https://pypi.org/project/Jinja2/
-   Source Code: https://github.com/pallets/jinja/
-   Issue Tracker: https://github.com/pallets/jinja/issues/
-   Website: https://palletsprojects.com/p/jinja/
-   Twitter: https://twitter.com/PalletsTeam
-   Chat: https://discord.gg/pallets


PK�(�\��ֲ��#doc/alt-python37-jinja2/LICENSE.rstnu�[���Copyright 2007 Pallets

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.
PK�(�\���+��2doc/alt-python37-jinja2/examples/basic/debugger.pynu�[���from jinja2 import Environment
from jinja2.loaders import FileSystemLoader

env = Environment(loader=FileSystemLoader("templates"))
tmpl = env.get_template("broken.html")
print(tmpl.render(seq=[3, 2, 4, 5, 3, 2, 0, 2, 1]))
PK�(�\�\����Hdoc/alt-python37-jinja2/examples/basic/test_filter_and_linestatements.pynu�[���from jinja2 import Environment

env = Environment(
    line_statement_prefix="%", variable_start_string="${", variable_end_string="}"
)
tmpl = env.from_string(
    """\
% macro foo()
    ${caller(42)}
% endmacro
<ul>
% for item in seq
    <li>${item}</li>
% endfor
</ul>
% call(var) foo()
    [${var}]
% endcall
% filter escape
    <hello world>
    % for item in [1, 2, 3]
      -  ${item}
    % endfor
% endfilter
"""
)
print(tmpl.render(seq=range(10)))
PK�(�\��k��.doc/alt-python37-jinja2/examples/basic/test.pynu�[���from jinja2 import Environment
from jinja2.loaders import DictLoader

env = Environment(
    loader=DictLoader(
        {
            "child.html": """\
{% extends default_layout or 'default.html' %}
{% include helpers = 'helpers.html' %}
{% macro get_the_answer() %}42{% endmacro %}
{% title = 'Hello World' %}
{% block body %}
    {{ get_the_answer() }}
    {{ helpers.conspirate() }}
{% endblock %}
""",
            "default.html": """\
<!doctype html>
<title>{{ title }}</title>
{% block body %}{% endblock %}
""",
            "helpers.html": """\
{% macro conspirate() %}23{% endmacro %}
""",
        }
    )
)
tmpl = env.get_template("child.html")
print(tmpl.render())
PK�(�\�ͼ���5doc/alt-python37-jinja2/examples/basic/inheritance.pynu�[���from jinja2 import Environment
from jinja2.loaders import DictLoader

env = Environment(
    loader=DictLoader(
        {
            "a": "[A[{% block body %}{% endblock %}]]",
            "b": "{% extends 'a' %}{% block body %}[B]{% endblock %}",
            "c": "{% extends 'b' %}{% block body %}###{{ super() }}###{% endblock %}",
        }
    )
)
print(env.get_template("c").render())
PK�(�\֩'1  3doc/alt-python37-jinja2/examples/basic/translate.pynu�[���from jinja2 import Environment

env = Environment(extensions=["jinja2.ext.i18n"])
env.globals["gettext"] = {"Hello %(user)s!": "Hallo %(user)s!"}.__getitem__
env.globals["ngettext"] = lambda s, p, n: {
    "%(count)s user": "%(count)d Benutzer",
    "%(count)s users": "%(count)d Benutzer",
}[s if n == 1 else p]
print(
    env.from_string(
        """\
{% trans %}Hello {{ user }}!{% endtrans %}
{% trans count=users|count -%}
{{ count }} user{% pluralize %}{{ count }} users
{% endtrans %}
"""
    ).render(user="someone", users=[1, 2, 3])
)
PK�(�\�*D	@@?doc/alt-python37-jinja2/examples/basic/templates/subbroken.htmlnu�[���{% macro may_break(item) -%}
  [{{ item / 0 }}]
{%- endmacro %}
PK�(�\���x||<doc/alt-python37-jinja2/examples/basic/templates/broken.htmlnu�[���{% from 'subbroken.html' import may_break %}
<ul>
{% for item in seq %}
  <li>{{ may_break(item) }}</li>
{% endfor %}
</ul>
PK�(�\�9�:--/doc/alt-python37-jinja2/examples/basic/cycle.pynu�[���from jinja2 import Environment

env = Environment(
    line_statement_prefix="#", variable_start_string="${", variable_end_string="}"
)
print(
    env.from_string(
        """\
<ul>
# for item in range(10)
    <li class="${loop.cycle('odd', 'even')}">${item}</li>
# endfor
</ul>\
"""
    ).render()
)
PK�(�\���--:doc/alt-python37-jinja2/examples/basic/test_loop_filter.pynu�[���from jinja2 import Environment

tmpl = Environment().from_string(
    """\
<ul>
{%- for item in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] if item % 2 == 0 %}
    <li>{{ loop.index }} / {{ loop.length }}: {{ item }}</li>
{%- endfor %}
</ul>
if condition: {{ 1 if foo else 0 }}
"""
)
print(tmpl.render(foo=True))
PK�(�\�������#doc/alt-python37-jinja2/CHANGES.rstnu�[���.. currentmodule:: jinja2

Version 3.0.3
-------------

Released 2021-11-09

-   Fix traceback rewriting internals for Python 3.10 and 3.11.
    :issue:`1535`
-   Fix how the native environment treats leading and trailing spaces
    when parsing values on Python 3.10. :pr:`1537`
-   Improve async performance by avoiding checks for common types.
    :issue:`1514`
-   Revert change to ``hash(Node)`` behavior. Nodes are hashed by id
    again :issue:`1521`
-   ``PackageLoader`` works when the package is a single module file.
    :issue:`1512`


Version 3.0.2
-------------

Released 2021-10-04

-   Fix a loop scoping bug that caused assignments in nested loops
    to still be referenced outside of it. :issue:`1427`
-   Make ``compile_templates`` deterministic for filter and import
    names. :issue:`1452, 1453`
-   Revert an unintended change that caused ``Undefined`` to act like
    ``StrictUndefined`` for the ``in`` operator. :issue:`1448`
-   Imported macros have access to the current template globals in async
    environments. :issue:`1494`
-   ``PackageLoader`` will not include a current directory (.) path
    segment. This allows loading templates from the root of a zip
    import. :issue:`1467`


Version 3.0.1
-------------

Released 2021-05-18

-   Update MarkupSafe dependency to >= 2.0. :pr:`1418`
-   Mark top-level names as exported so type checking understands
    imports in user projects. :issue:`1426`
-   Fix some types that weren't available in Python 3.6.0. :issue:`1433`
-   The deprecation warning for unneeded ``autoescape`` and ``with_``
    extensions shows more relevant context. :issue:`1429`
-   Fixed calling deprecated ``jinja2.Markup`` without an argument.
    Use ``markupsafe.Markup`` instead. :issue:`1438`
-   Calling sync ``render`` for an async template uses ``asyncio.run``
    on Python >= 3.7. This fixes a deprecation that Python 3.10
    introduces. :issue:`1443`


Version 3.0.0
-------------

Released 2021-05-11

-   Drop support for Python 2.7 and 3.5.
-   Bump MarkupSafe dependency to >=1.1.
-   Bump Babel optional dependency to >=2.1.
-   Remove code that was marked deprecated.
-   Add type hinting. :pr:`1412`
-   Use :pep:`451` API to load templates with
    :class:`~loaders.PackageLoader`. :issue:`1168`
-   Fix a bug that caused imported macros to not have access to the
    current template's globals. :issue:`688`
-   Add ability to ignore ``trim_blocks`` using ``+%}``. :issue:`1036`
-   Fix a bug that caused custom async-only filters to fail with
    constant input. :issue:`1279`
-   Fix UndefinedError incorrectly being thrown on an undefined variable
    instead of ``Undefined`` being returned on
    ``NativeEnvironment`` on Python 3.10. :issue:`1335`
-   Blocks can be marked as ``required``. They must be overridden at
    some point, but not necessarily by the direct child. :issue:`1147`
-   Deprecate the ``autoescape`` and ``with`` extensions, they are
    built-in to the compiler. :issue:`1203`
-   The ``urlize`` filter recognizes ``mailto:`` links and takes
    ``extra_schemes`` (or ``env.policies["urlize.extra_schemes"]``) to
    recognize other schemes. It tries to balance parentheses within a
    URL instead of ignoring trailing characters. The parsing in general
    has been updated to be more efficient and match more cases. URLs
    without a scheme are linked as ``https://`` instead of ``http://``.
    :issue:`522, 827, 1172`, :pr:`1195`
-   Filters that get attributes, such as ``map`` and ``groupby``, can
    use a false or empty value as a default. :issue:`1331`
-   Fix a bug that prevented variables set in blocks or loops from
    being accessed in custom context functions. :issue:`768`
-   Fix a bug that caused scoped blocks from accessing special loop
    variables. :issue:`1088`
-   Update the template globals when calling
    ``Environment.get_template(globals=...)`` even if the template was
    already loaded. :issue:`295`
-   Do not raise an error for undefined filters in unexecuted
    if-statements and conditional expressions. :issue:`842`
-   Add ``is filter`` and ``is test`` tests to test if a name is a
    registered filter or test. This allows checking if a filter is
    available in a template before using it. Test functions can be
    decorated with ``@pass_environment``, ``@pass_eval_context``,
    or ``@pass_context``. :issue:`842`, :pr:`1248`
-   Support ``pgettext`` and ``npgettext`` (message contexts) in i18n
    extension. :issue:`441`
-   The ``|indent`` filter's ``width`` argument can be a string to
    indent by. :pr:`1167`
-   The parser understands hex, octal, and binary integer literals.
    :issue:`1170`
-   ``Undefined.__contains__`` (``in``) raises an ``UndefinedError``
    instead of a ``TypeError``. :issue:`1198`
-   ``Undefined`` is iterable in an async environment. :issue:`1294`
-   ``NativeEnvironment`` supports async mode. :issue:`1362`
-   Template rendering only treats ``\n``, ``\r\n`` and ``\r`` as line
    breaks. Other characters are left unchanged. :issue:`769, 952, 1313`
-   ``|groupby`` filter takes an optional ``default`` argument.
    :issue:`1359`
-   The function and filter decorators have been renamed and unified.
    The old names are deprecated. :issue:`1381`

    -   ``pass_context`` replaces ``contextfunction`` and
        ``contextfilter``.
    -   ``pass_eval_context`` replaces ``evalcontextfunction`` and
        ``evalcontextfilter``
    -   ``pass_environment`` replaces ``environmentfunction`` and
        ``environmentfilter``.

-   Async support no longer requires Jinja to patch itself. It must
    still be enabled with ``Environment(enable_async=True)``.
    :issue:`1390`
-   Overriding ``Context.resolve`` is deprecated, override
    ``resolve_or_missing`` instead. :issue:`1380`


Version 2.11.3
--------------

Released 2021-01-31

-   Improve the speed of the ``urlize`` filter by reducing regex
    backtracking. Email matching requires a word character at the start
    of the domain part, and only word characters in the TLD. :pr:`1343`


Version 2.11.2
--------------

Released 2020-04-13

-   Fix a bug that caused callable objects with ``__getattr__``, like
    :class:`~unittest.mock.Mock` to be treated as a
    :func:`contextfunction`. :issue:`1145`
-   Update ``wordcount`` filter to trigger :class:`Undefined` methods
    by wrapping the input in :func:`soft_str`. :pr:`1160`
-   Fix a hang when displaying tracebacks on Python 32-bit.
    :issue:`1162`
-   Showing an undefined error for an object that raises
    ``AttributeError`` on access doesn't cause a recursion error.
    :issue:`1177`
-   Revert changes to :class:`~loaders.PackageLoader` from 2.10 which
    removed the dependency on setuptools and pkg_resources, and added
    limited support for namespace packages. The changes caused issues
    when using Pytest. Due to the difficulty in supporting Python 2 and
    :pep:`451` simultaneously, the changes are reverted until 3.0.
    :pr:`1182`
-   Fix line numbers in error messages when newlines are stripped.
    :pr:`1178`
-   The special ``namespace()`` assignment object in templates works in
    async environments. :issue:`1180`
-   Fix whitespace being removed before tags in the middle of lines when
    ``lstrip_blocks`` is enabled. :issue:`1138`
-   :class:`~nativetypes.NativeEnvironment` doesn't evaluate
    intermediate strings during rendering. This prevents early
    evaluation which could change the value of an expression.
    :issue:`1186`


Version 2.11.1
--------------

Released 2020-01-30

-   Fix a bug that prevented looking up a key after an attribute
    (``{{ data.items[1:] }}``) in an async template. :issue:`1141`


Version 2.11.0
--------------

Released 2020-01-27

-   Drop support for Python 2.6, 3.3, and 3.4. This will be the last
    version to support Python 2.7 and 3.5.
-   Added a new ``ChainableUndefined`` class to support getitem and
    getattr on an undefined object. :issue:`977`
-   Allow ``{%+`` syntax (with NOP behavior) when ``lstrip_blocks`` is
    disabled. :issue:`748`
-   Added a ``default`` parameter for the ``map`` filter. :issue:`557`
-   Exclude environment globals from
    :func:`meta.find_undeclared_variables`. :issue:`931`
-   Float literals can be written with scientific notation, like
    2.56e-3. :issue:`912`, :pr:`922`
-   Int and float literals can be written with the '_' separator for
    legibility, like 12_345. :pr:`923`
-   Fix a bug causing deadlocks in ``LRUCache.setdefault``. :pr:`1000`
-   The ``trim`` filter takes an optional string of characters to trim.
    :pr:`828`
-   A new ``jinja2.ext.debug`` extension adds a ``{% debug %}`` tag to
    quickly dump the current context and available filters and tests.
    :issue:`174`, :pr:`798, 983`
-   Lexing templates with large amounts of whitespace is much faster.
    :issue:`857`, :pr:`858`
-   Parentheses around comparisons are preserved, so
    ``{{ 2 * (3 < 5) }}`` outputs "2" instead of "False".
    :issue:`755`, :pr:`938`
-   Add new ``boolean``, ``false``, ``true``, ``integer`` and ``float``
    tests. :pr:`824`
-   The environment's ``finalize`` function is only applied to the
    output of expressions (constant or not), not static template data.
    :issue:`63`
-   When providing multiple paths to ``FileSystemLoader``, a template
    can have the same name as a directory. :issue:`821`
-   Always return :class:`Undefined` when omitting the ``else`` clause
    in a ``{{ 'foo' if bar }}`` expression, regardless of the
    environment's ``undefined`` class. Omitting the ``else`` clause is a
    valid shortcut and should not raise an error when using
    :class:`StrictUndefined`. :issue:`710`, :pr:`1079`
-   Fix behavior of ``loop`` control variables such as ``length`` and
    ``revindex0`` when looping over a generator. :issue:`459, 751, 794`,
    :pr:`993`
-   Async support is only loaded the first time an environment enables
    it, in order to avoid a slow initial import. :issue:`765`
-   In async environments, the ``|map`` filter will await the filter
    call if needed. :pr:`913`
-   In for loops that access ``loop`` attributes, the iterator is not
    advanced ahead of the current iteration unless ``length``,
    ``revindex``, ``nextitem``, or ``last`` are accessed. This makes it
    less likely to break ``groupby`` results. :issue:`555`, :pr:`1101`
-   In async environments, the ``loop`` attributes ``length`` and
    ``revindex`` work for async iterators. :pr:`1101`
-   In async environments, values from attribute/property access will
    be awaited if needed. :pr:`1101`
-   :class:`~loader.PackageLoader` doesn't depend on setuptools or
    pkg_resources. :issue:`970`
-   ``PackageLoader`` has limited support for :pep:`420` namespace
    packages. :issue:`1097`
-   Support :class:`os.PathLike` objects in
    :class:`~loader.FileSystemLoader` and :class:`~loader.ModuleLoader`.
    :issue:`870`
-   :class:`~nativetypes.NativeTemplate` correctly handles quotes
    between expressions. ``"'{{ a }}', '{{ b }}'"`` renders as the tuple
    ``('1', '2')`` rather than the string ``'1, 2'``. :issue:`1020`
-   Creating a :class:`~nativetypes.NativeTemplate` directly creates a
    :class:`~nativetypes.NativeEnvironment` instead of a default
    :class:`Environment`. :issue:`1091`
-   After calling ``LRUCache.copy()``, the copy's queue methods point to
    the correct queue. :issue:`843`
-   Compiling templates always writes UTF-8 instead of defaulting to the
    system encoding. :issue:`889`
-   ``|wordwrap`` filter treats existing newlines as separate paragraphs
    to be wrapped individually, rather than creating short intermediate
    lines. :issue:`175`
-   Add ``break_on_hyphens`` parameter to ``|wordwrap`` filter.
    :issue:`550`
-   Cython compiled functions decorated as context functions will be
    passed the context. :pr:`1108`
-   When chained comparisons of constants are evaluated at compile time,
    the result follows Python's behavior of returning ``False`` if any
    comparison returns ``False``, rather than only the last one.
    :issue:`1102`
-   Tracebacks for exceptions in templates show the correct line numbers
    and source for Python >= 3.7. :issue:`1104`
-   Tracebacks for template syntax errors in Python 3 no longer show
    internal compiler frames. :issue:`763`
-   Add a ``DerivedContextReference`` node that can be used by
    extensions to get the current context and local variables such as
    ``loop``. :issue:`860`
-   Constant folding during compilation is applied to some node types
    that were previously overlooked. :issue:`733`
-   ``TemplateSyntaxError.source`` is not empty when raised from an
    included template. :issue:`457`
-   Passing an ``Undefined`` value to ``get_template`` (such as through
    ``extends``, ``import``, or ``include``), raises an
    ``UndefinedError`` consistently. ``select_template`` will show the
    undefined message in the list of attempts rather than the empty
    string. :issue:`1037`
-   ``TemplateSyntaxError`` can be pickled. :pr:`1117`


Version 2.10.3
--------------

Released 2019-10-04

-   Fix a typo in Babel entry point in ``setup.py`` that was preventing
    installation.


Version 2.10.2
--------------

Released 2019-10-04

-   Fix Python 3.7 deprecation warnings.
-   Using ``range`` in the sandboxed environment uses ``xrange`` on
    Python 2 to avoid memory use. :issue:`933`
-   Use Python 3.7's better traceback support to avoid a core dump when
    using debug builds of Python 3.7. :issue:`1050`


Version 2.10.1
--------------

Released 2019-04-06

-   ``SandboxedEnvironment`` securely handles ``str.format_map`` in
    order to prevent code execution through untrusted format strings.
    The sandbox already handled ``str.format``.


Version 2.10
------------

Released 2017-11-08

-   Added a new extension node called ``OverlayScope`` which can be used
    to create an unoptimized scope that will look up all variables from
    a derived context.
-   Added an ``in`` test that works like the in operator. This can be
    used in combination with ``reject`` and ``select``.
-   Added ``previtem`` and ``nextitem`` to loop contexts, providing
    access to the previous/next item in the loop. If such an item does
    not exist, the value is undefined.
-   Added ``changed(*values)`` to loop contexts, providing an easy way
    of checking whether a value has changed since the last iteration (or
    rather since the last call of the method)
-   Added a ``namespace`` function that creates a special object which
    allows attribute assignment using the ``set`` tag. This can be used
    to carry data across scopes, e.g. from a loop body to code that
    comes after the loop.
-   Added a ``trimmed`` modifier to ``{% trans %}`` to strip linebreaks
    and surrounding whitespace. Also added a new policy to enable this
    for all ``trans`` blocks.
-   The ``random`` filter is no longer incorrectly constant folded and
    will produce a new random choice each time the template is rendered.
    :pr:`478`
-   Added a ``unique`` filter. :pr:`469`
-   Added ``min`` and ``max`` filters. :pr:`475`
-   Added tests for all comparison operators: ``eq``, ``ne``, ``lt``,
    ``le``, ``gt``, ``ge``. :pr:`665`
-   ``import`` statement cannot end with a trailing comma. :pr:`617`,
    :pr:`618`
-   ``indent`` filter will not indent blank lines by default. :pr:`685`
-   Add ``reverse`` argument for ``dictsort`` filter. :pr:`692`
-   Add a ``NativeEnvironment`` that renders templates to native Python
    types instead of strings. :pr:`708`
-   Added filter support to the block ``set`` tag. :pr:`489`
-   ``tojson`` filter marks output as safe to match documented behavior.
    :pr:`718`
-   Resolved a bug where getting debug locals for tracebacks could
    modify template context.
-   Fixed a bug where having many ``{% elif ... %}`` blocks resulted in
    a "too many levels of indentation" error. These blocks now compile
    to native ``elif ..:`` instead of ``else: if ..:`` :issue:`759`


Version 2.9.6
-------------

Released 2017-04-03

-   Fixed custom context behavior in fast resolve mode :issue:`675`


Version 2.9.5
-------------

Released 2017-01-28

-   Restored the original repr of the internal ``_GroupTuple`` because
    this caused issues with ansible and it was an unintended change.
    :issue:`654`
-   Added back support for custom contexts that override the old
    ``resolve`` method since it was hard for people to spot that this
    could cause a regression.
-   Correctly use the buffer for the else block of for loops. This
    caused invalid syntax errors to be caused on 2.x and completely
    wrong behavior on Python 3 :issue:`669`
-   Resolve an issue where the ``{% extends %}`` tag could not be used
    with async environments. :issue:`668`
-   Reduce memory footprint slightly by reducing our unicode database
    dump we use for identifier matching on Python 3 :issue:`666`
-   Fixed autoescaping not working for macros in async compilation mode.
    :issue:`671`


Version 2.9.4
-------------

Released 2017-01-10

-   Solved some warnings for string literals. :issue:`646`
-   Increment the bytecode cache version which was not done due to an
    oversight before.
-   Corrected bad code generation and scoping for filtered loops.
    :issue:`649`
-   Resolved an issue where top-level output silencing after known
    extend blocks could generate invalid code when blocks where
    contained in if statements. :issue:`651`
-   Made the ``truncate.leeway`` default configurable to improve
    compatibility with older templates.


Version 2.9.3
-------------

Released 2017-01-08

-   Restored the use of blocks in macros to the extend that was possible
    before. On Python 3 it would render a generator repr instead of the
    block contents. :issue:`645`
-   Set a consistent behavior for assigning of variables in inner scopes
    when the variable is also read from an outer scope. This now sets
    the intended behavior in all situations however it does not restore
    the old behavior where limited assignments to outer scopes was
    possible. For more information and a discussion see :issue:`641`
-   Resolved an issue where ``block scoped`` would not take advantage of
    the new scoping rules. In some more exotic cases a variable
    overridden in a local scope would not make it into a block.
-   Change the code generation of the ``with`` statement to be in line
    with the new scoping rules. This resolves some unlikely bugs in edge
    cases. This also introduces a new internal ``With`` node that can be
    used by extensions.


Version 2.9.2
-------------

Released 2017-01-08

-   Fixed a regression that caused for loops to not be able to use the
    same variable for the target as well as source iterator.
    :issue:`640`
-   Add support for a previously unknown behavior of macros. It used to
    be possible in some circumstances to explicitly provide a caller
    argument to macros. While badly buggy and unintended it turns out
    that this is a common case that gets copy pasted around. To not
    completely break backwards compatibility with the most common cases
    it's now possible to provide an explicit keyword argument for caller
    if it's given an explicit default. :issue:`642`


Version 2.9.1
-------------

Released 2017-01-07

-   Resolved a regression with call block scoping for macros. Nested
    caller blocks that used the same identifiers as outer macros could
    refer to the wrong variable incorrectly.


Version 2.9
-----------

Released 2017-01-07, codename Derivation

-   Change cache key definition in environment. This fixes a performance
    regression introduced in 2.8.
-   Added support for ``generator_stop`` on supported Python versions
    (Python 3.5 and later)
-   Corrected a long standing issue with operator precedence of math
    operations not being what was expected.
-   Added support for Python 3.6 async iterators through a new async
    mode.
-   Added policies for filter defaults and similar things.
-   Urlize now sets "rel noopener" by default.
-   Support attribute fallback for old-style classes in 2.x.
-   Support toplevel set statements in extend situations.
-   Restored behavior of Cycler for Python 3 users.
-   Subtraction now follows the same behavior as other operators on
    undefined values.
-   ``map`` and friends will now give better error messages if you
    forgot to quote the parameter.
-   Depend on MarkupSafe 0.23 or higher.
-   Improved the ``truncate`` filter to support better truncation in
    case the string is barely truncated at all.
-   Change the logic for macro autoescaping to be based on the runtime
    autoescaping information at call time instead of macro define time.
-   Ported a modified version of the ``tojson`` filter from Flask to
    Jinja and hooked it up with the new policy framework.
-   Block sets are now marked ``safe`` by default.
-   On Python 2 the asciification of ASCII strings can now be disabled
    with the ``compiler.ascii_str`` policy.
-   Tests now no longer accept an arbitrary expression as first argument
    but a restricted one. This means that you can now properly use
    multiple tests in one expression without extra parentheses. In
    particular you can now write ``foo is divisibleby 2 or foo is
    divisibleby 3`` as you would expect.
-   Greatly changed the scoping system to be more consistent with what
    template designers and developers expect. There is now no more magic
    difference between the different include and import constructs.
    Context is now always propagated the same way. The only remaining
    differences is the defaults for ``with context`` and ``without
    context``.
-   The ``with`` and ``autoescape`` tags are now built-in.
-   Added the new ``select_autoescape`` function which helps configuring
    better autoescaping easier.
-   Fixed a runtime error in the sandbox when attributes of async
    generators were accessed.


Version 2.8.1
-------------

Released 2016-12-29

-   Fixed the ``for_qs`` flag for ``urlencode``.
-   Fixed regression when applying ``int`` to non-string values.
-   SECURITY: if the sandbox mode is used format expressions are now
    sandboxed with the same rules as in Jinja. This solves various
    information leakage problems that can occur with format strings.


Version 2.8
-----------

Released 2015-07-26, codename Replacement

-   Added ``target`` parameter to urlize function.
-   Added support for ``followsymlinks`` to the file system loader.
-   The truncate filter now counts the length.
-   Added equalto filter that helps with select filters.
-   Changed cache keys to use absolute file names if available instead
    of load names.
-   Fixed loop length calculation for some iterators.
-   Changed how Jinja enforces strings to be native strings in Python 2
    to work when people break their default encoding.
-   Added ``make_logging_undefined`` which returns an undefined
    object that logs failures into a logger.
-   If unmarshalling of cached data fails the template will be reloaded
    now.
-   Implemented a block ``set`` tag.
-   Default cache size was increased to 400 from a low 50.
-   Fixed ``is number`` test to accept long integers in all Python
    versions.
-   Changed ``is number`` to accept Decimal as a number.
-   Added a check for default arguments followed by non-default
    arguments. This change makes ``{% macro m(x, y=1, z) %}`` a syntax
    error. The previous behavior for this code was broken anyway
    (resulting in the default value being applied to ``y``).
-   Add ability to use custom subclasses of
    ``jinja2.compiler.CodeGenerator`` and ``jinja2.runtime.Context`` by
    adding two new attributes to the environment
    (``code_generator_class`` and ``context_class``). :pr:`404`
-   Added support for context/environment/evalctx decorator functions on
    the finalize callback of the environment.
-   Escape query strings for urlencode properly. Previously slashes were
    not escaped in that place.
-   Add 'base' parameter to 'int' filter.


Version 2.7.3
-------------

Released 2014-06-06

-   Security issue: Corrected the security fix for the cache folder.
    This fix was provided by RedHat.


Version 2.7.2
-------------

Released 2014-01-10

-   Prefix loader was not forwarding the locals properly to inner
    loaders. This is now fixed.
-   Security issue: Changed the default folder for the filesystem cache
    to be user specific and read and write protected on UNIX systems.
    See `Debian bug 734747`_ for more information.

.. _Debian bug 734747: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=734747


Version 2.7.1
-------------

Released 2013-08-07

-   Fixed a bug with ``call_filter`` not working properly on environment
    and context filters.
-   Fixed lack of Python 3 support for bytecode caches.
-   Reverted support for defining blocks in included templates as this
    broke existing templates for users.
-   Fixed some warnings with hashing of undefineds and nodes if Python
    is run with warnings for Python 3.
-   Added support for properly hashing undefined objects.
-   Fixed a bug with the title filter not working on already uppercase
    strings.


Version 2.7
-----------

Released 2013-05-20, codename Translation

-   Choice and prefix loaders now dispatch source and template lookup
    separately in order to work in combination with module loaders as
    advertised.
-   Fixed filesizeformat.
-   Added a non-silent option for babel extraction.
-   Added ``urlencode`` filter that automatically quotes values for URL
    safe usage with utf-8 as only supported encoding. If applications
    want to change this encoding they can override the filter.
-   Added ``keep-trailing-newline`` configuration to environments and
    templates to optionally preserve the final trailing newline.
-   Accessing ``last`` on the loop context no longer causes the iterator
    to be consumed into a list.
-   Python requirement changed: 2.6, 2.7 or >= 3.3 are required now,
    supported by same source code, using the "six" compatibility
    library.
-   Allow ``contextfunction`` and other decorators to be applied to
    ``__call__``.
-   Added support for changing from newline to different signs in the
    ``wordwrap`` filter.
-   Added support for ignoring memcache errors silently.
-   Added support for keeping the trailing newline in templates.
-   Added finer grained support for stripping whitespace on the left
    side of blocks.
-   Added ``map``, ``select``, ``reject``, ``selectattr`` and
    ``rejectattr`` filters.
-   Added support for ``loop.depth`` to figure out how deep inside a
    recursive loop the code is.
-   Disabled py_compile for pypy and python 3.


Version 2.6
-----------

Released 2011-07-24, codename Convolution

-   Internal attributes now raise an internal attribute error now
    instead of returning an undefined. This fixes problems when passing
    undefined objects to Python semantics expecting APIs.
-   Traceback support now works properly for PyPy. (Tested with 1.4)
-   Implemented operator intercepting for sandboxed environments. This
    allows application developers to disable builtin operators for
    better security. (For instance limit the mathematical operators to
    actual integers instead of longs)
-   Groupby filter now supports dotted notation for grouping by
    attributes of attributes.
-   Scoped blocks now properly treat toplevel assignments and imports.
    Previously an import suddenly "disappeared" in a scoped block.
-   Automatically detect newer Python interpreter versions before
    loading code from bytecode caches to prevent segfaults on invalid
    opcodes. The segfault in earlier Jinja versions here was not a
    Jinja bug but a limitation in the underlying Python interpreter. If
    you notice Jinja segfaulting in earlier versions after an upgrade
    of the Python interpreter you don't have to upgrade, it's enough to
    flush the bytecode cache. This just no longer makes this necessary,
    Jinja will automatically detect these cases now.
-   The sum filter can now sum up values by attribute. This is a
    backwards incompatible change. The argument to the filter previously
    was the optional starting index which defaults to zero. This now
    became the second argument to the function because it's rarely used.
-   Like sum, sort now also makes it possible to order items by
    attribute.
-   Like sum and sort, join now also is able to join attributes of
    objects as string.
-   The internal eval context now has a reference to the environment.
-   Added a mapping test to see if an object is a dict or an object with
    a similar interface.


Version 2.5.5
-------------

Released 2010-10-18

-   Built documentation is no longer part of release.


Version 2.5.4
-------------

Released 2010-10-17

-   Fixed extensions not loading properly with overlays.
-   Work around a bug in cpython for the debugger that causes segfaults
    on 64bit big-endian architectures.


Version 2.5.3
-------------

Released 2010-10-17

-   Fixed an operator precedence error introduced in 2.5.2. Statements
    like "-foo.bar" had their implicit parentheses applied around the
    first part of the expression ("(-foo).bar") instead of the more
    correct "-(foo.bar)".


Version 2.5.2
-------------

Released 2010-08-18

-   Improved setup.py script to better work with assumptions people
    might still have from it (``--with-speedups``).
-   Fixed a packaging error that excluded the new debug support.


Version 2.5.1
-------------

Released 2010-08-17

-   StopIteration exceptions raised by functions called from templates
    are now intercepted and converted to undefineds. This solves a lot
    of debugging grief. (StopIteration is used internally to abort
    template execution)
-   Improved performance of macro calls slightly.
-   Babel extraction can now properly extract newstyle gettext calls.
-   Using the variable ``num`` in newstyle gettext for something else
    than the pluralize count will no longer raise a :exc:`KeyError`.
-   Removed builtin markup class and switched to markupsafe. For
    backwards compatibility the pure Python implementation still exists
    but is pulled from markupsafe by the Jinja developers. The debug
    support went into a separate feature called "debugsupport" and is
    disabled by default because it is only relevant for Python 2.4
-   Fixed an issue with unary operators having the wrong precedence.


Version 2.5
-----------

Released 2010-05-29, codename Incoherence

-   Improved the sort filter (should have worked like this for a long
    time) by adding support for case insensitive searches.
-   Fixed a bug for getattribute constant folding.
-   Support for newstyle gettext translations which result in a nicer
    in-template user interface and more consistent catalogs.
-   It's now possible to register extensions after an environment was
    created.


Version 2.4.1
-------------

Released 2010-04-20

-   Fixed an error reporting bug for undefined.


Version 2.4
-----------

Released 2010-04-13, codename Correlation

-   The environment template loading functions now transparently pass
    through a template object if it was passed to it. This makes it
    possible to import or extend from a template object that was passed
    to the template.
-   Added a ``ModuleLoader`` that can load templates from
    precompiled sources. The environment now features a method to
    compile the templates from a configured loader into a zip file or
    folder.
-   The _speedups C extension now supports Python 3.
-   Added support for autoescaping toggling sections and support for
    evaluation contexts.
-   Extensions have a priority now.


Version 2.3.1
-------------

Released 2010-02-19

-   Fixed an error reporting bug on all python versions
-   Fixed an error reporting bug on Python 2.4


Version 2.3
-----------

Released 2010-02-10, codename 3000 Pythons

-   Fixes issue with code generator that causes unbound variables to be
    generated if set was used in if-blocks and other small identifier
    problems.
-   Include tags are now able to select between multiple templates and
    take the first that exists, if a list of templates is given.
-   Fixed a problem with having call blocks in outer scopes that have an
    argument that is also used as local variable in an inner frame
    :issue:`360`.
-   Greatly improved error message reporting :pr:`339`
-   Implicit tuple expressions can no longer be totally empty. This
    change makes ``{% if %}`` a syntax error now. :issue:`364`
-   Added support for translator comments if extracted via babel.
-   Added with-statement extension.
-   Experimental Python 3 support.


Version 2.2.1
-------------

Released 2009-09-14

-   Fixes some smaller problems for Jinja on Jython.


Version 2.2
-----------

Released 2009-09-13, codename Kong

-   Include statements can now be marked with ``ignore missing`` to skip
    non existing templates.
-   Priority of ``not`` raised. It's now possible to write ``not foo in
    bar`` as an alias to ``foo not in bar`` like in python. Previously
    the grammar required parentheses (``not (foo in bar)``) which was
    odd.
-   Fixed a bug that caused syntax errors when defining macros or using
    the ``{% call %}`` tag inside loops.
-   Fixed a bug in the parser that made ``{{ foo[1, 2] }}`` impossible.
-   Made it possible to refer to names from outer scopes in included
    templates that were unused in the callers frame :issue:`327`
-   Fixed a bug that caused internal errors if names where used as
    iteration variable and regular variable *after* the loop if that
    variable was unused *before* the loop. :pr:`331`
-   Added support for optional ``scoped`` modifier to blocks.
-   Added support for line-comments.
-   Added the ``meta`` module.
-   Renamed (undocumented) attribute "overlay" to "overlayed" on the
    environment because it was clashing with a method of the same name.
-   Speedup extension is now disabled by default.


Version 2.1.1
-------------

Released 2008-12-25

-   Fixed a translation error caused by looping over empty recursive
    loops.


Version 2.1
-----------

Released 2008-11-23, codename Yasuzō

-   Fixed a bug with nested loops and the special loop variable. Before
    the change an inner loop overwrote the loop variable from the outer
    one after iteration.
-   Fixed a bug with the i18n extension that caused the explicit
    pluralization block to look up the wrong variable.
-   Fixed a limitation in the lexer that made ``{{ foo.0.0 }}``
    impossible.
-   Index based subscribing of variables with a constant value returns
    an undefined object now instead of raising an index error. This was
    a bug caused by eager optimizing.
-   The i18n extension looks up ``foo.ugettext`` now followed by
    ``foo.gettext`` if an translations object is installed. This makes
    dealing with custom translations classes easier.
-   Fixed a confusing behavior with conditional extending. loops were
    partially executed under some conditions even though they were not
    part of a visible area.
-   Added ``sort`` filter that works like ``dictsort`` but for arbitrary
    sequences.
-   Fixed a bug with empty statements in macros.
-   Implemented a bytecode cache system.
-   The template context is now weakref-able
-   Inclusions and imports "with context" forward all variables now, not
    only the initial context.
-   Added a cycle helper called ``cycler``.
-   Added a joining helper called ``joiner``.
-   Added a ``compile_expression`` method to the environment that allows
    compiling of Jinja expressions into callable Python objects.
-   Fixed an escaping bug in urlize


Version 2.0
-----------

Released 2008-07-17, codename Jinjavitus

-   The subscribing of objects (looking up attributes and items) changed
    from slightly. It's now possible to give attributes or items a
    higher priority by either using dot-notation lookup or the bracket
    syntax. This also changed the AST slightly. ``Subscript`` is gone
    and was replaced with ``Getitem`` and ``Getattr``.
-   Added support for preprocessing and token stream filtering for
    extensions. This would allow extensions to allow simplified gettext
    calls in template data and something similar.
-   Added ``TemplateStream.dump``.
-   Added missing support for implicit string literal concatenation.
    ``{{ "foo" "bar" }}`` is equivalent to ``{{ "foobar" }}``
-   ``else`` is optional for conditional expressions. If not given it
    evaluates to ``false``.
-   Improved error reporting for undefined values by providing a
    position.
-   ``filesizeformat`` filter uses decimal prefixes now per default and
    can be set to binary mode with the second parameter.
-   Fixed bug in finalizer


Version 2.0rc1
--------------

Released 2008-06-09

-   First release of Jinja 2.
PK�(�\U����"doc/alt-python37-jinja2/README.rstnu�[���Jinja
=====

Jinja is a fast, expressive, extensible templating engine. Special
placeholders in the template allow writing code similar to Python
syntax. Then the template is passed data to render the final document.

It includes:

-   Template inheritance and inclusion.
-   Define and import macros within templates.
-   HTML templates can use autoescaping to prevent XSS from untrusted
    user input.
-   A sandboxed environment can safely render untrusted templates.
-   AsyncIO support for generating templates and calling async
    functions.
-   I18N support with Babel.
-   Templates are compiled to optimized Python code just-in-time and
    cached, or can be compiled ahead-of-time.
-   Exceptions point to the correct line in templates to make debugging
    easier.
-   Extensible filters, tests, functions, and even syntax.

Jinja's philosophy is that while application logic belongs in Python if
possible, it shouldn't make the template designer's job difficult by
restricting functionality too much.


Installing
----------

Install and update using `pip`_:

.. code-block:: text

    $ pip install -U Jinja2

.. _pip: https://pip.pypa.io/en/stable/getting-started/


In A Nutshell
-------------

.. code-block:: jinja

    {% extends "base.html" %}
    {% block title %}Members{% endblock %}
    {% block content %}
      <ul>
      {% for user in users %}
        <li><a href="{{ user.url }}">{{ user.username }}</a></li>
      {% endfor %}
      </ul>
    {% endblock %}


Donate
------

The Pallets organization develops and supports Jinja and other popular
packages. In order to grow the community of contributors and users, and
allow the maintainers to devote more time to the projects, `please
donate today`_.

.. _please donate today: https://palletsprojects.com/donate


Links
-----

-   Documentation: https://jinja.palletsprojects.com/
-   Changes: https://jinja.palletsprojects.com/changes/
-   PyPI Releases: https://pypi.org/project/Jinja2/
-   Source Code: https://github.com/pallets/jinja/
-   Issue Tracker: https://github.com/pallets/jinja/issues/
-   Website: https://palletsprojects.com/p/jinja/
-   Twitter: https://twitter.com/PalletsTeam
-   Chat: https://discord.gg/pallets
PK�(�\2���II#doc/alt-python37-schema/LICENSE-MITnu�[���Copyright (c) 2012 Vladimir Keleshev, <vladimir@keleshev.com>

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.
PK�(�\;�m�xx"doc/alt-python37-schema/README.rstnu�[���Schema validation just got Pythonic
===============================================================================

**schema** is a library for validating Python data structures, such as those
obtained from config-files, forms, external services or command-line
parsing, converted from JSON/YAML (or something else) to Python data-types.


.. image:: https://secure.travis-ci.org/keleshev/schema.svg?branch=master
    :target: https://travis-ci.org/keleshev/schema

.. image:: https://img.shields.io/codecov/c/github/keleshev/schema.svg
    :target: http://codecov.io/github/keleshev/schema

Example
----------------------------------------------------------------------------

Here is a quick example to get a feeling of **schema**, validating a list of
entries with personal information:

.. code:: python

    >>> from schema import Schema, And, Use, Optional

    >>> schema = Schema([{'name': And(str, len),
    ...                   'age':  And(Use(int), lambda n: 18 <= n <= 99),
    ...                   Optional('gender'): And(str, Use(str.lower),
    ...                                           lambda s: s in ('squid', 'kid'))}])

    >>> data = [{'name': 'Sue', 'age': '28', 'gender': 'Squid'},
    ...         {'name': 'Sam', 'age': '42'},
    ...         {'name': 'Sacha', 'age': '20', 'gender': 'KID'}]

    >>> validated = schema.validate(data)

    >>> assert validated == [{'name': 'Sue', 'age': 28, 'gender': 'squid'},
    ...                      {'name': 'Sam', 'age': 42},
    ...                      {'name': 'Sacha', 'age' : 20, 'gender': 'kid'}]


If data is valid, ``Schema.validate`` will return the validated data
(optionally converted with `Use` calls, see below).

If data is invalid, ``Schema`` will raise ``SchemaError`` exception.
If you just want to check that the data is valid, ``schema.is_valid(data)`` will
return ``True`` or ``False``.


Installation
-------------------------------------------------------------------------------

Use `pip <http://pip-installer.org>`_ or easy_install::

    pip install schema

Alternatively, you can just drop ``schema.py`` file into your project—it is
self-contained.

- **schema** is tested with Python 2.6, 2.7, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7 and PyPy.
- **schema** follows `semantic versioning <http://semver.org>`_.

How ``Schema`` validates data
-------------------------------------------------------------------------------

Types
~~~~~

If ``Schema(...)`` encounters a type (such as ``int``, ``str``, ``object``,
etc.), it will check if the corresponding piece of data is an instance of that type,
otherwise it will raise ``SchemaError``.

.. code:: python

    >>> from schema import Schema

    >>> Schema(int).validate(123)
    123

    >>> Schema(int).validate('123')
    Traceback (most recent call last):
    ...
    SchemaUnexpectedTypeError: '123' should be instance of 'int'

    >>> Schema(object).validate('hai')
    'hai'

Callables
~~~~~~~~~

If ``Schema(...)`` encounters a callable (function, class, or object with
``__call__`` method) it will call it, and if its return value evaluates to
``True`` it will continue validating, else—it will raise ``SchemaError``.

.. code:: python

    >>> import os

    >>> Schema(os.path.exists).validate('./')
    './'

    >>> Schema(os.path.exists).validate('./non-existent/')
    Traceback (most recent call last):
    ...
    SchemaError: exists('./non-existent/') should evaluate to True

    >>> Schema(lambda n: n > 0).validate(123)
    123

    >>> Schema(lambda n: n > 0).validate(-12)
    Traceback (most recent call last):
    ...
    SchemaError: <lambda>(-12) should evaluate to True

"Validatables"
~~~~~~~~~~~~~~

If ``Schema(...)`` encounters an object with method ``validate`` it will run
this method on corresponding data as ``data = obj.validate(data)``. This method
may raise ``SchemaError`` exception, which will tell ``Schema`` that that piece
of data is invalid, otherwise—it will continue validating.

An example of "validatable" is ``Regex``, that tries to match a string or a
buffer with the given regular expression (itself as a string, buffer or
compiled regex ``SRE_Pattern``):

.. code:: python

    >>> from schema import Regex
    >>> import re

    >>> Regex(r'^foo').validate('foobar')
    'foobar'

    >>> Regex(r'^[A-Z]+$', flags=re.I).validate('those-dashes-dont-match')
    Traceback (most recent call last):
    ...
    SchemaError: Regex('^[A-Z]+$', flags=re.IGNORECASE) does not match 'those-dashes-dont-match'

For a more general case, you can use ``Use`` for creating such objects.
``Use`` helps to use a function or type to convert a value while validating it:

.. code:: python

    >>> from schema import Use

    >>> Schema(Use(int)).validate('123')
    123

    >>> Schema(Use(lambda f: open(f, 'a'))).validate('LICENSE-MIT')
    <open file 'LICENSE-MIT', mode 'a' at 0x...>

Dropping the details, ``Use`` is basically:

.. code:: python

    class Use(object):

        def __init__(self, callable_):
            self._callable = callable_

        def validate(self, data):
            try:
                return self._callable(data)
            except Exception as e:
                raise SchemaError('%r raised %r' % (self._callable.__name__, e))


Sometimes you need to transform and validate part of data, but keep original data unchanged.
``Const`` helps to keep your data safe:

.. code:: python

    >> from schema import Use, Const, And, Schema

    >> from datetime import datetime

    >> is_future = lambda date: datetime.now() > date

    >> to_json = lambda v: {"timestamp": v}

    >> Schema(And(Const(And(Use(datetime.fromtimestamp), is_future)), Use(to_json))).validate(1234567890)
    {"timestamp": 1234567890}

Now you can write your own validation-aware classes and data types.

Lists, similar containers
~~~~~~~~~~~~~~~~~~~~~~~~~

If ``Schema(...)`` encounters an instance of ``list``, ``tuple``, ``set`` or
``frozenset``, it will validate contents of corresponding data container
against schemas listed inside that container:


.. code:: python

    >>> Schema([1, 0]).validate([1, 1, 0, 1])
    [1, 1, 0, 1]

    >>> Schema((int, float)).validate((5, 7, 8, 'not int or float here'))
    Traceback (most recent call last):
    ...
    SchemaError: Or(<type 'int'>, <type 'float'>) did not validate 'not int or float here'
    'not int or float here' should be instance of 'float'

Dictionaries
~~~~~~~~~~~~

If ``Schema(...)`` encounters an instance of ``dict``, it will validate data
key-value pairs:

.. code:: python

    >>> d = Schema({'name': str,
    ...             'age': lambda n: 18 <= n <= 99}).validate({'name': 'Sue', 'age': 28})

    >>> assert d == {'name': 'Sue', 'age': 28}

You can specify keys as schemas too:

.. code:: python

    >>> schema = Schema({str: int,  # string keys should have integer values
    ...                  int: None})  # int keys should be always None

    >>> data = schema.validate({'key1': 1, 'key2': 2,
    ...                         10: None, 20: None})

    >>> schema.validate({'key1': 1,
    ...                   10: 'not None here'})
    Traceback (most recent call last):
    ...
    SchemaError: Key '10' error:
    None does not match 'not None here'

This is useful if you want to check certain key-values, but don't care
about others:

.. code:: python

    >>> schema = Schema({'<id>': int,
    ...                  '<file>': Use(open),
    ...                  str: object})  # don't care about other str keys

    >>> data = schema.validate({'<id>': 10,
    ...                         '<file>': 'README.rst',
    ...                         '--verbose': True})

You can mark a key as optional as follows:

.. code:: python

    >>> from schema import Optional
    >>> Schema({'name': str,
    ...         Optional('occupation'): str}).validate({'name': 'Sam'})
    {'name': 'Sam'}

``Optional`` keys can also carry a ``default``, to be used when no key in the
data matches:

.. code:: python

    >>> from schema import Optional
    >>> Schema({Optional('color', default='blue'): str,
    ...         str: str}).validate({'texture': 'furry'}
    ...       ) == {'color': 'blue', 'texture': 'furry'}
    True

Defaults are used verbatim, not passed through any validators specified in the
value.

default can also be a callable:

.. code:: python

    >>> from schema import Schema, Optional
    >>> Schema({Optional('data', default=dict): {}}).validate({}) == {'data': {}}
    True

Also, a caveat: If you specify types, **schema** won't validate the empty dict:

.. code:: python

    >>> Schema({int:int}).is_valid({})
    False

To do that, you need ``Schema(Or({int:int}, {}))``. This is unlike what happens with
lists, where ``Schema([int]).is_valid([])`` will return True.


**schema** has classes ``And`` and ``Or`` that help validating several schemas
for the same data:

.. code:: python

    >>> from schema import And, Or

    >>> Schema({'age': And(int, lambda n: 0 < n < 99)}).validate({'age': 7})
    {'age': 7}

    >>> Schema({'password': And(str, lambda s: len(s) > 6)}).validate({'password': 'hai'})
    Traceback (most recent call last):
    ...
    SchemaError: Key 'password' error:
    <lambda>('hai') should evaluate to True

    >>> Schema(And(Or(int, float), lambda x: x > 0)).validate(3.1415)
    3.1415

In a dictionary, you can also combine two keys in a "one or the other" manner. To do
so, use the `Or` class as a key:

.. code:: python

    >>> from schema import Or, Schema
    >>> schema = Schema({
    ...    Or("key1", "key2", only_one=True): str
    ... })

    >>> schema.validate({"key1": "test"}) # Ok
    {'key1': 'test'}

    >>> schema.validate({"key1": "test", "key2": "test"}) # SchemaError
    Traceback (most recent call last):
    ...
    SchemaOnlyOneAllowedError: There are multiple keys present from the Or('key1', 'key2') condition

Hooks
~~~~~~~~~~
You can define hooks which are functions that are executed whenever a valid key:value is found. 
The `Forbidden` class is an example of this.

You can mark a key as forbidden as follows:

.. code:: python

    >>> from schema import Forbidden
    >>> Schema({Forbidden('age'): object}).validate({'age': 50})
    Traceback (most recent call last):
    ...
    SchemaForbiddenKeyError: Forbidden key encountered: 'age' in {'age': 50}

A few things are worth noting. First, the value paired with the forbidden
key determines whether it will be rejected:

.. code:: python

    >>> Schema({Forbidden('age'): str, 'age': int}).validate({'age': 50})
    {'age': 50}

Note: if we hadn't supplied the 'age' key here, the call would have failed too, but with
SchemaWrongKeyError, not SchemaForbiddenKeyError.

Second, Forbidden has a higher priority than standard keys, and consequently than Optional.
This means we can do that:

.. code:: python

    >>> Schema({Forbidden('age'): object, Optional(str): object}).validate({'age': 50})
    Traceback (most recent call last):
    ...
    SchemaForbiddenKeyError: Forbidden key encountered: 'age' in {'age': 50}

You can also define your own hooks. The following hook will call `_my_function` if `key` is encountered.

.. code:: python

    from schema import Hook
    def _my_function(key, scope, error):
        print(key, scope, error)

    Hook("key", handler=_my_function)

Here's an example where a `Deprecated` class is added to log warnings whenever a key is encountered:

.. code:: python

    from schema import Hook, Schema
    class Deprecated(Hook):
        def __init__(self, *args, **kwargs):
            kwargs["handler"] = lambda key, *args: logging.warn(f"`{key}` is deprecated. " + (self._error or ""))
            super(Deprecated, self).__init__(*args, **kwargs)

    Schema({Deprecated("test", "custom error message."): object}, ignore_extra_keys=True).validate({"test": "value"})
    ...
    WARNING: `test` is deprecated. custom error message.

Extra Keys
~~~~~~~~~~

The ``Schema(...)`` parameter ``ignore_extra_keys`` causes validation to ignore extra keys in a dictionary, and also to not return them after validating.

.. code:: python

    >>> schema = Schema({'name': str}, ignore_extra_keys=True)
    >>> schema.validate({'name': 'Sam', 'age': '42'})
    {'name': 'Sam'}

If you would like any extra keys returned, use ``object: object`` as one of the key/value pairs, which will match any key and any value.
Otherwise, extra keys will raise a ``SchemaError``.

User-friendly error reporting
-------------------------------------------------------------------------------

You can pass a keyword argument ``error`` to any of validatable classes
(such as ``Schema``, ``And``, ``Or``, ``Regex``, ``Use``) to report this error
instead of a built-in one.

.. code:: python

    >>> Schema(Use(int, error='Invalid year')).validate('XVII')
    Traceback (most recent call last):
    ...
    SchemaError: Invalid year

You can see all errors that occurred by accessing exception's ``exc.autos``
for auto-generated error messages, and ``exc.errors`` for errors
which had ``error`` text passed to them.

You can exit with ``sys.exit(exc.code)`` if you want to show the messages
to the user without traceback. ``error`` messages are given precedence in that
case.

A JSON API example
-------------------------------------------------------------------------------

Here is a quick example: validation of
`create a gist <http://developer.github.com/v3/gists/>`_
request from github API.

.. code:: python

    >>> gist = '''{"description": "the description for this gist",
    ...            "public": true,
    ...            "files": {
    ...                "file1.txt": {"content": "String file contents"},
    ...                "other.txt": {"content": "Another file contents"}}}'''

    >>> from schema import Schema, And, Use, Optional

    >>> import json

    >>> gist_schema = Schema(And(Use(json.loads),  # first convert from JSON
    ...                          # use basestring since json returns unicode
    ...                          {Optional('description'): basestring,
    ...                           'public': bool,
    ...                           'files': {basestring: {'content': basestring}}}))

    >>> gist = gist_schema.validate(gist)

    # gist:
    {u'description': u'the description for this gist',
     u'files': {u'file1.txt': {u'content': u'String file contents'},
                u'other.txt': {u'content': u'Another file contents'}},
     u'public': True}

Using **schema** with `docopt <http://github.com/docopt/docopt>`_
-------------------------------------------------------------------------------

Assume you are using **docopt** with the following usage-pattern:

    Usage: my_program.py [--count=N] <path> <files>...

and you would like to validate that ``<files>`` are readable, and that
``<path>`` exists, and that ``--count`` is either integer from 0 to 5, or
``None``.

Assuming **docopt** returns the following dict:

.. code:: python

    >>> args = {'<files>': ['LICENSE-MIT', 'setup.py'],
    ...         '<path>': '../',
    ...         '--count': '3'}

this is how you validate it using ``schema``:

.. code:: python

    >>> from schema import Schema, And, Or, Use
    >>> import os

    >>> s = Schema({'<files>': [Use(open)],
    ...             '<path>': os.path.exists,
    ...             '--count': Or(None, And(Use(int), lambda n: 0 < n < 5))})

    >>> args = s.validate(args)

    >>> args['<files>']
    [<open file 'LICENSE-MIT', mode 'r' at 0x...>, <open file 'setup.py', mode 'r' at 0x...>]

    >>> args['<path>']
    '../'

    >>> args['--count']
    3

As you can see, **schema** validated data successfully, opened files and
converted ``'3'`` to ``int``.

JSON schema
-----------

You can also generate standard `draft-07 JSON schema <https://json-schema.org/>`_ from a dict ``Schema``.
This can be used to add word completion, validation, and documentation directly in code editors.
The output schema can also be used with JSON schema compatible libraries.

JSON: Generating
~~~~~~~~~~~~~~~~

Just define your schema normally and call ``.json_schema()`` on it. The output is a Python dict, you need to dump it to JSON.

.. code:: python

    >>> from schema import Optional, Schema
    >>> import json
    >>> s = Schema({"test": str,
    ...             "nested": {Optional("other"): str}
    ...             })
    >>> json_schema = json.dumps(s.json_schema("https://example.com/my-schema.json"))

    # json_schema
    {
        "type":"object",
        "properties": {
            "test": {"type": "string"},
            "nested": {
                "type":"object",
                "properties": {
                    "other": {"type": "string"}
                },
                "required": [],
                "additionalProperties": false
            }
        },
        "required":[
            "test",
            "nested"
        ],
        "additionalProperties":false,
        "$id":"https://example.com/my-schema.json",
        "$schema":"http://json-schema.org/draft-07/schema#"
    }

You can add descriptions for the schema elements using the ``Literal`` object instead of a string. The main schema can also have a description.

These will appear in IDEs to help your users write a configuration.

.. code:: python

    >>> from schema import Literal, Schema
    >>> import json
    >>> s = Schema({Literal("project_name", description="Names must be unique"): str}, description="Project schema")
    >>> json_schema = json.dumps(s.json_schema("https://example.com/my-schema.json"), indent=4)

    # json_schema
    {
        "type": "object",
        "properties": {
            "project_name": {
                "description": "Names must be unique",
                "type": "string"
            }
        },
        "required": [
            "project_name"
        ],
        "additionalProperties": false,
        "$id": "https://example.com/my-schema.json",
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Project schema"
    }


JSON: Supported validations
~~~~~~~~~~~~~~~~~~~~~~~~~~~

The main schema must be a dict. i.e. ``Schema({"test": str})`` works but ``Schema(str)`` does not.
The following examples will assume the main schema is a dict.

The resulting JSON schema is not guaranteed to accept the same objects as the library would accept, since some validations are not implemented or
have no JSON schema equivalent. This is the case of the ``Use`` and ``Hook`` objects for example.

Implemented
'''''''''''

`Object properties <https://json-schema.org/understanding-json-schema/reference/object.html#properties>`_
    Use a dict literal. The dict keys are the JSON schema properties.

    Example:

    ``Schema({"test": str})``

    becomes

    ``{'type': 'object', 'properties': {'test': {'type': 'string'}}, 'required': ['test'], 'additionalProperties': False}``.

    Please note that attributes are required by default. To create optional attributes use ``Optional``, like so:

    ``Schema({Optional("test"): str})``

    becomes

    ``{'type': 'object', 'properties': {'test': {'type': 'string'}}, 'required': [], 'additionalProperties': False}``

Types
    Use the Python type name directly. It will be converted to the JSON name:

    - ``str`` -> `string <https://json-schema.org/understanding-json-schema/reference/string.html>`_
    - ``int`` -> `integer <https://json-schema.org/understanding-json-schema/reference/numeric.html#integer>`_
    - ``float`` -> `number <https://json-schema.org/understanding-json-schema/reference/numeric.html#number>`_
    - ``bool`` -> `boolean <https://json-schema.org/understanding-json-schema/reference/boolean.html>`_
    - ``list`` -> `array <https://json-schema.org/understanding-json-schema/reference/array.html>`_
    - ``dict`` -> `object <https://json-schema.org/understanding-json-schema/reference/object.html>`_

    Example:

    ``Schema(float)``

    becomes

    ``{"type": "number"}``

`Array items <https://json-schema.org/understanding-json-schema/reference/array.html#items>`_
    Surround a schema with ``[]``.

    Example:

    ``Schema([str])`` means an array of string and becomes:

    ``{'type': 'array', 'items': {'type': 'string'}}``

`Enumerated values <https://json-schema.org/understanding-json-schema/reference/generic.html#enumerated-values>`_
    List the accepted values.

    Example:

    ``Schema([1, 2, 3])`` becomes

    ``{"enum": [1, 2, 3]}``

`Constant values <https://json-schema.org/understanding-json-schema/reference/generic.html#constant-values>`_
    Use the value itself.

    Example:

    ``Schema("name")`` becomes

    ``{"const": "name"}``

`Regular expressions <https://json-schema.org/understanding-json-schema/reference/regular_expressions.html>`_
    Use ``Regex``.

    Example:

    ``Regex("^v\d+")`` becomes

    ``{'type': 'string', 'pattern': '^v\\d+'}``

`Annotations (title and description) <https://json-schema.org/understanding-json-schema/reference/generic.html#annotations>`_
    You can use the ``name`` and ``description`` parameters of the ``Schema`` object init method.

    To add description to keys, replace a str with a ``Literal`` object.

    Example:

    ``Schema({Literal("test", description="A description"): str})``

    is equivalent to

    ``Schema({"test": str})``

    with the description added to the resulting JSON schema.

`Combining schemas with allOf <https://json-schema.org/understanding-json-schema/reference/combining.html#allof>`_
    Use ``And``

    Example:

    ``Schema(And(str, "value")``

    becomes

    ``{"allOf": [{"type": "string"}, {"const": "value"}]}``

    Note that this example is not really useful in the real world, since ``const`` already implies the type.

`Combining schemas with anyOf <https://json-schema.org/understanding-json-schema/reference/combining.html#anyof>`_
    Use ``Or``

    Example:

    ``Schema(Or(str, int))``

    becomes

    ``{"anyOf": [{"type": "string"}, {"type": "integer"}]}``


Not implemented
'''''''''''''''

The following JSON schema validations cannot be generated from this library.

- `String length <https://json-schema.org/understanding-json-schema/reference/string.html#length>`_
    However, those can be implemented using ``Regex``
- `String format <https://json-schema.org/understanding-json-schema/reference/string.html#format>`_
    However, those can be implemented using ``Regex``
- `Object dependencies <https://json-schema.org/understanding-json-schema/reference/object.html#dependencies>`_
- `Array length <https://json-schema.org/understanding-json-schema/reference/array.html#length>`_
- `Array uniqueness <https://json-schema.org/understanding-json-schema/reference/array.html#uniqueness>`_
- `Numeric multiples <https://json-schema.org/understanding-json-schema/reference/numeric.html#multiples>`_
- `Numeric ranges <https://json-schema.org/understanding-json-schema/reference/numeric.html#range>`_
- `Property Names <https://json-schema.org/understanding-json-schema/reference/object.html#property-names>`_
    Not implemented. We suggest listing the possible keys instead. As a tip, you can use ``Or`` as a dict key.

    Example:

    ``Schema({Or("name1", "name2"): str})``
- `Annotations (default and examples) <https://json-schema.org/understanding-json-schema/reference/generic.html#annotations>`_
- `Combining schemas with oneOf <https://json-schema.org/understanding-json-schema/reference/combining.html#oneof>`_
- `Not <https://json-schema.org/understanding-json-schema/reference/combining.html#not>`_
- `Object size <https://json-schema.org/understanding-json-schema/reference/object.html#size>`_


JSON: Minimizing output size
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Explicit Reuse
''''''''''''''

If your JSON schema is big and has a lot of repetition, it can be made simpler and smaller by defining Schema objects as reference.
These references will be placed in a "definitions" section in the main schema.

`You can look at the JSON schema documentation for more information <https://json-schema.org/understanding-json-schema/structuring.html#reuse>`_

.. code:: python

    >>> from schema import Optional, Schema
    >>> import json
    >>> s = Schema({"test": str,
    ...             "nested": Schema({Optional("other"): str}, name="nested", as_reference=True)
    ...             })
    >>> json_schema = json.dumps(s.json_schema("https://example.com/my-schema.json"), indent=4)

    # json_schema
    {
        "type": "object",
        "properties": {
            "test": {
                "type": "string"
            },
            "nested": {
                "$ref": "#/definitions/nested"
            }
        },
        "required": [
            "test",
            "nested"
        ],
        "additionalProperties": false,
        "$id": "https://example.com/my-schema.json",
        "$schema": "http://json-schema.org/draft-07/schema#",
        "definitions": {
            "nested": {
                "type": "object",
                "properties": {
                    "other": {
                        "type": "string"
                    }
                },
                "required": [],
                "additionalProperties": false
            }
        }
    }

This becomes really useful when using the same object several times

.. code:: python

    >>> from schema import Optional, Or, Schema
    >>> import json
    >>> language_configuration = Schema({"autocomplete": bool, "stop_words": [str]}, name="language", as_reference=True)
    >>> s = Schema({Or("ar", "cs", "de", "el", "eu", "en", "es", "fr"): language_configuration})
    >>> json_schema = json.dumps(s.json_schema("https://example.com/my-schema.json"), indent=4)

    # json_schema
    {
        "type": "object",
        "properties": {
            "ar": {
                "$ref": "#/definitions/language"
            },
            "cs": {
                "$ref": "#/definitions/language"
            },
            "de": {
                "$ref": "#/definitions/language"
            },
            "el": {
                "$ref": "#/definitions/language"
            },
            "eu": {
                "$ref": "#/definitions/language"
            },
            "en": {
                "$ref": "#/definitions/language"
            },
            "es": {
                "$ref": "#/definitions/language"
            },
            "fr": {
                "$ref": "#/definitions/language"
            }
        },
        "required": [],
        "additionalProperties": false,
        "$id": "https://example.com/my-schema.json",
        "$schema": "http://json-schema.org/draft-07/schema#",
        "definitions": {
            "language": {
                "type": "object",
                "properties": {
                    "autocomplete": {
                        "type": "boolean"
                    },
                    "stop_words": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                },
                "required": [
                    "autocomplete",
                    "stop_words"
                ],
                "additionalProperties": false
            }
        }
    }

Automatic reuse
'''''''''''''''

If you want to minimize the output size without using names explicitly, you can have the library generate hashes of parts of the output JSON
schema and use them as references throughout.

Enable this behaviour by providing the parameter ``use_refs`` to the json_schema method.

Be aware that this method is less often compatible with IDEs and JSON schema libraries.
It produces a JSON schema that is more difficult to read by humans.

.. code:: python

    >>> from schema import Optional, Or, Schema
    >>> import json
    >>> language_configuration = Schema({"autocomplete": bool, "stop_words": [str]})
    >>> s = Schema({Or("ar", "cs", "de", "el", "eu", "en", "es", "fr"): language_configuration})
    >>> json_schema = json.dumps(s.json_schema("https://example.com/my-schema.json", use_refs=True), indent=4)

    # json_schema
    {
        "type": "object",
        "properties": {
            "ar": {
                "type": "object",
                "properties": {
                    "autocomplete": {
                        "type": "boolean",
                        "$id": "#6456104181059880193"
                    },
                    "stop_words": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "$id": "#1856069563381977338"
                        }
                    }
                },
                "required": [
                    "autocomplete",
                    "stop_words"
                ],
                "additionalProperties": false
            },
            "cs": {
                "type": "object",
                "properties": {
                    "autocomplete": {
                        "$ref": "#6456104181059880193"
                    },
                    "stop_words": {
                        "type": "array",
                        "items": {
                            "$ref": "#1856069563381977338"
                        },
                        "$id": "#-5377945144312515805"
                    }
                },
                "required": [
                    "autocomplete",
                    "stop_words"
                ],
                "additionalProperties": false
            },
            "de": {
                "type": "object",
                "properties": {
                    "autocomplete": {
                        "$ref": "#6456104181059880193"
                    },
                    "stop_words": {
                        "$ref": "#-5377945144312515805"
                    }
                },
                "required": [
                    "autocomplete",
                    "stop_words"
                ],
                "additionalProperties": false,
                "$id": "#-8142886105174600858"
            },
            "el": {
                "$ref": "#-8142886105174600858"
            },
            "eu": {
                "$ref": "#-8142886105174600858"
            },
            "en": {
                "$ref": "#-8142886105174600858"
            },
            "es": {
                "$ref": "#-8142886105174600858"
            },
            "fr": {
                "$ref": "#-8142886105174600858"
            }
        },
        "required": [],
        "additionalProperties": false,
        "$id": "https://example.com/my-schema.json",
        "$schema": "http://json-schema.org/draft-07/schema#"
    }
PK�(�\�Yď)doc/alt-python37-setuptools-wheel/LICENSEnu�[���Copyright 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.
PK�(�\�>��1�1doc/alt-python37-libs/LICENSEnu�[���A. 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, 2021, 2022, 2023 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.
PK�(�\�$,ee+doc/alt-python37-libs/systemtap-example.stpnu�[���/*
    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);
}
PK�(�\"z���&�& doc/alt-python37-libs/README.rstnu�[���This is Python version 3.7.17
=============================

.. image:: https://travis-ci.org/python/cpython.svg?branch=3.7
   :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.7
   :alt: CPython build status on Azure Pipelines
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=3.7

.. image:: https://codecov.io/gh/python/cpython/branch/3.7/graph/badge.svg
   :alt: CPython code coverage on Codecov
   :target: https://codecov.io/gh/python/cpython/branch/3.7

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.7/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/3.7/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
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.7 <https://docs.python.org/3.7/whatsnew/3.7.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/blob/3.7/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/3.7>`_.

If you want to install multiple versions of Python see the section below
entitled "Installing multiple versions".


Documentation
-------------

`Documentation for Python 3.7 <https://docs.python.org/3.7/>`_ 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.7/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.7 with 3.7 being the
primary version, you would execute ``make install`` in your 3.7 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:`537` for Python 3.7 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.
PK�(�\5�Ә"doc/alt-python37-libs/pyfuntop.stpnu�[���#!/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;
}
PK�(�\���3{"{"+doc/alt-python37-devel/valgrind-python.suppnu�[���#
# 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
}

PK�(�\{\�?��doc/alt-python37-devel/gdbinitnu�[���# 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 = 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

# 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_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.

# print the entire Python call stack
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

# print the entire Python call stack - verbose mode
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

# generally useful macro to print a Unicode string
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
PK�(�\Vx�;��&doc/alt-python37-devel/README.valgrindnu�[���This 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.

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.

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).
PK�(�\�t*^��"doc/alt-python37-requests/PKG-INFOnu�[���Metadata-Version: 2.1
Name: requests
Version: 2.26.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Project-URL: Documentation, https://requests.readthedocs.io
Project-URL: Source, https://github.com/psf/requests
Description: # Requests
        
        **Requests** is a simple, yet elegant, HTTP library.
        
        ```python
        >>> import requests
        >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
        >>> r.status_code
        200
        >>> r.headers['content-type']
        'application/json; charset=utf8'
        >>> r.encoding
        'utf-8'
        >>> r.text
        '{"type":"User"...'
        >>> r.json()
        {'disk_usage': 368627, 'private_gists': 484, ...}
        ```
        
        Requests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs, or to form-encode your `PUT` & `POST` data — but nowadays, just use the `json` method!
        
        Requests is one of the most downloaded Python package today, pulling in around `14M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `500,000+` repositories. You may certainly put your trust in this code.
        
        [![Downloads](https://pepy.tech/badge/requests/month)](https://pepy.tech/project/requests/month)
        [![Supported Versions](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests)
        [![Contributors](https://img.shields.io/github/contributors/psf/requests.svg)](https://github.com/psf/requests/graphs/contributors)
        
        ## Installing Requests and Supported Versions
        
        Requests is available on PyPI:
        
        ```console
        $ python -m pip install requests
        ```
        
        Requests officially supports Python 2.7 & 3.6+.
        
        ## Supported Features & Best–Practices
        
        Requests is ready for the demands of building robust and reliable HTTP–speaking applications, for the needs of today.
        
        - Keep-Alive & Connection Pooling
        - International Domains and URLs
        - Sessions with Cookie Persistence
        - Browser-style TLS/SSL Verification
        - Basic & Digest Authentication
        - Familiar `dict`–like Cookies
        - Automatic Content Decompression and Decoding
        - Multi-part File Uploads
        - SOCKS Proxy Support
        - Connection Timeouts
        - Streaming Downloads
        - Automatic honoring of `.netrc`
        - Chunked HTTP Requests
        
        ## API Reference and User Guide available on [Read the Docs](https://requests.readthedocs.io)
        
        [![Read the Docs](https://raw.githubusercontent.com/psf/requests/master/ext/ss.png)](https://requests.readthedocs.io)
        
        ## Cloning the repository
        
        When cloning the Requests repository, you may need to add the `-c
        fetch.fsck.badTimezone=ignore` flag to avoid an error about a bad commit (see
        [this issue](https://github.com/psf/requests/issues/2690) for more background):
        
        ```shell
        git clone -c fetch.fsck.badTimezone=ignore https://github.com/psf/requests.git
        ```
        
        You can also apply this setting to your global Git config:
        
        ```shell
        git config --global fetch.fsck.badTimezone ignore
        ```
        
        ---
        
        [![Kenneth Reitz](https://raw.githubusercontent.com/psf/requests/master/ext/kr.png)](https://kennethreitz.org) [![Python Software Foundation](https://raw.githubusercontent.com/psf/requests/master/ext/psf.png)](https://www.python.org/psf)
        
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: English
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*
Description-Content-Type: text/markdown
Provides-Extra: security
Provides-Extra: socks
Provides-Extra: use_chardet_on_py3
PK�(�\��˞'�'!doc/alt-python37-requests/LICENSEnu�[���
                                 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.
PK�(�\��xi�i�$doc/alt-python37-requests/HISTORY.mdnu�[���Release History
===============

dev
---

-   \[Short description of non-trivial change.\]

2.26.0 (2021-07-13)
-------------------

**Improvements**

- Requests now supports Brotli compression, if either the `brotli` or
  `brotlicffi` package is installed. (#5783)

- `Session.send` now correctly resolves proxy configurations from both
  the Session and Request. Behavior now matches `Session.request`. (#5681)

**Bugfixes**

- Fixed a race condition in zip extraction when using Requests in parallel
  from zip archive. (#5707)

**Dependencies**

- Instead of `chardet`, use the MIT-licensed `charset_normalizer` for Python3
  to remove license ambiguity for projects bundling requests. If `chardet`
  is already installed on your machine it will be used instead of `charset_normalizer`
  to keep backwards compatibility. (#5797)

  You can also install `chardet` while installing requests by
  specifying `[use_chardet_on_py3]` extra as follows:

    ```shell
    pip install "requests[use_chardet_on_py3]"
    ```

  Python2 still depends upon the `chardet` module.

- Requests now supports `idna` 3.x on Python 3. `idna` 2.x will continue to
  be used on Python 2 installations. (#5711)

**Deprecations**

- The `requests[security]` extra has been converted to a no-op install.
  PyOpenSSL is no longer the recommended secure option for Requests. (#5867)

- Requests has officially dropped support for Python 3.5. (#5867)

2.25.1 (2020-12-16)
-------------------

**Bugfixes**

- Requests now treats `application/json` as `utf8` by default. Resolving
  inconsistencies between `r.text` and `r.json` output. (#5673)

**Dependencies**

- Requests now supports chardet v4.x.

2.25.0 (2020-11-11)
------------------

**Improvements**

- Added support for NETRC environment variable. (#5643)

**Dependencies**

- Requests now supports urllib3 v1.26.

**Deprecations**

- Requests v2.25.x will be the last release series with support for Python 3.5.
- The `requests[security]` extra is officially deprecated and will be removed
  in Requests v2.26.0.

2.24.0 (2020-06-17)
-------------------

**Improvements**

- pyOpenSSL TLS implementation is now only used if Python
  either doesn't have an `ssl` module or doesn't support
  SNI. Previously pyOpenSSL was unconditionally used if available.
  This applies even if pyOpenSSL is installed via the
  `requests[security]` extra (#5443)

- Redirect resolution should now only occur when
  `allow_redirects` is True. (#5492)

- No longer perform unnecessary Content-Length calculation for
  requests that won't use it. (#5496)

2.23.0 (2020-02-19)
-------------------

**Improvements**

- Remove defunct reference to `prefetch` in Session `__attrs__` (#5110)

**Bugfixes**

- Requests no longer outputs password in basic auth usage warning. (#5099)

**Dependencies**

- Pinning for `chardet` and `idna` now uses major version instead of minor.
  This hopefully reduces the need for releases everytime a dependency is updated.

2.22.0 (2019-05-15)
-------------------

**Dependencies**

- Requests now supports urllib3 v1.25.2.
  (note: 1.25.0 and 1.25.1 are incompatible)

**Deprecations**

- Requests has officially stopped support for Python 3.4.

2.21.0 (2018-12-10)
-------------------

**Dependencies**

- Requests now supports idna v2.8.

2.20.1 (2018-11-08)
-------------------

**Bugfixes**

- Fixed bug with unintended Authorization header stripping for
  redirects using default ports (http/80, https/443).

2.20.0 (2018-10-18)
-------------------

**Bugfixes**

-   Content-Type header parsing is now case-insensitive (e.g.
    charset=utf8 v Charset=utf8).
-   Fixed exception leak where certain redirect urls would raise
    uncaught urllib3 exceptions.
-   Requests removes Authorization header from requests redirected
    from https to http on the same hostname. (CVE-2018-18074)
-   `should_bypass_proxies` now handles URIs without hostnames (e.g.
    files).

**Dependencies**

- Requests now supports urllib3 v1.24.

**Deprecations**

- Requests has officially stopped support for Python 2.6.

2.19.1 (2018-06-14)
-------------------

**Bugfixes**

-   Fixed issue where status\_codes.py's `init` function failed trying
    to append to a `__doc__` value of `None`.

2.19.0 (2018-06-12)
-------------------

**Improvements**

-   Warn user about possible slowdown when using cryptography version
    &lt; 1.3.4
-   Check for invalid host in proxy URL, before forwarding request to
    adapter.
-   Fragments are now properly maintained across redirects. (RFC7231
    7.1.2)
-   Removed use of cgi module to expedite library load time.
-   Added support for SHA-256 and SHA-512 digest auth algorithms.
-   Minor performance improvement to `Request.content`.
-   Migrate to using collections.abc for 3.7 compatibility.

**Bugfixes**

-   Parsing empty `Link` headers with `parse_header_links()` no longer
    return one bogus entry.
-   Fixed issue where loading the default certificate bundle from a zip
    archive would raise an `IOError`.
-   Fixed issue with unexpected `ImportError` on windows system which do
    not support `winreg` module.
-   DNS resolution in proxy bypass no longer includes the username and
    password in the request. This also fixes the issue of DNS queries
    failing on macOS.
-   Properly normalize adapter prefixes for url comparison.
-   Passing `None` as a file pointer to the `files` param no longer
    raises an exception.
-   Calling `copy` on a `RequestsCookieJar` will now preserve the cookie
    policy correctly.

**Dependencies**

-   We now support idna v2.7.
-   We now support urllib3 v1.23.

2.18.4 (2017-08-15)
-------------------

**Improvements**

-   Error messages for invalid headers now include the header name for
    easier debugging

**Dependencies**

-   We now support idna v2.6.

2.18.3 (2017-08-02)
-------------------

**Improvements**

-   Running `$ python -m requests.help` now includes the installed
    version of idna.

**Bugfixes**

-   Fixed issue where Requests would raise `ConnectionError` instead of
    `SSLError` when encountering SSL problems when using urllib3 v1.22.

2.18.2 (2017-07-25)
-------------------

**Bugfixes**

-   `requests.help` no longer fails on Python 2.6 due to the absence of
    `ssl.OPENSSL_VERSION_NUMBER`.

**Dependencies**

-   We now support urllib3 v1.22.

2.18.1 (2017-06-14)
-------------------

**Bugfixes**

-   Fix an error in the packaging whereby the `*.whl` contained
    incorrect data that regressed the fix in v2.17.3.

2.18.0 (2017-06-14)
-------------------

**Improvements**

-   `Response` is now a context manager, so can be used directly in a
    `with` statement without first having to be wrapped by
    `contextlib.closing()`.

**Bugfixes**

-   Resolve installation failure if multiprocessing is not available
-   Resolve tests crash if multiprocessing is not able to determine the
    number of CPU cores
-   Resolve error swallowing in utils set\_environ generator

2.17.3 (2017-05-29)
-------------------

**Improvements**

-   Improved `packages` namespace identity support, for monkeypatching
    libraries.

2.17.2 (2017-05-29)
-------------------

**Improvements**

-   Improved `packages` namespace identity support, for monkeypatching
    libraries.

2.17.1 (2017-05-29)
-------------------

**Improvements**

-   Improved `packages` namespace identity support, for monkeypatching
    libraries.

2.17.0 (2017-05-29)
-------------------

**Improvements**

-   Removal of the 301 redirect cache. This improves thread-safety.

2.16.5 (2017-05-28)
-------------------

-   Improvements to `$ python -m requests.help`.

2.16.4 (2017-05-27)
-------------------

-   Introduction of the `$ python -m requests.help` command, for
    debugging with maintainers!

2.16.3 (2017-05-27)
-------------------

-   Further restored the `requests.packages` namespace for compatibility
    reasons.

2.16.2 (2017-05-27)
-------------------

-   Further restored the `requests.packages` namespace for compatibility
    reasons.

No code modification (noted below) should be necessary any longer.

2.16.1 (2017-05-27)
-------------------

-   Restored the `requests.packages` namespace for compatibility
    reasons.
-   Bugfix for `urllib3` version parsing.

**Note**: code that was written to import against the
`requests.packages` namespace previously will have to import code that
rests at this module-level now.

For example:

    from requests.packages.urllib3.poolmanager import PoolManager

Will need to be re-written to be:

    from requests.packages import urllib3
    urllib3.poolmanager.PoolManager

Or, even better:

    from urllib3.poolmanager import PoolManager

2.16.0 (2017-05-26)
-------------------

-   Unvendor ALL the things!

2.15.1 (2017-05-26)
-------------------

-   Everyone makes mistakes.

2.15.0 (2017-05-26)
-------------------

**Improvements**

-   Introduction of the `Response.next` property, for getting the next
    `PreparedResponse` from a redirect chain (when
    `allow_redirects=False`).
-   Internal refactoring of `__version__` module.

**Bugfixes**

-   Restored once-optional parameter for
    `requests.utils.get_environ_proxies()`.

2.14.2 (2017-05-10)
-------------------

**Bugfixes**

-   Changed a less-than to an equal-to and an or in the dependency
    markers to widen compatibility with older setuptools releases.

2.14.1 (2017-05-09)
-------------------

**Bugfixes**

-   Changed the dependency markers to widen compatibility with older pip
    releases.

2.14.0 (2017-05-09)
-------------------

**Improvements**

-   It is now possible to pass `no_proxy` as a key to the `proxies`
    dictionary to provide handling similar to the `NO_PROXY` environment
    variable.
-   When users provide invalid paths to certificate bundle files or
    directories Requests now raises `IOError`, rather than failing at
    the time of the HTTPS request with a fairly inscrutable certificate
    validation error.
-   The behavior of `SessionRedirectMixin` was slightly altered.
    `resolve_redirects` will now detect a redirect by calling
    `get_redirect_target(response)` instead of directly querying
    `Response.is_redirect` and `Response.headers['location']`. Advanced
    users will be able to process malformed redirects more easily.
-   Changed the internal calculation of elapsed request time to have
    higher resolution on Windows.
-   Added `win_inet_pton` as conditional dependency for the `[socks]`
    extra on Windows with Python 2.7.
-   Changed the proxy bypass implementation on Windows: the proxy bypass
    check doesn't use forward and reverse DNS requests anymore
-   URLs with schemes that begin with `http` but are not `http` or
    `https` no longer have their host parts forced to lowercase.

**Bugfixes**

-   Much improved handling of non-ASCII `Location` header values in
    redirects. Fewer `UnicodeDecodeErrors` are encountered on Python 2,
    and Python 3 now correctly understands that Latin-1 is unlikely to
    be the correct encoding.
-   If an attempt to `seek` file to find out its length fails, we now
    appropriately handle that by aborting our content-length
    calculations.
-   Restricted `HTTPDigestAuth` to only respond to auth challenges made
    on 4XX responses, rather than to all auth challenges.
-   Fixed some code that was firing `DeprecationWarning` on Python 3.6.
-   The dismayed person emoticon (`/o\\`) no longer has a big head. I'm
    sure this is what you were all worrying about most.

**Miscellaneous**

-   Updated bundled urllib3 to v1.21.1.
-   Updated bundled chardet to v3.0.2.
-   Updated bundled idna to v2.5.
-   Updated bundled certifi to 2017.4.17.

2.13.0 (2017-01-24)
-------------------

**Features**

-   Only load the `idna` library when we've determined we need it. This
    will save some memory for users.

**Miscellaneous**

-   Updated bundled urllib3 to 1.20.
-   Updated bundled idna to 2.2.

2.12.5 (2017-01-18)
-------------------

**Bugfixes**

-   Fixed an issue with JSON encoding detection, specifically detecting
    big-endian UTF-32 with BOM.

2.12.4 (2016-12-14)
-------------------

**Bugfixes**

-   Fixed regression from 2.12.2 where non-string types were rejected in
    the basic auth parameters. While support for this behaviour has been
    readded, the behaviour is deprecated and will be removed in the
    future.

2.12.3 (2016-12-01)
-------------------

**Bugfixes**

-   Fixed regression from v2.12.1 for URLs with schemes that begin with
    "http". These URLs have historically been processed as though they
    were HTTP-schemed URLs, and so have had parameters added. This was
    removed in v2.12.2 in an overzealous attempt to resolve problems
    with IDNA-encoding those URLs. This change was reverted: the other
    fixes for IDNA-encoding have been judged to be sufficient to return
    to the behaviour Requests had before v2.12.0.

2.12.2 (2016-11-30)
-------------------

**Bugfixes**

-   Fixed several issues with IDNA-encoding URLs that are technically
    invalid but which are widely accepted. Requests will now attempt to
    IDNA-encode a URL if it can but, if it fails, and the host contains
    only ASCII characters, it will be passed through optimistically.
    This will allow users to opt-in to using IDNA2003 themselves if they
    want to, and will also allow technically invalid but still common
    hostnames.
-   Fixed an issue where URLs with leading whitespace would raise
    `InvalidSchema` errors.
-   Fixed an issue where some URLs without the HTTP or HTTPS schemes
    would still have HTTP URL preparation applied to them.
-   Fixed an issue where Unicode strings could not be used in basic
    auth.
-   Fixed an issue encountered by some Requests plugins where
    constructing a Response object would cause `Response.content` to
    raise an `AttributeError`.

2.12.1 (2016-11-16)
-------------------

**Bugfixes**

-   Updated setuptools 'security' extra for the new PyOpenSSL backend in
    urllib3.

**Miscellaneous**

-   Updated bundled urllib3 to 1.19.1.

2.12.0 (2016-11-15)
-------------------

**Improvements**

-   Updated support for internationalized domain names from IDNA2003 to
    IDNA2008. This updated support is required for several forms of IDNs
    and is mandatory for .de domains.
-   Much improved heuristics for guessing content lengths: Requests will
    no longer read an entire `StringIO` into memory.
-   Much improved logic for recalculating `Content-Length` headers for
    `PreparedRequest` objects.
-   Improved tolerance for file-like objects that have no `tell` method
    but do have a `seek` method.
-   Anything that is a subclass of `Mapping` is now treated like a
    dictionary by the `data=` keyword argument.
-   Requests now tolerates empty passwords in proxy credentials, rather
    than stripping the credentials.
-   If a request is made with a file-like object as the body and that
    request is redirected with a 307 or 308 status code, Requests will
    now attempt to rewind the body object so it can be replayed.

**Bugfixes**

-   When calling `response.close`, the call to `close` will be
    propagated through to non-urllib3 backends.
-   Fixed issue where the `ALL_PROXY` environment variable would be
    preferred over scheme-specific variables like `HTTP_PROXY`.
-   Fixed issue where non-UTF8 reason phrases got severely mangled by
    falling back to decoding using ISO 8859-1 instead.
-   Fixed a bug where Requests would not correctly correlate cookies set
    when using custom Host headers if those Host headers did not use the
    native string type for the platform.

**Miscellaneous**

-   Updated bundled urllib3 to 1.19.
-   Updated bundled certifi certs to 2016.09.26.

2.11.1 (2016-08-17)
-------------------

**Bugfixes**

-   Fixed a bug when using `iter_content` with `decode_unicode=True` for
    streamed bodies would raise `AttributeError`. This bug was
    introduced in 2.11.
-   Strip Content-Type and Transfer-Encoding headers from the header
    block when following a redirect that transforms the verb from
    POST/PUT to GET.

2.11.0 (2016-08-08)
-------------------

**Improvements**

-   Added support for the `ALL_PROXY` environment variable.
-   Reject header values that contain leading whitespace or newline
    characters to reduce risk of header smuggling.

**Bugfixes**

-   Fixed occasional `TypeError` when attempting to decode a JSON
    response that occurred in an error case. Now correctly returns a
    `ValueError`.
-   Requests would incorrectly ignore a non-CIDR IP address in the
    `NO_PROXY` environment variables: Requests now treats it as a
    specific IP.
-   Fixed a bug when sending JSON data that could cause us to encounter
    obscure OpenSSL errors in certain network conditions (yes, really).
-   Added type checks to ensure that `iter_content` only accepts
    integers and `None` for chunk sizes.
-   Fixed issue where responses whose body had not been fully consumed
    would have the underlying connection closed but not returned to the
    connection pool, which could cause Requests to hang in situations
    where the `HTTPAdapter` had been configured to use a blocking
    connection pool.

**Miscellaneous**

-   Updated bundled urllib3 to 1.16.
-   Some previous releases accidentally accepted non-strings as
    acceptable header values. This release does not.

2.10.0 (2016-04-29)
-------------------

**New Features**

-   SOCKS Proxy Support! (requires PySocks;
    `$ pip install requests[socks]`)

**Miscellaneous**

-   Updated bundled urllib3 to 1.15.1.

2.9.2 (2016-04-29)
------------------

**Improvements**

-   Change built-in CaseInsensitiveDict (used for headers) to use
    OrderedDict as its underlying datastore.

**Bugfixes**

-   Don't use redirect\_cache if allow\_redirects=False
-   When passed objects that throw exceptions from `tell()`, send them
    via chunked transfer encoding instead of failing.
-   Raise a ProxyError for proxy related connection issues.

2.9.1 (2015-12-21)
------------------

**Bugfixes**

-   Resolve regression introduced in 2.9.0 that made it impossible to
    send binary strings as bodies in Python 3.
-   Fixed errors when calculating cookie expiration dates in certain
    locales.

**Miscellaneous**

-   Updated bundled urllib3 to 1.13.1.

2.9.0 (2015-12-15)
------------------

**Minor Improvements** (Backwards compatible)

-   The `verify` keyword argument now supports being passed a path to a
    directory of CA certificates, not just a single-file bundle.
-   Warnings are now emitted when sending files opened in text mode.
-   Added the 511 Network Authentication Required status code to the
    status code registry.

**Bugfixes**

-   For file-like objects that are not sought to the very beginning, we
    now send the content length for the number of bytes we will actually
    read, rather than the total size of the file, allowing partial file
    uploads.
-   When uploading file-like objects, if they are empty or have no
    obvious content length we set `Transfer-Encoding: chunked` rather
    than `Content-Length: 0`.
-   We correctly receive the response in buffered mode when uploading
    chunked bodies.
-   We now handle being passed a query string as a bytestring on Python
    3, by decoding it as UTF-8.
-   Sessions are now closed in all cases (exceptional and not) when
    using the functional API rather than leaking and waiting for the
    garbage collector to clean them up.
-   Correctly handle digest auth headers with a malformed `qop`
    directive that contains no token, by treating it the same as if no
    `qop` directive was provided at all.
-   Minor performance improvements when removing specific cookies by
    name.

**Miscellaneous**

-   Updated urllib3 to 1.13.

2.8.1 (2015-10-13)
------------------

**Bugfixes**

-   Update certificate bundle to match `certifi` 2015.9.6.2's weak
    certificate bundle.
-   Fix a bug in 2.8.0 where requests would raise `ConnectTimeout`
    instead of `ConnectionError`
-   When using the PreparedRequest flow, requests will now correctly
    respect the `json` parameter. Broken in 2.8.0.
-   When using the PreparedRequest flow, requests will now correctly
    handle a Unicode-string method name on Python 2. Broken in 2.8.0.

2.8.0 (2015-10-05)
------------------

**Minor Improvements** (Backwards Compatible)

-   Requests now supports per-host proxies. This allows the `proxies`
    dictionary to have entries of the form
    `{'<scheme>://<hostname>': '<proxy>'}`. Host-specific proxies will
    be used in preference to the previously-supported scheme-specific
    ones, but the previous syntax will continue to work.
-   `Response.raise_for_status` now prints the URL that failed as part
    of the exception message.
-   `requests.utils.get_netrc_auth` now takes an `raise_errors` kwarg,
    defaulting to `False`. When `True`, errors parsing `.netrc` files
    cause exceptions to be thrown.
-   Change to bundled projects import logic to make it easier to
    unbundle requests downstream.
-   Changed the default User-Agent string to avoid leaking data on
    Linux: now contains only the requests version.

**Bugfixes**

-   The `json` parameter to `post()` and friends will now only be used
    if neither `data` nor `files` are present, consistent with the
    documentation.
-   We now ignore empty fields in the `NO_PROXY` environment variable.
-   Fixed problem where `httplib.BadStatusLine` would get raised if
    combining `stream=True` with `contextlib.closing`.
-   Prevented bugs where we would attempt to return the same connection
    back to the connection pool twice when sending a Chunked body.
-   Miscellaneous minor internal changes.
-   Digest Auth support is now thread safe.

**Updates**

-   Updated urllib3 to 1.12.

2.7.0 (2015-05-03)
------------------

This is the first release that follows our new release process. For
more, see [our
documentation](https://requests.readthedocs.io/en/latest/community/release-process/).

**Bugfixes**

-   Updated urllib3 to 1.10.4, resolving several bugs involving chunked
    transfer encoding and response framing.

2.6.2 (2015-04-23)
------------------

**Bugfixes**

-   Fix regression where compressed data that was sent as chunked data
    was not properly decompressed. (\#2561)

2.6.1 (2015-04-22)
------------------

**Bugfixes**

-   Remove VendorAlias import machinery introduced in v2.5.2.
-   Simplify the PreparedRequest.prepare API: We no longer require the
    user to pass an empty list to the hooks keyword argument. (c.f.
    \#2552)
-   Resolve redirects now receives and forwards all of the original
    arguments to the adapter. (\#2503)
-   Handle UnicodeDecodeErrors when trying to deal with a unicode URL
    that cannot be encoded in ASCII. (\#2540)
-   Populate the parsed path of the URI field when performing Digest
    Authentication. (\#2426)
-   Copy a PreparedRequest's CookieJar more reliably when it is not an
    instance of RequestsCookieJar. (\#2527)

2.6.0 (2015-03-14)
------------------

**Bugfixes**

-   CVE-2015-2296: Fix handling of cookies on redirect. Previously a
    cookie without a host value set would use the hostname for the
    redirected URL exposing requests users to session fixation attacks
    and potentially cookie stealing. This was disclosed privately by
    Matthew Daley of [BugFuzz](https://bugfuzz.com). This affects all
    versions of requests from v2.1.0 to v2.5.3 (inclusive on both ends).
-   Fix error when requests is an `install_requires` dependency and
    `python setup.py test` is run. (\#2462)
-   Fix error when urllib3 is unbundled and requests continues to use
    the vendored import location.
-   Include fixes to `urllib3`'s header handling.
-   Requests' handling of unvendored dependencies is now more
    restrictive.

**Features and Improvements**

-   Support bytearrays when passed as parameters in the `files`
    argument. (\#2468)
-   Avoid data duplication when creating a request with `str`, `bytes`,
    or `bytearray` input to the `files` argument.

2.5.3 (2015-02-24)
------------------

**Bugfixes**

-   Revert changes to our vendored certificate bundle. For more context
    see (\#2455, \#2456, and <https://bugs.python.org/issue23476>)

2.5.2 (2015-02-23)
------------------

**Features and Improvements**

-   Add sha256 fingerprint support.
    ([shazow/urllib3\#540](https://github.com/shazow/urllib3/pull/540))
-   Improve the performance of headers.
    ([shazow/urllib3\#544](https://github.com/shazow/urllib3/pull/544))

**Bugfixes**

-   Copy pip's import machinery. When downstream redistributors remove
    requests.packages.urllib3 the import machinery will continue to let
    those same symbols work. Example usage in requests' documentation
    and 3rd-party libraries relying on the vendored copies of urllib3
    will work without having to fallback to the system urllib3.
-   Attempt to quote parts of the URL on redirect if unquoting and then
    quoting fails. (\#2356)
-   Fix filename type check for multipart form-data uploads. (\#2411)
-   Properly handle the case where a server issuing digest
    authentication challenges provides both auth and auth-int
    qop-values. (\#2408)
-   Fix a socket leak.
    ([shazow/urllib3\#549](https://github.com/shazow/urllib3/pull/549))
-   Fix multiple `Set-Cookie` headers properly.
    ([shazow/urllib3\#534](https://github.com/shazow/urllib3/pull/534))
-   Disable the built-in hostname verification.
    ([shazow/urllib3\#526](https://github.com/shazow/urllib3/pull/526))
-   Fix the behaviour of decoding an exhausted stream.
    ([shazow/urllib3\#535](https://github.com/shazow/urllib3/pull/535))

**Security**

-   Pulled in an updated `cacert.pem`.
-   Drop RC4 from the default cipher list.
    ([shazow/urllib3\#551](https://github.com/shazow/urllib3/pull/551))

2.5.1 (2014-12-23)
------------------

**Behavioural Changes**

-   Only catch HTTPErrors in raise\_for\_status (\#2382)

**Bugfixes**

-   Handle LocationParseError from urllib3 (\#2344)
-   Handle file-like object filenames that are not strings (\#2379)
-   Unbreak HTTPDigestAuth handler. Allow new nonces to be negotiated
    (\#2389)

2.5.0 (2014-12-01)
------------------

**Improvements**

-   Allow usage of urllib3's Retry object with HTTPAdapters (\#2216)
-   The `iter_lines` method on a response now accepts a delimiter with
    which to split the content (\#2295)

**Behavioural Changes**

-   Add deprecation warnings to functions in requests.utils that will be
    removed in 3.0 (\#2309)
-   Sessions used by the functional API are always closed (\#2326)
-   Restrict requests to HTTP/1.1 and HTTP/1.0 (stop accepting HTTP/0.9)
    (\#2323)

**Bugfixes**

-   Only parse the URL once (\#2353)
-   Allow Content-Length header to always be overridden (\#2332)
-   Properly handle files in HTTPDigestAuth (\#2333)
-   Cap redirect\_cache size to prevent memory abuse (\#2299)
-   Fix HTTPDigestAuth handling of redirects after authenticating
    successfully (\#2253)
-   Fix crash with custom method parameter to Session.request (\#2317)
-   Fix how Link headers are parsed using the regular expression library
    (\#2271)

**Documentation**

-   Add more references for interlinking (\#2348)
-   Update CSS for theme (\#2290)
-   Update width of buttons and sidebar (\#2289)
-   Replace references of Gittip with Gratipay (\#2282)
-   Add link to changelog in sidebar (\#2273)

2.4.3 (2014-10-06)
------------------

**Bugfixes**

-   Unicode URL improvements for Python 2.
-   Re-order JSON param for backwards compat.
-   Automatically defrag authentication schemes from host/pass URIs.
    ([\#2249](https://github.com/psf/requests/issues/2249))

2.4.2 (2014-10-05)
------------------

**Improvements**

-   FINALLY! Add json parameter for uploads!
    ([\#2258](https://github.com/psf/requests/pull/2258))
-   Support for bytestring URLs on Python 3.x
    ([\#2238](https://github.com/psf/requests/pull/2238))

**Bugfixes**

-   Avoid getting stuck in a loop
    ([\#2244](https://github.com/psf/requests/pull/2244))
-   Multiple calls to iter\* fail with unhelpful error.
    ([\#2240](https://github.com/psf/requests/issues/2240),
    [\#2241](https://github.com/psf/requests/issues/2241))

**Documentation**

-   Correct redirection introduction
    ([\#2245](https://github.com/psf/requests/pull/2245/))
-   Added example of how to send multiple files in one request.
    ([\#2227](https://github.com/psf/requests/pull/2227/))
-   Clarify how to pass a custom set of CAs
    ([\#2248](https://github.com/psf/requests/pull/2248/))

2.4.1 (2014-09-09)
------------------

-   Now has a "security" package extras set,
    `$ pip install requests[security]`
-   Requests will now use Certifi if it is available.
-   Capture and re-raise urllib3 ProtocolError
-   Bugfix for responses that attempt to redirect to themselves forever
    (wtf?).

2.4.0 (2014-08-29)
------------------

**Behavioral Changes**

-   `Connection: keep-alive` header is now sent automatically.

**Improvements**

-   Support for connect timeouts! Timeout now accepts a tuple (connect,
    read) which is used to set individual connect and read timeouts.
-   Allow copying of PreparedRequests without headers/cookies.
-   Updated bundled urllib3 version.
-   Refactored settings loading from environment -- new
    Session.merge\_environment\_settings.
-   Handle socket errors in iter\_content.

2.3.0 (2014-05-16)
------------------

**API Changes**

-   New `Response` property `is_redirect`, which is true when the
    library could have processed this response as a redirection (whether
    or not it actually did).
-   The `timeout` parameter now affects requests with both `stream=True`
    and `stream=False` equally.
-   The change in v2.0.0 to mandate explicit proxy schemes has been
    reverted. Proxy schemes now default to `http://`.
-   The `CaseInsensitiveDict` used for HTTP headers now behaves like a
    normal dictionary when references as string or viewed in the
    interpreter.

**Bugfixes**

-   No longer expose Authorization or Proxy-Authorization headers on
    redirect. Fix CVE-2014-1829 and CVE-2014-1830 respectively.
-   Authorization is re-evaluated each redirect.
-   On redirect, pass url as native strings.
-   Fall-back to autodetected encoding for JSON when Unicode detection
    fails.
-   Headers set to `None` on the `Session` are now correctly not sent.
-   Correctly honor `decode_unicode` even if it wasn't used earlier in
    the same response.
-   Stop advertising `compress` as a supported Content-Encoding.
-   The `Response.history` parameter is now always a list.
-   Many, many `urllib3` bugfixes.

2.2.1 (2014-01-23)
------------------

**Bugfixes**

-   Fixes incorrect parsing of proxy credentials that contain a literal
    or encoded '\#' character.
-   Assorted urllib3 fixes.

2.2.0 (2014-01-09)
------------------

**API Changes**

-   New exception: `ContentDecodingError`. Raised instead of `urllib3`
    `DecodeError` exceptions.

**Bugfixes**

-   Avoid many many exceptions from the buggy implementation of
    `proxy_bypass` on OS X in Python 2.6.
-   Avoid crashing when attempting to get authentication credentials
    from \~/.netrc when running as a user without a home directory.
-   Use the correct pool size for pools of connections to proxies.
-   Fix iteration of `CookieJar` objects.
-   Ensure that cookies are persisted over redirect.
-   Switch back to using chardet, since it has merged with charade.

2.1.0 (2013-12-05)
------------------

-   Updated CA Bundle, of course.
-   Cookies set on individual Requests through a `Session` (e.g. via
    `Session.get()`) are no longer persisted to the `Session`.
-   Clean up connections when we hit problems during chunked upload,
    rather than leaking them.
-   Return connections to the pool when a chunked upload is successful,
    rather than leaking it.
-   Match the HTTPbis recommendation for HTTP 301 redirects.
-   Prevent hanging when using streaming uploads and Digest Auth when a
    401 is received.
-   Values of headers set by Requests are now always the native string
    type.
-   Fix previously broken SNI support.
-   Fix accessing HTTP proxies using proxy authentication.
-   Unencode HTTP Basic usernames and passwords extracted from URLs.
-   Support for IP address ranges for no\_proxy environment variable
-   Parse headers correctly when users override the default `Host:`
    header.
-   Avoid munging the URL in case of case-sensitive servers.
-   Looser URL handling for non-HTTP/HTTPS urls.
-   Accept unicode methods in Python 2.6 and 2.7.
-   More resilient cookie handling.
-   Make `Response` objects pickleable.
-   Actually added MD5-sess to Digest Auth instead of pretending to like
    last time.
-   Updated internal urllib3.
-   Fixed @Lukasa's lack of taste.

2.0.1 (2013-10-24)
------------------

-   Updated included CA Bundle with new mistrusts and automated process
    for the future
-   Added MD5-sess to Digest Auth
-   Accept per-file headers in multipart file POST messages.
-   Fixed: Don't send the full URL on CONNECT messages.
-   Fixed: Correctly lowercase a redirect scheme.
-   Fixed: Cookies not persisted when set via functional API.
-   Fixed: Translate urllib3 ProxyError into a requests ProxyError
    derived from ConnectionError.
-   Updated internal urllib3 and chardet.

2.0.0 (2013-09-24)
------------------

**API Changes:**

-   Keys in the Headers dictionary are now native strings on all Python
    versions, i.e. bytestrings on Python 2, unicode on Python 3.
-   Proxy URLs now *must* have an explicit scheme. A `MissingSchema`
    exception will be raised if they don't.
-   Timeouts now apply to read time if `Stream=False`.
-   `RequestException` is now a subclass of `IOError`, not
    `RuntimeError`.
-   Added new method to `PreparedRequest` objects:
    `PreparedRequest.copy()`.
-   Added new method to `Session` objects: `Session.update_request()`.
    This method updates a `Request` object with the data (e.g. cookies)
    stored on the `Session`.
-   Added new method to `Session` objects: `Session.prepare_request()`.
    This method updates and prepares a `Request` object, and returns the
    corresponding `PreparedRequest` object.
-   Added new method to `HTTPAdapter` objects:
    `HTTPAdapter.proxy_headers()`. This should not be called directly,
    but improves the subclass interface.
-   `httplib.IncompleteRead` exceptions caused by incorrect chunked
    encoding will now raise a Requests `ChunkedEncodingError` instead.
-   Invalid percent-escape sequences now cause a Requests `InvalidURL`
    exception to be raised.
-   HTTP 208 no longer uses reason phrase `"im_used"`. Correctly uses
    `"already_reported"`.
-   HTTP 226 reason added (`"im_used"`).

**Bugfixes:**

-   Vastly improved proxy support, including the CONNECT verb. Special
    thanks to the many contributors who worked towards this improvement.
-   Cookies are now properly managed when 401 authentication responses
    are received.
-   Chunked encoding fixes.
-   Support for mixed case schemes.
-   Better handling of streaming downloads.
-   Retrieve environment proxies from more locations.
-   Minor cookies fixes.
-   Improved redirect behaviour.
-   Improved streaming behaviour, particularly for compressed data.
-   Miscellaneous small Python 3 text encoding bugs.
-   `.netrc` no longer overrides explicit auth.
-   Cookies set by hooks are now correctly persisted on Sessions.
-   Fix problem with cookies that specify port numbers in their host
    field.
-   `BytesIO` can be used to perform streaming uploads.
-   More generous parsing of the `no_proxy` environment variable.
-   Non-string objects can be passed in data values alongside files.

1.2.3 (2013-05-25)
------------------

-   Simple packaging fix

1.2.2 (2013-05-23)
------------------

-   Simple packaging fix

1.2.1 (2013-05-20)
------------------

-   301 and 302 redirects now change the verb to GET for all verbs, not
    just POST, improving browser compatibility.
-   Python 3.3.2 compatibility
-   Always percent-encode location headers
-   Fix connection adapter matching to be most-specific first
-   new argument to the default connection adapter for passing a block
    argument
-   prevent a KeyError when there's no link headers

1.2.0 (2013-03-31)
------------------

-   Fixed cookies on sessions and on requests
-   Significantly change how hooks are dispatched - hooks now receive
    all the arguments specified by the user when making a request so
    hooks can make a secondary request with the same parameters. This is
    especially necessary for authentication handler authors
-   certifi support was removed
-   Fixed bug where using OAuth 1 with body `signature_type` sent no
    data
-   Major proxy work thanks to @Lukasa including parsing of proxy
    authentication from the proxy url
-   Fix DigestAuth handling too many 401s
-   Update vendored urllib3 to include SSL bug fixes
-   Allow keyword arguments to be passed to `json.loads()` via the
    `Response.json()` method
-   Don't send `Content-Length` header by default on `GET` or `HEAD`
    requests
-   Add `elapsed` attribute to `Response` objects to time how long a
    request took.
-   Fix `RequestsCookieJar`
-   Sessions and Adapters are now picklable, i.e., can be used with the
    multiprocessing library
-   Update charade to version 1.0.3

The change in how hooks are dispatched will likely cause a great deal of
issues.

1.1.0 (2013-01-10)
------------------

-   CHUNKED REQUESTS
-   Support for iterable response bodies
-   Assume servers persist redirect params
-   Allow explicit content types to be specified for file data
-   Make merge\_kwargs case-insensitive when looking up keys

1.0.3 (2012-12-18)
------------------

-   Fix file upload encoding bug
-   Fix cookie behavior

1.0.2 (2012-12-17)
------------------

-   Proxy fix for HTTPAdapter.

1.0.1 (2012-12-17)
------------------

-   Cert verification exception bug.
-   Proxy fix for HTTPAdapter.

1.0.0 (2012-12-17)
------------------

-   Massive Refactor and Simplification
-   Switch to Apache 2.0 license
-   Swappable Connection Adapters
-   Mountable Connection Adapters
-   Mutable ProcessedRequest chain
-   /s/prefetch/stream
-   Removal of all configuration
-   Standard library logging
-   Make Response.json() callable, not property.
-   Usage of new charade project, which provides python 2 and 3
    simultaneous chardet.
-   Removal of all hooks except 'response'
-   Removal of all authentication helpers (OAuth, Kerberos)

This is not a backwards compatible change.

0.14.2 (2012-10-27)
-------------------

-   Improved mime-compatible JSON handling
-   Proxy fixes
-   Path hack fixes
-   Case-Insensitive Content-Encoding headers
-   Support for CJK parameters in form posts

0.14.1 (2012-10-01)
-------------------

-   Python 3.3 Compatibility
-   Simply default accept-encoding
-   Bugfixes

0.14.0 (2012-09-02)
-------------------

-   No more iter\_content errors if already downloaded.

0.13.9 (2012-08-25)
-------------------

-   Fix for OAuth + POSTs
-   Remove exception eating from dispatch\_hook
-   General bugfixes

0.13.8 (2012-08-21)
-------------------

-   Incredible Link header support :)

0.13.7 (2012-08-19)
-------------------

-   Support for (key, value) lists everywhere.
-   Digest Authentication improvements.
-   Ensure proxy exclusions work properly.
-   Clearer UnicodeError exceptions.
-   Automatic casting of URLs to strings (fURL and such)
-   Bugfixes.

0.13.6 (2012-08-06)
-------------------

-   Long awaited fix for hanging connections!

0.13.5 (2012-07-27)
-------------------

-   Packaging fix

0.13.4 (2012-07-27)
-------------------

-   GSSAPI/Kerberos authentication!
-   App Engine 2.7 Fixes!
-   Fix leaking connections (from urllib3 update)
-   OAuthlib path hack fix
-   OAuthlib URL parameters fix.

0.13.3 (2012-07-12)
-------------------

-   Use simplejson if available.
-   Do not hide SSLErrors behind Timeouts.
-   Fixed param handling with urls containing fragments.
-   Significantly improved information in User Agent.
-   client certificates are ignored when verify=False

0.13.2 (2012-06-28)
-------------------

-   Zero dependencies (once again)!
-   New: Response.reason
-   Sign querystring parameters in OAuth 1.0
-   Client certificates no longer ignored when verify=False
-   Add openSUSE certificate support

0.13.1 (2012-06-07)
-------------------

-   Allow passing a file or file-like object as data.
-   Allow hooks to return responses that indicate errors.
-   Fix Response.text and Response.json for body-less responses.

0.13.0 (2012-05-29)
-------------------

-   Removal of Requests.async in favor of
    [grequests](https://github.com/kennethreitz/grequests)
-   Allow disabling of cookie persistence.
-   New implementation of safe\_mode
-   cookies.get now supports default argument
-   Session cookies not saved when Session.request is called with
    return\_response=False
-   Env: no\_proxy support.
-   RequestsCookieJar improvements.
-   Various bug fixes.

0.12.1 (2012-05-08)
-------------------

-   New `Response.json` property.
-   Ability to add string file uploads.
-   Fix out-of-range issue with iter\_lines.
-   Fix iter\_content default size.
-   Fix POST redirects containing files.

0.12.0 (2012-05-02)
-------------------

-   EXPERIMENTAL OAUTH SUPPORT!
-   Proper CookieJar-backed cookies interface with awesome dict-like
    interface.
-   Speed fix for non-iterated content chunks.
-   Move `pre_request` to a more usable place.
-   New `pre_send` hook.
-   Lazily encode data, params, files.
-   Load system Certificate Bundle if `certify` isn't available.
-   Cleanups, fixes.

0.11.2 (2012-04-22)
-------------------

-   Attempt to use the OS's certificate bundle if `certifi` isn't
    available.
-   Infinite digest auth redirect fix.
-   Multi-part file upload improvements.
-   Fix decoding of invalid %encodings in URLs.
-   If there is no content in a response don't throw an error the second
    time that content is attempted to be read.
-   Upload data on redirects.

0.11.1 (2012-03-30)
-------------------

-   POST redirects now break RFC to do what browsers do: Follow up with
    a GET.
-   New `strict_mode` configuration to disable new redirect behavior.

0.11.0 (2012-03-14)
-------------------

-   Private SSL Certificate support
-   Remove select.poll from Gevent monkeypatching
-   Remove redundant generator for chunked transfer encoding
-   Fix: Response.ok raises Timeout Exception in safe\_mode

0.10.8 (2012-03-09)
-------------------

-   Generate chunked ValueError fix
-   Proxy configuration by environment variables
-   Simplification of iter\_lines.
-   New trust\_env configuration for disabling system/environment hints.
-   Suppress cookie errors.

0.10.7 (2012-03-07)
-------------------

-   encode\_uri = False

0.10.6 (2012-02-25)
-------------------

-   Allow '=' in cookies.

0.10.5 (2012-02-25)
-------------------

-   Response body with 0 content-length fix.
-   New async.imap.
-   Don't fail on netrc.

0.10.4 (2012-02-20)
-------------------

-   Honor netrc.

0.10.3 (2012-02-20)
-------------------

-   HEAD requests don't follow redirects anymore.
-   raise\_for\_status() doesn't raise for 3xx anymore.
-   Make Session objects picklable.
-   ValueError for invalid schema URLs.

0.10.2 (2012-01-15)
-------------------

-   Vastly improved URL quoting.
-   Additional allowed cookie key values.
-   Attempted fix for "Too many open files" Error
-   Replace unicode errors on first pass, no need for second pass.
-   Append '/' to bare-domain urls before query insertion.
-   Exceptions now inherit from RuntimeError.
-   Binary uploads + auth fix.
-   Bugfixes.

0.10.1 (2012-01-23)
-------------------

-   PYTHON 3 SUPPORT!
-   Dropped 2.5 Support. (*Backwards Incompatible*)

0.10.0 (2012-01-21)
-------------------

-   `Response.content` is now bytes-only. (*Backwards Incompatible*)
-   New `Response.text` is unicode-only.
-   If no `Response.encoding` is specified and `chardet` is available,
    `Response.text` will guess an encoding.
-   Default to ISO-8859-1 (Western) encoding for "text" subtypes.
-   Removal of decode\_unicode. (*Backwards Incompatible*)
-   New multiple-hooks system.
-   New `Response.register_hook` for registering hooks within the
    pipeline.
-   `Response.url` is now Unicode.

0.9.3 (2012-01-18)
------------------

-   SSL verify=False bugfix (apparent on windows machines).

0.9.2 (2012-01-18)
------------------

-   Asynchronous async.send method.
-   Support for proper chunk streams with boundaries.
-   session argument for Session classes.
-   Print entire hook tracebacks, not just exception instance.
-   Fix response.iter\_lines from pending next line.
-   Fix but in HTTP-digest auth w/ URI having query strings.
-   Fix in Event Hooks section.
-   Urllib3 update.

0.9.1 (2012-01-06)
------------------

-   danger\_mode for automatic Response.raise\_for\_status()
-   Response.iter\_lines refactor

0.9.0 (2011-12-28)
------------------

-   verify ssl is default.

0.8.9 (2011-12-28)
------------------

-   Packaging fix.

0.8.8 (2011-12-28)
------------------

-   SSL CERT VERIFICATION!
-   Release of Cerifi: Mozilla's cert list.
-   New 'verify' argument for SSL requests.
-   Urllib3 update.

0.8.7 (2011-12-24)
------------------

-   iter\_lines last-line truncation fix
-   Force safe\_mode for async requests
-   Handle safe\_mode exceptions more consistently
-   Fix iteration on null responses in safe\_mode

0.8.6 (2011-12-18)
------------------

-   Socket timeout fixes.
-   Proxy Authorization support.

0.8.5 (2011-12-14)
------------------

-   Response.iter\_lines!

0.8.4 (2011-12-11)
------------------

-   Prefetch bugfix.
-   Added license to installed version.

0.8.3 (2011-11-27)
------------------

-   Converted auth system to use simpler callable objects.
-   New session parameter to API methods.
-   Display full URL while logging.

0.8.2 (2011-11-19)
------------------

-   New Unicode decoding system, based on over-ridable
    Response.encoding.
-   Proper URL slash-quote handling.
-   Cookies with `[`, `]`, and `_` allowed.

0.8.1 (2011-11-15)
------------------

-   URL Request path fix
-   Proxy fix.
-   Timeouts fix.

0.8.0 (2011-11-13)
------------------

-   Keep-alive support!
-   Complete removal of Urllib2
-   Complete removal of Poster
-   Complete removal of CookieJars
-   New ConnectionError raising
-   Safe\_mode for error catching
-   prefetch parameter for request methods
-   OPTION method
-   Async pool size throttling
-   File uploads send real names
-   Vendored in urllib3

0.7.6 (2011-11-07)
------------------

-   Digest authentication bugfix (attach query data to path)

0.7.5 (2011-11-04)
------------------

-   Response.content = None if there was an invalid response.
-   Redirection auth handling.

0.7.4 (2011-10-26)
------------------

-   Session Hooks fix.

0.7.3 (2011-10-23)
------------------

-   Digest Auth fix.

0.7.2 (2011-10-23)
------------------

-   PATCH Fix.

0.7.1 (2011-10-23)
------------------

-   Move away from urllib2 authentication handling.
-   Fully Remove AuthManager, AuthObject, &c.
-   New tuple-based auth system with handler callbacks.

0.7.0 (2011-10-22)
------------------

-   Sessions are now the primary interface.
-   Deprecated InvalidMethodException.
-   PATCH fix.
-   New config system (no more global settings).

0.6.6 (2011-10-19)
------------------

-   Session parameter bugfix (params merging).

0.6.5 (2011-10-18)
------------------

-   Offline (fast) test suite.
-   Session dictionary argument merging.

0.6.4 (2011-10-13)
------------------

-   Automatic decoding of unicode, based on HTTP Headers.
-   New `decode_unicode` setting.
-   Removal of `r.read/close` methods.
-   New `r.faw` interface for advanced response usage.\*
-   Automatic expansion of parameterized headers.

0.6.3 (2011-10-13)
------------------

-   Beautiful `requests.async` module, for making async requests w/
    gevent.

0.6.2 (2011-10-09)
------------------

-   GET/HEAD obeys allow\_redirects=False.

0.6.1 (2011-08-20)
------------------

-   Enhanced status codes experience `\o/`
-   Set a maximum number of redirects (`settings.max_redirects`)
-   Full Unicode URL support
-   Support for protocol-less redirects.
-   Allow for arbitrary request types.
-   Bugfixes

0.6.0 (2011-08-17)
------------------

-   New callback hook system
-   New persistent sessions object and context manager
-   Transparent Dict-cookie handling
-   Status code reference object
-   Removed Response.cached
-   Added Response.request
-   All args are kwargs
-   Relative redirect support
-   HTTPError handling improvements
-   Improved https testing
-   Bugfixes

0.5.1 (2011-07-23)
------------------

-   International Domain Name Support!
-   Access headers without fetching entire body (`read()`)
-   Use lists as dicts for parameters
-   Add Forced Basic Authentication
-   Forced Basic is default authentication type
-   `python-requests.org` default User-Agent header
-   CaseInsensitiveDict lower-case caching
-   Response.history bugfix

0.5.0 (2011-06-21)
------------------

-   PATCH Support
-   Support for Proxies
-   HTTPBin Test Suite
-   Redirect Fixes
-   settings.verbose stream writing
-   Querystrings for all methods
-   URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as
    explicitly raised
    `r.requests.get('hwe://blah'); r.raise_for_status()`

0.4.1 (2011-05-22)
------------------

-   Improved Redirection Handling
-   New 'allow\_redirects' param for following non-GET/HEAD Redirects
-   Settings module refactoring

0.4.0 (2011-05-15)
------------------

-   Response.history: list of redirected responses
-   Case-Insensitive Header Dictionaries!
-   Unicode URLs

0.3.4 (2011-05-14)
------------------

-   Urllib2 HTTPAuthentication Recursion fix (Basic/Digest)
-   Internal Refactor
-   Bytes data upload Bugfix

0.3.3 (2011-05-12)
------------------

-   Request timeouts
-   Unicode url-encoded data
-   Settings context manager and module

0.3.2 (2011-04-15)
------------------

-   Automatic Decompression of GZip Encoded Content
-   AutoAuth Support for Tupled HTTP Auth

0.3.1 (2011-04-01)
------------------

-   Cookie Changes
-   Response.read()
-   Poster fix

0.3.0 (2011-02-25)
------------------

-   Automatic Authentication API Change
-   Smarter Query URL Parameterization
-   Allow file uploads and POST data together
-   

    New Authentication Manager System

    :   -   Simpler Basic HTTP System
        -   Supports all build-in urllib2 Auths
        -   Allows for custom Auth Handlers

0.2.4 (2011-02-19)
------------------

-   Python 2.5 Support
-   PyPy-c v1.4 Support
-   Auto-Authentication tests
-   Improved Request object constructor

0.2.3 (2011-02-15)
------------------

-   

    New HTTPHandling Methods

    :   -   Response.\_\_nonzero\_\_ (false if bad HTTP Status)
        -   Response.ok (True if expected HTTP Status)
        -   Response.error (Logged HTTPError if bad HTTP Status)
        -   Response.raise\_for\_status() (Raises stored HTTPError)

0.2.2 (2011-02-14)
------------------

-   Still handles request in the event of an HTTPError. (Issue \#2)
-   Eventlet and Gevent Monkeypatch support.
-   Cookie Support (Issue \#1)

0.2.1 (2011-02-14)
------------------

-   Added file attribute to POST and PUT requests for multipart-encode
    file uploads.
-   Added Request.url attribute for context and redirects

0.2.0 (2011-02-14)
------------------

-   Birth!

0.0.1 (2011-02-13)
------------------

-   Frustration
-   Conception
PK�(�\t�C0ww#doc/alt-python37-requests/README.mdnu�[���# Requests

**Requests** is a simple, yet elegant, HTTP library.

```python
>>> import requests
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
'{"type":"User"...'
>>> r.json()
{'disk_usage': 368627, 'private_gists': 484, ...}
```

Requests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs, or to form-encode your `PUT` & `POST` data — but nowadays, just use the `json` method!

Requests is one of the most downloaded Python package today, pulling in around `14M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `500,000+` repositories. You may certainly put your trust in this code.

[![Downloads](https://pepy.tech/badge/requests/month)](https://pepy.tech/project/requests/month)
[![Supported Versions](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests)
[![Contributors](https://img.shields.io/github/contributors/psf/requests.svg)](https://github.com/psf/requests/graphs/contributors)

## Installing Requests and Supported Versions

Requests is available on PyPI:

```console
$ python -m pip install requests
```

Requests officially supports Python 2.7 & 3.6+.

## Supported Features & Best–Practices

Requests is ready for the demands of building robust and reliable HTTP–speaking applications, for the needs of today.

- Keep-Alive & Connection Pooling
- International Domains and URLs
- Sessions with Cookie Persistence
- Browser-style TLS/SSL Verification
- Basic & Digest Authentication
- Familiar `dict`–like Cookies
- Automatic Content Decompression and Decoding
- Multi-part File Uploads
- SOCKS Proxy Support
- Connection Timeouts
- Streaming Downloads
- Automatic honoring of `.netrc`
- Chunked HTTP Requests

## API Reference and User Guide available on [Read the Docs](https://requests.readthedocs.io)

[![Read the Docs](https://raw.githubusercontent.com/psf/requests/master/ext/ss.png)](https://requests.readthedocs.io)

## Cloning the repository

When cloning the Requests repository, you may need to add the `-c
fetch.fsck.badTimezone=ignore` flag to avoid an error about a bad commit (see
[this issue](https://github.com/psf/requests/issues/2690) for more background):

```shell
git clone -c fetch.fsck.badTimezone=ignore https://github.com/psf/requests.git
```

You can also apply this setting to your global Git config:

```shell
git config --global fetch.fsck.badTimezone ignore
```

---

[![Kenneth Reitz](https://raw.githubusercontent.com/psf/requests/master/ext/kr.png)](https://kennethreitz.org) [![Python Software Foundation](https://raw.githubusercontent.com/psf/requests/master/ext/psf.png)](https://www.python.org/psf)
PK�(�\k�_GWGW$doc/alt-python37-pyjwt/CHANGELOG.rstnu�[���Changelog
=========

All notable changes to this project will be documented in this file.
This project adheres to `Semantic Versioning <https://semver.org/>`__.

`Unreleased <https://github.com/jpadilla/pyjwt/compare/2.1.0...HEAD>`__
-----------------------------------------------------------------------

Changed
~~~~~~~

Fixed
~~~~~

Added
~~~~~

`v2.1.0 <https://github.com/jpadilla/pyjwt/compare/2.0.1...2.1.0>`__
--------------------------------------------------------------------

Changed
~~~~~~~

- Allow claims validation without making JWT signature validation mandatory. `#608 <https://github.com/jpadilla/pyjwt/pull/608>`__

Fixed
~~~~~

- Remove padding from JWK test data. `#628 <https://github.com/jpadilla/pyjwt/pull/628>`__
- Make `kty` mandatory in JWK to be compliant with RFC7517. `#624 <https://github.com/jpadilla/pyjwt/pull/624>`__
- Allow JWK without `alg` to be compliant with RFC7517. `#624 <https://github.com/jpadilla/pyjwt/pull/624>`__
- Allow to verify with private key on ECAlgorithm, as well as on Ed25519Algorithm. `#645 <https://github.com/jpadilla/pyjwt/pull/645>`__

Added
~~~~~

- Add caching by default to PyJWKClient `#611 <https://github.com/jpadilla/pyjwt/pull/611>`__
- Add missing exceptions.InvalidKeyError to jwt module __init__ imports `#620 <https://github.com/jpadilla/pyjwt/pull/620>`__
- Add support for ES256K algorithm `#629 <https://github.com/jpadilla/pyjwt/pull/629>`__
- Add `from_jwk()` to Ed25519Algorithm `#621 <https://github.com/jpadilla/pyjwt/pull/621>`__
- Add `to_jwk()` to Ed25519Algorithm `#643 <https://github.com/jpadilla/pyjwt/pull/643>`__
- Export `PyJWK` and `PyJWKSet` `#652 <https://github.com/jpadilla/pyjwt/pull/652>`__

`v2.0.1 <https://github.com/jpadilla/pyjwt/compare/2.0.0...2.0.1>`__
--------------------------------------------------------------------

Changed
~~~~~~~

- Rename CHANGELOG.md to CHANGELOG.rst and include in docs `#597 <https://github.com/jpadilla/pyjwt/pull/597>`__

Fixed
~~~~~

- Fix `from_jwk()` for all algorithms `#598 <https://github.com/jpadilla/pyjwt/pull/598>`__

Added
~~~~~

`v2.0.0 <https://github.com/jpadilla/pyjwt/compare/1.7.1...2.0.0>`__
--------------------------------------------------------------------

Changed
~~~~~~~

Drop support for Python 2 and Python 3.0-3.5
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Python 3.5 is EOL so we decide to drop its support. Version ``1.7.1`` is
the last one supporting Python 3.0-3.5.

Require cryptography >= 3
^^^^^^^^^^^^^^^^^^^^^^^^^

Drop support for PyCrypto and ECDSA
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

We've kept this around for a long time, mostly for environments that
didn't allow installing cryptography.

Drop CLI
^^^^^^^^

Dropped the included cli entry point.

Improve typings
^^^^^^^^^^^^^^^

We no longer need to use mypy Python 2 compatibility mode (comments)

``jwt.encode(...)`` return type
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Tokens are returned as string instead of a byte string

Dropped deprecated errors
^^^^^^^^^^^^^^^^^^^^^^^^^

Removed ``ExpiredSignature``, ``InvalidAudience``, and
``InvalidIssuer``. Use ``ExpiredSignatureError``,
``InvalidAudienceError``, and ``InvalidIssuerError`` instead.

Dropped deprecated ``verify_expiration`` param in ``jwt.decode(...)``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Use
``jwt.decode(encoded, key, algorithms=["HS256"], options={"verify_exp": False})``
instead.

Dropped deprecated ``verify`` param in ``jwt.decode(...)``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Use ``jwt.decode(encoded, key, options={"verify_signature": False})``
instead.

Require explicit ``algorithms`` in ``jwt.decode(...)`` by default
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Example: ``jwt.decode(encoded, key, algorithms=["HS256"])``.

Dropped deprecated ``require_*`` options in ``jwt.decode(...)``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

For example, instead of
``jwt.decode(encoded, key, algorithms=["HS256"], options={"require_exp": True})``,
use
``jwt.decode(encoded, key, algorithms=["HS256"], options={"require": ["exp"]})``.

Added
~~~~~

Introduce better experience for JWKs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Introduce ``PyJWK``, ``PyJWKSet``, and ``PyJWKClient``.

.. code:: python

    import jwt
    from jwt import PyJWKClient

    token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik5FRTFRVVJCT1RNNE16STVSa0ZETlRZeE9UVTFNRGcyT0Rnd1EwVXpNVGsxUWpZeVJrUkZRdyJ9.eyJpc3MiOiJodHRwczovL2Rldi04N2V2eDlydS5hdXRoMC5jb20vIiwic3ViIjoiYVc0Q2NhNzl4UmVMV1V6MGFFMkg2a0QwTzNjWEJWdENAY2xpZW50cyIsImF1ZCI6Imh0dHBzOi8vZXhwZW5zZXMtYXBpIiwiaWF0IjoxNTcyMDA2OTU0LCJleHAiOjE1NzIwMDY5NjQsImF6cCI6ImFXNENjYTc5eFJlTFdVejBhRTJINmtEME8zY1hCVnRDIiwiZ3R5IjoiY2xpZW50LWNyZWRlbnRpYWxzIn0.PUxE7xn52aTCohGiWoSdMBZGiYAHwE5FYie0Y1qUT68IHSTXwXVd6hn02HTah6epvHHVKA2FqcFZ4GGv5VTHEvYpeggiiZMgbxFrmTEY0csL6VNkX1eaJGcuehwQCRBKRLL3zKmA5IKGy5GeUnIbpPHLHDxr-GXvgFzsdsyWlVQvPX2xjeaQ217r2PtxDeqjlf66UYl6oY6AqNS8DH3iryCvIfCcybRZkc_hdy-6ZMoKT6Piijvk_aXdm7-QQqKJFHLuEqrVSOuBqqiNfVrG27QzAPuPOxvfXTVLXL2jek5meH6n-VWgrBdoMFH93QEszEDowDAEhQPHVs0xj7SIzA"
    kid = "NEE1QURBOTM4MzI5RkFDNTYxOTU1MDg2ODgwQ0UzMTk1QjYyRkRFQw"
    url = "https://dev-87evx9ru.auth0.com/.well-known/jwks.json"

    jwks_client = PyJWKClient(url)
    signing_key = jwks_client.get_signing_key_from_jwt(token)

    data = jwt.decode(
        token,
        signing_key.key,
        algorithms=["RS256"],
        audience="https://expenses-api",
        options={"verify_exp": False},
    )
    print(data)

Support for JWKs containing ECDSA keys
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Add support for Ed25519 / EdDSA
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Pull Requests
~~~~~~~~~~~~~

-  Add PyPy3 to the test matrix (#550) by @jdufresne
-  Require tweak (#280) by @psafont
-  Decode return type is dict[str, Any] (#393) by @jacopofar
-  Fix linter error in test\_cli (#414) by @jaraco
-  Run mypy with tox (#421) by @jpadilla
-  Document (and prefer) pyjwt[crypto] req format (#426) by @gthb
-  Correct type for json\_encoder argument (#438) by @jdufresne
-  Prefer https:// links where available (#439) by @jdufresne
-  Pass python\_requires argument to setuptools (#440) by @jdufresne
-  Rename [wheel] section to [bdist\_wheel] as the former is legacy
   (#441) by @jdufresne
-  Remove setup.py test command in favor of pytest and tox (#442) by
   @jdufresne
-  Fix mypy errors (#449) by @jpadilla
-  DX Tweaks (#450) by @jpadilla
-  Add support of python 3.8 (#452) by @Djailla
-  Fix 406 (#454) by @justinbaur
-  Add support for Ed25519 / EdDSA, with unit tests (#455) by
   @Someguy123
-  Remove Python 2.7 compatibility (#457) by @Djailla
-  Fix simple typo: encododed -> encoded (#462) by @timgates42
-  Enhance tracebacks. (#477) by @JulienPalard
-  Simplify ``python_requires`` (#478) by @michael-k
-  Document top-level .encode and .decode to close #459 (#482) by
   @dimaqq
-  Improve documentation for audience usage (#484) by @CorreyL
-  Correct README on how to run tests locally (#489) by @jdufresne
-  Fix ``tox -e lint`` warnings and errors (#490) by @jdufresne
-  Run pyupgrade across project to use modern Python 3 conventions
   (#491) by @jdufresne
-  Add Python-3-only trove classifier and remove "universal" from wheel
   (#492) by @jdufresne
-  Emit warnings about user code, not pyjwt code (#494) by @mgedmin
-  Move setup information to declarative setup.cfg (#495) by @jdufresne
-  CLI options for verifying audience and issuer (#496) by
   @GeoffRichards
-  Specify the target Python version for mypy (#497) by @jdufresne
-  Remove unnecessary compatibility shims for Python 2 (#498) by
   @jdufresne
-  Setup GH Actions (#499) by @jpadilla
-  Implementation of ECAlgorithm.from\_jwk (#500) by @jpadilla
-  Remove cli entry point (#501) by @jpadilla
-  Expose InvalidKeyError on jwt module (#503) by @russellcardullo
-  Avoid loading token twice in pyjwt.decode (#506) by @CaselIT
-  Default links to stable version of documentation (#508) by @salcedo
-  Update README.md badges (#510) by @jpadilla
-  Introduce better experience for JWKs (#511) by @jpadilla
-  Fix tox conditional extras (#512) by @jpadilla
-  Return tokens as string not bytes (#513) by @jpadilla
-  Drop support for legacy contrib algorithms (#514) by @jpadilla
-  Drop deprecation warnings (#515) by @jpadilla
-  Update Auth0 sponsorship link (#519) by @Sambego
-  Update return type for jwt.encode (#521) by @moomoolive
-  Run tests against Python 3.9 and add trove classifier (#522) by
   @michael-k
-  Removed redundant ``default_backend()`` (#523) by @rohitkg98
-  Documents how to use private keys with passphrases (#525) by @rayluo
-  Update version to 2.0.0a1 (#528) by @jpadilla
-  Fix usage example (#530) by @nijel
-  add EdDSA to docs (#531) by @CircleOnCircles
-  Remove support for EOL Python 3.5 (#532) by @jdufresne
-  Upgrade to isort 5 and adjust configurations (#533) by @jdufresne
-  Remove unused argument "verify" from PyJWS.decode() (#534) by
   @jdufresne
-  Update typing syntax and usage for Python 3.6+ (#535) by @jdufresne
-  Run pyupgrade to simplify code and use Python 3.6 syntax (#536) by
   @jdufresne
-  Drop unknown pytest config option: strict (#537) by @jdufresne
-  Upgrade black version and usage (#538) by @jdufresne
-  Remove "Command line" sections from docs (#539) by @jdufresne
-  Use existing key\_path() utility function throughout tests (#540) by
   @jdufresne
-  Replace force\_bytes()/force\_unicode() in tests with literals (#541)
   by @jdufresne
-  Remove unnecessary Unicode decoding before json.loads() (#542) by
   @jdufresne
-  Remove unnecessary force\_bytes() calls priot to base64url\_decode()
   (#543) by @jdufresne
-  Remove deprecated arguments from docs (#544) by @jdufresne
-  Update code blocks in docs (#545) by @jdufresne
-  Refactor jwt/jwks\_client.py without requests dependency (#546) by
   @jdufresne
-  Tighten bytes/str boundaries and remove unnecessary coercing (#547)
   by @jdufresne
-  Replace codecs.open() with builtin open() (#548) by @jdufresne
-  Replace int\_from\_bytes() with builtin int.from\_bytes() (#549) by
   @jdufresne
-  Enforce .encode() return type using mypy (#551) by @jdufresne
-  Prefer direct indexing over options.get() (#552) by @jdufresne
-  Cleanup "noqa" comments (#553) by @jdufresne
-  Replace merge\_dict() with builtin dict unpacking generalizations
   (#555) by @jdufresne
-  Do not mutate the input payload in PyJWT.encode() (#557) by
   @jdufresne
-  Use direct indexing in PyJWKClient.get\_signing\_key\_from\_jwt()
   (#558) by @jdufresne
-  Split PyJWT/PyJWS classes to tighten type interfaces (#559) by
   @jdufresne
-  Simplify mocked\_response test utility function (#560) by @jdufresne
-  Autoupdate pre-commit hooks and apply them (#561) by @jdufresne
-  Remove unused argument "payload" from PyJWS.\ *verify*\ signature()
   (#562) by @jdufresne
-  Add utility functions to assist test skipping (#563) by @jdufresne
-  Type hint jwt.utils module (#564) by @jdufresne
-  Prefer ModuleNotFoundError over ImportError (#565) by @jdufresne
-  Fix tox "manifest" environment to pass (#566) by @jdufresne
-  Fix tox "docs" environment to pass (#567) by @jdufresne
-  Simplify black configuration to be closer to upstream defaults (#568)
   by @jdufresne
-  Use generator expressions (#569) by @jdufresne
-  Simplify from\_base64url\_uint() (#570) by @jdufresne
-  Drop lint environment from GitHub actions in favor of pre-commit.ci
   (#571) by @jdufresne
-  [pre-commit.ci] pre-commit autoupdate (#572)
-  Simplify tox configuration (#573) by @jdufresne
-  Combine identical test functions using pytest.mark.parametrize()
   (#574) by @jdufresne
-  Complete type hinting of jwks\_client.py (#578) by @jdufresne

`v1.7.1 <https://github.com/jpadilla/pyjwt/compare/1.7.0...1.7.1>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Update test dependencies with pinned ranges
-  Fix pytest deprecation warnings

`v1.7.0 <https://github.com/jpadilla/pyjwt/compare/1.6.4...1.7.0>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  Remove CRLF line endings
   `#353 <https://github.com/jpadilla/pyjwt/pull/353>`__

Fixed
~~~~~

-  Update usage.rst
   `#360 <https://github.com/jpadilla/pyjwt/pull/360>`__

Added
~~~~~

-  Support for Python 3.7
   `#375 <https://github.com/jpadilla/pyjwt/pull/375>`__
   `#379 <https://github.com/jpadilla/pyjwt/pull/379>`__
   `#384 <https://github.com/jpadilla/pyjwt/pull/384>`__

`v1.6.4 <https://github.com/jpadilla/pyjwt/compare/1.6.3...1.6.4>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Reverse an unintentional breaking API change to .decode()
   `#352 <https://github.com/jpadilla/pyjwt/pull/352>`__

`v1.6.3 <https://github.com/jpadilla/pyjwt/compare/1.6.1...1.6.3>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  All exceptions inherit from PyJWTError
   `#340 <https://github.com/jpadilla/pyjwt/pull/340>`__

Added
~~~~~

-  Add type hints `#344 <https://github.com/jpadilla/pyjwt/pull/344>`__
-  Add help module
   `7ca41e <https://github.com/jpadilla/pyjwt/commit/7ca41e53b3d7d9f5cd31bdd8a2b832d192006239>`__

Docs
~~~~

-  Added section to usage docs for jwt.get\_unverified\_header()
   `#350 <https://github.com/jpadilla/pyjwt/pull/350>`__
-  Update legacy instructions for using pycrypto
   `#337 <https://github.com/jpadilla/pyjwt/pull/337>`__

`v1.6.1 <https://github.com/jpadilla/pyjwt/compare/1.6.0...1.6.1>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Audience parameter throws ``InvalidAudienceError`` when application
   does not specify an audience, but the token does.
   `#336 <https://github.com/jpadilla/pyjwt/pull/336>`__

`v1.6.0 <https://github.com/jpadilla/pyjwt/compare/1.5.3...1.6.0>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  Dropped support for python 2.6 and 3.3
   `#301 <https://github.com/jpadilla/pyjwt/pull/301>`__
-  An invalid signature now raises an ``InvalidSignatureError`` instead
   of ``DecodeError``
   `#316 <https://github.com/jpadilla/pyjwt/pull/316>`__

Fixed
~~~~~

-  Fix over-eager fallback to stdin
   `#304 <https://github.com/jpadilla/pyjwt/pull/304>`__

Added
~~~~~

-  Audience parameter now supports iterables
   `#306 <https://github.com/jpadilla/pyjwt/pull/306>`__

`v1.5.3 <https://github.com/jpadilla/pyjwt/compare/1.5.2...1.5.3>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  Increase required version of the cryptography package to >=1.4.0.

Fixed
~~~~~

-  Remove uses of deprecated functions from the cryptography package.
-  Warn about missing ``algorithms`` param to ``decode()`` only when
   ``verify`` param is ``True``
   `#281 <https://github.com/jpadilla/pyjwt/pull/281>`__

`v1.5.2 <https://github.com/jpadilla/pyjwt/compare/1.5.1...1.5.2>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Ensure correct arguments order in decode super call
   `7c1e61d <https://github.com/jpadilla/pyjwt/commit/7c1e61dde27bafe16e7d1bb6e35199e778962742>`__

`v1.5.1 <https://github.com/jpadilla/pyjwt/compare/1.5.0...1.5.1>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  Change optparse for argparse.
   `#238 <https://github.com/jpadilla/pyjwt/pull/238>`__

Fixed
~~~~~

-  Guard against PKCS1 PEM encoded public keys
   `#277 <https://github.com/jpadilla/pyjwt/pull/277>`__
-  Add deprecation warning when decoding without specifying
   ``algorithms`` `#277 <https://github.com/jpadilla/pyjwt/pull/277>`__
-  Improve deprecation messages
   `#270 <https://github.com/jpadilla/pyjwt/pull/270>`__
-  PyJWT.decode: move verify param into options
   `#271 <https://github.com/jpadilla/pyjwt/pull/271>`__

Added
~~~~~

-  Support for Python 3.6
   `#262 <https://github.com/jpadilla/pyjwt/pull/262>`__
-  Expose jwt.InvalidAlgorithmError
   `#264 <https://github.com/jpadilla/pyjwt/pull/264>`__

`v1.5.0 <https://github.com/jpadilla/pyjwt/compare/1.4.2...1.5.0>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  Add support for ECDSA public keys in RFC 4253 (OpenSSH) format
   `#244 <https://github.com/jpadilla/pyjwt/pull/244>`__
-  Renamed commandline script ``jwt`` to ``jwt-cli`` to avoid issues
   with the script clobbering the ``jwt`` module in some circumstances.
   `#187 <https://github.com/jpadilla/pyjwt/pull/187>`__
-  Better error messages when using an algorithm that requires the
   cryptography package, but it isn't available
   `#230 <https://github.com/jpadilla/pyjwt/pull/230>`__
-  Tokens with future 'iat' values are no longer rejected
   `#190 <https://github.com/jpadilla/pyjwt/pull/190>`__
-  Non-numeric 'iat' values now raise InvalidIssuedAtError instead of
   DecodeError
-  Remove rejection of future 'iat' claims
   `#252 <https://github.com/jpadilla/pyjwt/pull/252>`__

Fixed
~~~~~

-  Add back 'ES512' for backward compatibility (for now)
   `#225 <https://github.com/jpadilla/pyjwt/pull/225>`__
-  Fix incorrectly named ECDSA algorithm
   `#219 <https://github.com/jpadilla/pyjwt/pull/219>`__
-  Fix rpm build `#196 <https://github.com/jpadilla/pyjwt/pull/196>`__

Added
~~~~~

-  Add JWK support for HMAC and RSA keys
   `#202 <https://github.com/jpadilla/pyjwt/pull/202>`__

`v1.4.2 <https://github.com/jpadilla/pyjwt/compare/1.4.1...1.4.2>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  A PEM-formatted key encoded as bytes could cause a ``TypeError`` to
   be raised `#213 <https://github.com/jpadilla/pyjwt/pull/214>`__

`v1.4.1 <https://github.com/jpadilla/pyjwt/compare/1.4.0...1.4.1>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Newer versions of Pytest could not detect warnings properly
   `#182 <https://github.com/jpadilla/pyjwt/pull/182>`__
-  Non-string 'kid' value now raises ``InvalidTokenError``
   `#174 <https://github.com/jpadilla/pyjwt/pull/174>`__
-  ``jwt.decode(None)`` now gracefully fails with ``InvalidTokenError``
   `#183 <https://github.com/jpadilla/pyjwt/pull/183>`__

`v1.4 <https://github.com/jpadilla/pyjwt/compare/1.3.0...1.4.0>`__
------------------------------------------------------------------

Fixed
~~~~~

-  Exclude Python cache files from PyPI releases.

Added
~~~~~

-  Added new options to require certain claims (require\_nbf,
   require\_iat, require\_exp) and raise ``MissingRequiredClaimError``
   if they are not present.
-  If ``audience=`` or ``issuer=`` is specified but the claim is not
   present, ``MissingRequiredClaimError`` is now raised instead of
   ``InvalidAudienceError`` and ``InvalidIssuerError``

`v1.3 <https://github.com/jpadilla/pyjwt/compare/1.2.0...1.3.0>`__
------------------------------------------------------------------

Fixed
~~~~~

-  ECDSA (ES256, ES384, ES512) signatures are now being properly
   serialized `#158 <https://github.com/jpadilla/pyjwt/pull/158>`__
-  RSA-PSS (PS256, PS384, PS512) signatures now use the proper salt
   length for PSS padding.
   `#163 <https://github.com/jpadilla/pyjwt/pull/163>`__

Added
~~~~~

-  Added a new ``jwt.get_unverified_header()`` to parse and return the
   header portion of a token prior to signature verification.

Removed
~~~~~~~

-  Python 3.2 is no longer a supported platform. This version of Python
   is rarely used. Users affected by this should upgrade to 3.3+.

`v1.2.0 <https://github.com/jpadilla/pyjwt/compare/1.1.0...1.2.0>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Added back ``verify_expiration=`` argument to ``jwt.decode()`` that
   was erroneously removed in
   `v1.1.0 <https://github.com/jpadilla/pyjwt/compare/1.0.1...1.1.0>`__.

Changed
~~~~~~~

-  Refactored JWS-specific logic out of PyJWT and into PyJWS superclass.
   `#141 <https://github.com/jpadilla/pyjwt/pull/141>`__

Deprecated
~~~~~~~~~~

-  ``verify_expiration=`` argument to ``jwt.decode()`` is now deprecated
   and will be removed in a future version. Use the ``option=`` argument
   instead.

`v1.1.0 <https://github.com/jpadilla/pyjwt/compare/1.0.1...1.1.0>`__
--------------------------------------------------------------------

Added
~~~~~

-  Added support for PS256, PS384, and PS512 algorithms.
   `#132 <https://github.com/jpadilla/pyjwt/pull/132>`__
-  Added flexible and complete verification options during decode.
   `#131 <https://github.com/jpadilla/pyjwt/pull/131>`__
-  Added this CHANGELOG.md file.

Deprecated
~~~~~~~~~~

-  Deprecated usage of the .decode(..., verify=False) parameter.

Fixed
~~~~~

-  Fixed command line encoding.
   `#128 <https://github.com/jpadilla/pyjwt/pull/128>`__

`v1.0.1 <https://github.com/jpadilla/pyjwt/compare/1.0.0...1.0.1>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Include jwt/contrib' and jwt/contrib/algorithms\` in setup.py so that
   they will actually be included when installing.
   `882524d <https://github.com/jpadilla/pyjwt/commit/882524d>`__
-  Fix bin/jwt after removing jwt.header().
   `bd57b02 <https://github.com/jpadilla/pyjwt/commit/bd57b02>`__

`v1.0.0 <https://github.com/jpadilla/pyjwt/compare/0.4.3...1.0.0>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  Moved ``jwt.api.header`` out of the public API.
   `#85 <https://github.com/jpadilla/pyjwt/pull/85>`__
-  Added README details how to extract public / private keys from an
   x509 certificate.
   `#100 <https://github.com/jpadilla/pyjwt/pull/100>`__
-  Refactor api.py functions into an object (``PyJWT``).
   `#101 <https://github.com/jpadilla/pyjwt/pull/101>`__
-  Added support for PyCrypto and ecdsa when cryptography isn't
   available. `#101 <https://github.com/jpadilla/pyjwt/pull/103>`__

Fixed
~~~~~

-  Fixed a security vulnerability where ``alg=None`` header could bypass
   signature verification.
   `#109 <https://github.com/jpadilla/pyjwt/pull/109>`__
-  Fixed a security vulnerability by adding support for a whitelist of
   allowed ``alg`` values ``jwt.decode(algorithms=[])``.
   `#110 <https://github.com/jpadilla/pyjwt/pull/110>`__
PK�(�\U��88doc/alt-python37-pyjwt/LICENSEnu�[���The MIT License (MIT)

Copyright (c) 2015 José Padilla

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.
PK�(�\��^� 	 	!doc/alt-python37-pyjwt/README.rstnu�[���PyJWT
=====

.. image:: https://github.com/jpadilla/pyjwt/workflows/CI/badge.svg
   :target: https://github.com/jpadilla/pyjwt/actions?query=workflow%3ACI

.. image:: https://img.shields.io/pypi/v/pyjwt.svg
   :target: https://pypi.python.org/pypi/pyjwt

.. image:: https://codecov.io/gh/jpadilla/pyjwt/branch/master/graph/badge.svg
   :target: https://codecov.io/gh/jpadilla/pyjwt

.. image:: https://readthedocs.org/projects/pyjwt/badge/?version=stable
   :target: https://pyjwt.readthedocs.io/en/stable/

A Python implementation of `RFC 7519 <https://tools.ietf.org/html/rfc7519>`_. Original implementation was written by `@progrium <https://github.com/progrium>`_.

Sponsor
-------

+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| |auth0-logo| | If you want to quickly add secure token-based authentication to Python projects, feel free to check Auth0's Python SDK and free plan at `auth0.com/developers <https://auth0.com/developers?utm_source=GHsponsor&utm_medium=GHsponsor&utm_campaign=pyjwt&utm_content=auth>`_. |
+--------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

.. |auth0-logo| image:: https://user-images.githubusercontent.com/83319/31722733-de95bbde-b3ea-11e7-96bf-4f4e8f915588.png

Installing
----------

Install with **pip**:

.. code-block:: console

    $ pip install PyJWT


Usage
-----

.. code-block:: pycon

    >>> import jwt
    >>> encoded = jwt.encode({"some": "payload"}, "secret", algorithm="HS256")
    >>> print(encoded)
    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzb21lIjoicGF5bG9hZCJ9.Joh1R2dYzkRvDkqv3sygm5YyK8Gi4ShZqbhK2gxcs2U
    >>> jwt.decode(encoded, "secret", algorithms=["HS256"])
    {'some': 'payload'}

Documentation
-------------

View the full docs online at https://pyjwt.readthedocs.io/en/stable/


Tests
-----

You can run tests from the project root after cloning with:

.. code-block:: console

    $ tox
PK�(�\�_�cyy doc/alt-python37-pysocks/LICENSEnu�[���Copyright 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.
PK�(�\�S�:0:0"doc/alt-python37-pysocks/README.mdnu�[���PySocks
=======

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
PK�(�\�>��1�1doc/alt-python37/LICENSEnu�[���A. 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, 2021, 2022, 2023 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.
PK�(�\"z���&�&doc/alt-python37/README.rstnu�[���This is Python version 3.7.17
=============================

.. image:: https://travis-ci.org/python/cpython.svg?branch=3.7
   :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.7
   :alt: CPython build status on Azure Pipelines
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=3.7

.. image:: https://codecov.io/gh/python/cpython/branch/3.7/graph/badge.svg
   :alt: CPython code coverage on Codecov
   :target: https://codecov.io/gh/python/cpython/branch/3.7

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.7/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/3.7/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
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.7 <https://docs.python.org/3.7/whatsnew/3.7.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/blob/3.7/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/3.7>`_.

If you want to install multiple versions of Python see the section below
entitled "Installing multiple versions".


Documentation
-------------

`Documentation for Python 3.7 <https://docs.python.org/3.7/>`_ 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.7/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.7 with 3.7 being the
primary version, you would execute ``make install`` in your 3.7 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:`537` for Python 3.7 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.
PK�(�\k�d�@g@g doc/alt-python37-chardet/LICENSEnu�[���		  GNU LESSER GENERAL PUBLIC LICENSE
		       Version 2.1, February 1999

 Copyright (C) 1991, 1999 Free Software Foundation, Inc.
     51 Franklin St, 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 St, 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!


PK�(�\H�Z||#doc/alt-python37-chardet/README.rstnu�[���Chardet: The Universal Character Encoding Detector
--------------------------------------------------

.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg
   :alt: Build status
   :target: https://travis-ci.org/chardet/chardet

.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg
   :target: https://coveralls.io/r/chardet/chardet

.. image:: https://img.shields.io/pypi/v/chardet.svg
   :target: https://warehouse.python.org/project/chardet/
   :alt: Latest version on PyPI

.. image:: https://img.shields.io/pypi/l/chardet.svg
   :alt: License


Detects
 - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)
 - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese)
 - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese)
 - EUC-KR, ISO-2022-KR (Korean)
 - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)
 - ISO-8859-5, windows-1251 (Bulgarian)
 - ISO-8859-1, windows-1252 (Western European languages)
 - ISO-8859-7, windows-1253 (Greek)
 - ISO-8859-8, windows-1255 (Visual and Logical Hebrew)
 - TIS-620 (Thai)

.. note::
   Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily
   disabled until we can retrain the models.

Requires Python 2.6, 2.7, or 3.3+.

Installation
------------

Install from `PyPI <https://pypi.python.org/pypi/chardet>`_::

    pip install chardet

Documentation
-------------

For users, docs are now available at https://chardet.readthedocs.io/.

Command-line Tool
-----------------

chardet comes with a command-line script which reports on the encodings of one
or more files::

    % chardetect somefile someotherfile
    somefile: windows-1252 with confidence 0.5
    someotherfile: ascii with confidence 1.0

About
-----

This is a continuation of Mark Pilgrim's excellent chardet. Previously, two
versions needed to be maintained: one that supported python 2.x and one that
supported python 3.x.  We've recently merged with `Ian Cordasco <https://github.com/sigmavirus24>`_'s
`charade <https://github.com/sigmavirus24/charade>`_ fork, so now we have one
coherent version that works for Python 2.6+.

:maintainer: Dan Blanchard
PK�(�\�M�!!#doc/alt-python37-jsonschema/COPYINGnu�[���Copyright (c) 2013 Julian Berman

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.
PK�(�\�8AH&doc/alt-python37-jsonschema/README.rstnu�[���==========
jsonschema
==========

|PyPI| |Pythons| |Travis| |AppVeyor| |Codecov| |ReadTheDocs|

.. |PyPI| image:: https://img.shields.io/pypi/v/jsonschema.svg
   :alt: PyPI version
   :target: https://pypi.org/project/jsonschema/

.. |Pythons| image:: https://img.shields.io/pypi/pyversions/jsonschema.svg
   :alt: Supported Python versions
   :target: https://pypi.org/project/jsonschema/

.. |Travis| image:: https://travis-ci.com/Julian/jsonschema.svg?branch=master
   :alt: Travis build status
   :target: https://travis-ci.com/Julian/jsonschema

.. |AppVeyor| image:: https://ci.appveyor.com/api/projects/status/adtt0aiaihy6muyn/branch/master?svg=true
   :alt: AppVeyor build status
   :target: https://ci.appveyor.com/project/Julian/jsonschema

.. |Codecov| image:: https://codecov.io/gh/Julian/jsonschema/branch/master/graph/badge.svg
   :alt: Codecov Code coverage
   :target: https://codecov.io/gh/Julian/jsonschema

.. |ReadTheDocs| image:: https://readthedocs.org/projects/python-jsonschema/badge/?version=stable&style=flat
   :alt: ReadTheDocs status
   :target: https://python-jsonschema.readthedocs.io/en/stable/


``jsonschema`` is an implementation of `JSON Schema <https://json-schema.org>`_
for Python (supporting 2.7+ including Python 3).

.. code-block:: python

    >>> from jsonschema import validate

    >>> # A sample schema, like what we'd get from json.load()
    >>> schema = {
    ...     "type" : "object",
    ...     "properties" : {
    ...         "price" : {"type" : "number"},
    ...         "name" : {"type" : "string"},
    ...     },
    ... }

    >>> # If no exception is raised by validate(), the instance is valid.
    >>> validate(instance={"name" : "Eggs", "price" : 34.99}, schema=schema)

    >>> validate(
    ...     instance={"name" : "Eggs", "price" : "Invalid"}, schema=schema,
    ... )                                   # doctest: +IGNORE_EXCEPTION_DETAIL
    Traceback (most recent call last):
        ...
    ValidationError: 'Invalid' is not of type 'number'

It can also be used from console:

.. code-block:: bash

    $ jsonschema -i sample.json sample.schema

Features
--------

* Full support for
  `Draft 7 <https://python-jsonschema.readthedocs.io/en/latest/validate/#jsonschema.Draft7Validator>`_,
  `Draft 6 <https://python-jsonschema.readthedocs.io/en/latest/validate/#jsonschema.Draft6Validator>`_,
  `Draft 4 <https://python-jsonschema.readthedocs.io/en/latest/validate/#jsonschema.Draft4Validator>`_
  and
  `Draft 3 <https://python-jsonschema.readthedocs.io/en/latest/validate/#jsonschema.Draft3Validator>`_

* `Lazy validation <https://python-jsonschema.readthedocs.io/en/latest/validate/#jsonschema.IValidator.iter_errors>`_
  that can iteratively report *all* validation errors.

* `Programmatic querying <https://python-jsonschema.readthedocs.io/en/latest/errors/>`_
  of which properties or items failed validation.


Installation
------------

``jsonschema`` is available on `PyPI <https://pypi.org/project/jsonschema/>`_. You can install using `pip <https://pip.pypa.io/en/stable/>`_:

.. code-block:: bash

    $ pip install jsonschema


Demo
----

Try ``jsonschema`` interactively in this online demo:

.. image:: https://user-images.githubusercontent.com/1155573/56745335-8b158a00-6750-11e9-8776-83fa675939c4.png
    :target: https://notebooks.ai/demo/gh/Julian/jsonschema
    :alt: Open Live Demo


Online demo Notebook will look similar to this:


.. image:: https://user-images.githubusercontent.com/1155573/56820861-5c1c1880-6823-11e9-802a-ce01c5ec574f.gif
    :alt: Open Live Demo
    :width: 480 px


Release Notes
-------------

v3.1 brings support for ECMA 262 dialect regular expressions
throughout schemas, as recommended by the specification. Big
thanks to @Zac-HD for authoring support in a new `js-regex
<https://pypi.org/project/js-regex/>`_ library.


Running the Test Suite
----------------------

If you have ``tox`` installed (perhaps via ``pip install tox`` or your
package manager), running ``tox`` in the directory of your source
checkout will run ``jsonschema``'s test suite on all of the versions
of Python ``jsonschema`` supports. If you don't have all of the
versions that ``jsonschema`` is tested under, you'll likely want to run
using ``tox``'s ``--skip-missing-interpreters`` option.

Of course you're also free to just run the tests on a single version with your
favorite test runner. The tests live in the ``jsonschema.tests`` package.


Benchmarks
----------

``jsonschema``'s benchmarks make use of `pyperf
<https://pyperf.readthedocs.io>`_.

Running them can be done via ``tox -e perf``, or by invoking the ``pyperf``
commands externally (after ensuring that both it and ``jsonschema`` itself are
installed)::

    $ python -m pyperf jsonschema/benchmarks/test_suite.py --hist --output results.json

To compare to a previous run, use::

    $ python -m pyperf compare_to --table reference.json results.json

See the ``pyperf`` documentation for more details.


Community
---------

There's a `mailing list <https://groups.google.com/forum/#!forum/jsonschema>`_
for this implementation on Google Groups.

Please join, and feel free to send questions there.


Contributing
------------

I'm Julian Berman.

``jsonschema`` is on `GitHub <https://github.com/Julian/jsonschema>`_.

Get in touch, via GitHub or otherwise, if you've got something to contribute,
it'd be most welcome!

You can also generally find me on Freenode (nick: ``tos9``) in various
channels, including ``#python``.

If you feel overwhelmingly grateful, you can also woo me with beer money
via Google Pay with the email in my GitHub profile.

And for companies who appreciate ``jsonschema`` and its continued support
and growth, ``jsonschema`` is also now supportable via `TideLift
<https://tidelift.com/subscription/pkg/pypi-jsonschema?utm_source=pypi-j
sonschema&utm_medium=referral&utm_campaign=readme>`_.
PK�(�\O�	�1�1*doc/alt-python37-typing-extensions/LICENSEnu�[���A. 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 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.
PK�(�\
>A?#
#
-doc/alt-python37-typing-extensions/README.rstnu�[���=================
Typing Extensions
=================

.. image:: https://badges.gitter.im/python/typing.svg
 :alt: Chat at https://gitter.im/python/typing
 :target: https://gitter.im/python/typing?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge

Overview
========

The ``typing`` module was added to the standard library in Python 3.5 on
a provisional basis and will no longer be provisional in Python 3.7. However,
this means users of Python 3.5 - 3.6 who are unable to upgrade will not be
able to take advantage of new types added to the ``typing`` module, such as
``typing.Text`` or ``typing.Coroutine``.

The ``typing_extensions`` module contains both backports of these changes
as well as experimental types that will eventually be added to the ``typing``
module, such as ``Protocol`` (see PEP 544 for details about protocols and
static duck typing) or ``TypedDict`` (see PEP 589).

Users of other Python versions should continue to install and use
use the ``typing`` module from PyPi instead of using this one unless
specifically writing code that must be compatible with multiple Python
versions or requires experimental types.

Included items
==============

This module currently contains the following:

All Python versions:
--------------------

- ``ClassVar``
- ``ContextManager``
- ``Counter``
- ``DefaultDict``
- ``Deque``
- ``final``
- ``Final``
- ``Literal``
- ``NewType``
- ``NoReturn``
- ``overload`` (note that older versions of ``typing`` only let you use ``overload`` in stubs)
- ``Protocol`` (except on Python 3.5.0)
- ``runtime`` (except on Python 3.5.0)
- ``Text``
- ``Type``
- ``TypedDict``
- ``TYPE_CHECKING``

Python 3.4+ only:
-----------------

- ``ChainMap``

Python 3.5+ only:
-----------------

- ``AsyncIterable``
- ``AsyncIterator``
- ``AsyncContextManager``
- ``Awaitable``
- ``Coroutine``

Python 3.6+ only:
-----------------

- ``AsyncGenerator``

Other Notes and Limitations
===========================

There are a few types whose interface was modified between different
versions of typing. For example, ``typing.Sequence`` was modified to
subclass ``typing.Reversible`` as of Python 3.5.3.

These changes are _not_ backported to prevent subtle compatibility
issues when mixing the differing implementations of modified classes.

Running tests
=============

To run tests, navigate into the appropriate source directory and run
``test_typing_extensions.py``. You will also need to install the latest
version of ``typing`` if you are using a version of Python that does not
include ``typing`` as a part of the standard library.

PK�(�\J`\T*T*doc/alt-python37-psutil/CREDITSnu�[���Intro
-------------------------------------------------------------------------------

I would like to recognize some of the people who have been instrumental in the
development of psutil. I'm sure I'm forgetting somebody (feel free to email me)
but here is a short list. It's modeled after the Linux CREDITS file where the
fields are: name (N), e-mail (E), website (W), country (C), description (D),
(I) issues. Issue tracker is at:
https://github.com/giampaolo/psutil/issues.
A big thanks to all of you.

- Giampaolo

Author
-------------------------------------------------------------------------------

N: Giampaolo Rodola
C: Italy
E: g.rodola@gmail.com
W: https://gmpy.dev

Experts
-------------------------------------------------------------------------------

Github usernames of people to CC on github when in need of help.

- NetBSD:
    - 0-wiz-0, Thomas Klausner
    - ryoqun, Ryo Onodera
- OpenBSD:
    - landryb, Landry Breuil
- FreeBSD:
    - glebius, Gleb Smirnoff (#1013)
    - sunpoet, Po-Chuan Hsieh (pkg maintainer, #1105)
    - kostikbel, Konstantin Belousov (#1105)
- macOS:
    - whitlockjc, Jeremy Whitlock
- Windows:
    - mrjefftang, Jeff Tang
    - wj32, Wen Jia Liu
    - fbenkstein, Frank Benkstein
- SunOS:
    - wiggin15, Arnon Yaari
    - alxchk, Oleksii Shevchuk
- AIX:
    - wiggin15, Arnon Yaari (maintainer)

Top contributors
-------------------------------------------------------------------------------

N: Jay Loden
C: NJ, USA
E: jloden@gmail.com
D: original co-author, initial design/bootstrap and occasional bug fixes
W: http://www.jayloden.com

N: Arnon Yaari (wiggin15)
W: https://github.com/wiggin15
D: AIX implementation, expert on multiple fronts
I: 517, 607, 610, 1131, 1123, 1130, 1154, 1164, 1174, 1177, 1210, 1214, 1408,
   1329, 1276, 1494, 1528.

N: Alex Manuskin
W: https://github.com/amanusk
D: FreeBSD cpu_freq(), OSX temperatures, support for Linux temperatures.
I: 1284, 1345, 1350, 1352, 1472, 1481, 1487.

N: Jeff Tang
W: https://github.com/mrjefftang
I: 340, 529, 616, 653, 654, 648, 641

N: Jeremy Whitlock
D: great help with macOS C development.
I: 125, 150, 174, 206

N: Landry Breuil
W: https://github.com/landryb
D: OpenBSD implementation.
I: 615

N: Justin Venus
D: Solaris support
I: 18

N: Thomas Klausner
W: https://github.com/0-wiz-0
D: NetBSD implementation (co-author).
I: 557

N: Ryo Onodera
W: https://github.com/ryoon
D: NetBSD implementation (co-author).
I: 557

Donations
-------------------------------------------------------------------------------

N: Rodion Stratov
C: Canada

N: Remi Chateauneu
C: London, UK

N: Olivier Grisel
C: Paris, France

N: Praveen Bhamidipati
C: Bellevue, USA

N: Willem de Groot
C: Netherlands

N: Sigmund Vik

N: Kahntent
C: NYC, USA

N: Gyula Áfra
C: Budapest, Hungary

N: Mahmut Dumlupinar

N: Thomas Guettler
C: Germany

N: Karthik Kumar
C: India

N: Oche Ejembi
C: UK

N: Russell Robinson
C: New Zealand

N: Wompasoft
C: Texas, USA

N: Amit Kulkarni
C: Santa Clara, USA

N: Alexander Kaftan
C: Augsburg Germany

N: Andrew Bays
C: Maynard, USA

N: Carver Koella
C: Pittsburgh, USA

N: Kristjan Võrk
C: Tallin, Estonia

N: HTB Industries
C: Willow Springs, USA

N: Brett Harris
C: Melbourne, Australia

N: Peter Friedland
C: CT, USA

N: Matthew Callow
C: Australia

N: Marco Schrank
C: Germany

N: Mindview LLC
C: USA

N: Григорьев Андрей
C: Russia

N: Heijdemann Morgan
C: Singapore

N: Florian Bruhin
C: Winterthur, Switzerland

N: Heijdemann Morgan
C: Singapore

N: Morgan Heijdemann
C: Singapore

Contributors
-------------------------------------------------------------------------------

N: wj32
D: process username() and get_connections() on Windows
I: 114, 115

N: Yan Raber
C: Bologna, Italy
D: help on Windows development (initial version of Process.username())

N: Dave Daeschler
C: USA
W: http://daviddaeschler.com
D: some contributions to initial design/bootstrap plus occasional bug fixing
I: 522, 536

N: cjgohlke
D: Windows 64 bit support
I: 107

N: Frank Benkstein
D: process environ()
W: https://github.com/fbenkstein
I: 732, 733

N: Mozilla Foundation
D: sample code for process USS memory.

N: EccoTheFlintstone
W: https://github.com/EccoTheFlintstone
I: 1368, 1348

----

N: Jeffery Kline
I: 130

N: Grabriel Monnerat
I: 146

N: Philip Roberts
I: 168

N: jcscoobyrs
I: 125

N: Sandro Tosi
I: 200, 201

N: Andrew Colin
I: 248

N: Amoser
I: 266, 267, 340

N: Matthew Grant
I: 271

N: oweidner
I: 275

N: Tarek Ziade
I: 281

N: Luca Cipriani
C: Turin, Italy
I: 278

N: Maciej Lach,
I: 294

N: James Pye
I: 305, 306

N: Stanchev Emil
I: 314

N: Kim Gräsman
D: ...also kindly donated some money.
I: 316

N: Riccardo Murri
C: Italy
I: 318

N: Florent Xicluna
I: 319

N: Michal Spondr
I: 313

N: Jean Sebastien
I: 344

N: Rob Smith
W: http://www.kormoc.com/
I: 341

N: Youngsik Kim
W: https://plus.google.com/101320747613749824490/
I: 317

N: Gregory Szorc
W: https://plus.google.com/116873264322260110710/posts
I: 323

N: André Oriani
I: 361

N: clackwell
I: 356

N: m.malycha
I: 351

N: John Baldwin
I: 370

N: Jan Beich
I: 325

N: floppymaster
I: 380

N: Arfrever.FTA
I: 369, 404

N: danudey
I: 386

N: Adrien Fallou
I: 224

N: Gisle Vanem
I: 411

N: thepyr0
I: 414

N: John Pankov
I: 435

N: Matt Good
W: http://matt-good.net/
I: 438

N: Ulrich Klank
I: 448

N: Josiah Carlson
I: 451, 452

N: Raymond Hettinger
D: namedtuple and lru_cache backward compatible implementations.

N: Jason Kirtland
D: backward compatible implementation of collections.defaultdict.

M: Ken Seeho
D: @cached_property decorator

N: crusaderky
I: 470, 477

I: 471

N: Gautam Singh
I: 466

I: 476, 479

N: Francois Charron
I: 474

N: Naveed Roudsari
I: 421

N: Alexander Grothe
I: 497

N: Szigeti Gabor Niif
I: 446

N: msabramo
I: 492

N: Yaolong Huang
W: http://airekans.github.io/
I: 530

N: Anders Chrigström
W: https://github.com/anders-chrigstrom
I: 496

N: spacewander
W: https://github.com/spacewander
I: 561, 603

N: Sylvain Mouquet
I: 565

N: karthikrev
I: 568

N: Bruno Binet
I: 572

N: Gabi Davar
C: Israel
W: https://github.com/mindw
I: 578, 581, 587

N: spacewanderlzx
C: Guangzhou,China
I: 555

N: Fabian Groffen
I: 611, 618

N: desbma
W: https://github.com/desbma
C: France
I: 628

N: John Burnett
W: http://www.johnburnett.com/
C: Irvine, CA, US
I: 614

N: Árni Már Jónsson
I: 634

N: Bart van Kleef
W: https://github.com/bkleef
I: 664

N: Steven Winfield
W: https://github.com/stevenwinfield
I: 672

N: sk6249
W: https://github.com/sk6249
I: 670

N: maozguttman
W: https://github.com/maozguttman
I: 659

N: dasumin
W: https://github.com/dasumin
I: 541

N: Mike Sarahan
W: https://github.com/msarahan
I: 688

N: Syohei YOSHIDA
W: https://github.com/syohex
I: 730

N: Visa Hankala
I: 741

N: Sebastian-Gabriel Brestin
C: Romania
I: 704

N: Timmy Konick
W: https://github.com/tijko
I: 751

N: mpderbec
W: https://github.com/mpderbec
I: 660

N: wxwright
W: https://github.com/wxwright
I: 776

N: Farhan Khan
I: 823

N: Jake Omann
W: https://github.com/jomann09
I: 816, 775, 1874

N: Jeremy Humble
W: https://github.com/jhumble
I: 863

N: Ilya Georgievsky
W: https://github.com/xBeAsTx
I: 870

N: Yago Jesus
W: https://github.com/YJesus
I: 798

N: Andre Caron
C: Montreal, QC, Canada
W: https://github.com/AndreLouisCaron
I: 880

N: ewedlund
W: https://github.com/ewedlund
I: 874

N: Arcadiy Ivanov
W: https://github.com/arcivanov
I: 919

N: Max Bélanger
W: https://github.com/maxbelanger
I: 936, 1133

N: Pierre Fersing
C: France
I: 950

N: Thiago Borges Abdnur
W: https://github.com/bolaum
I: 959

N: Nicolas Hennion
W: https://github.com/nicolargo
I: 974

N: Baruch Siach
W: https://github.com/baruchsiach
I: 872

N: Danek Duvall
W: https://github.com/dhduvall
I: 1002

N: Alexander Hasselhuhn
C: Germany
W: https://github.com/alexanha

N: Himanshu Shekhar
W: https://github.com/himanshub16
I: 1036

N: Yannick Gingras
W: https://github.com/ygingras
I: 1057

N: Gleb Smirnoff
W: https://github.com/glebius
D: good help with FreeBSD
I: 1042, 1079, 1070

N: Oleksii Shevchuk
W: https://github.com/alxchk
I: 1077, 1093, 1091, 1220, 1346

N: Prodesire
W: https://github.com/Prodesire
I: 1138

N: Sebastian Saip
W: https://github.com/ssaip
I: 1141

N: Jakub Bacic
W: https://github.com/jakub-bacic
I: 1127

N: Akos Kiss
W: https://github.com/akosthekiss
I: 1150

N: Adrian Page
W: https://github.com/adpag
I: 1159, 1160, 1161

N: Matthew Long
W: https://github.com/matray
I: 1167

N: janderbrain
W: https://github.com/janderbrain
I: 1169

N: Dan Vinakovsky
W: https://github.com/hexaclock
I: 1216

N: stswandering
W: https://github.com/stswandering
I: 1243

N: Georg Sauthoff
W: https://github.com/gsauthof
I: 1193, 1194

N: Maxime Mouial
W: https://github.com/hush-hush
I: 1239

N: Denis Krienbühl
W: https://github.com/href
I: 1260

N: Jean-Luc Migot
W: https://github.com/jmigot-tehtris
I: 1258, 1289

N: Nikhil Marathe
W: https://github.com/nikhilm
I: 1278

N: Sylvain Duchesne
W: https://github.com/sylvainduchesne
I: 1294

N: Lawrence Ye
W: https://github.com/LEAFERx
I: 1321

N: Ilya Yanok
W: https://github.com/yanok
I: 1332

N: Jaime Fullaondo
W: https://github.com/truthbk
D: AIX support
I: 1320

N: Koen Kooi
W: https://github.com/koenkooi
I: 1360

N: Ghislain Le Meur
W: https://github.com/gigi206
D: idea for Process.parents()
I: 1379

N: Benjamin Drung
D: make tests invariant to LANG setting
W: https://github.com/bdrung
I: 1462

N: Xiaoling Bao
I: 1223

N: Cedric Lamoriniere
W: https://github.com/clamoriniere
I: 1470

N: Daniel Beer
W: https://github.com/dbeer1
I: 1471

N: Samer Masterson
W: https://github.com/samertm
I: 1480

N: Ammar Askar
W: http://ammaraskar.com/
I: 604, 1484, 1781

N: agnewee
W: https://github.com/Agnewee
C: China
I: 1491

N: Kamil Rytarowski
W: https://github.com/krytarowski
C: Poland
I: 1526, 1530

N: Athos Ribeiro
W: https://github.com/athos-ribeiro
I: 1585

N: Erwan Le Pape
W: https://github.com/erwan-le-pape
I: 1570

N: Étienne Servais
W: https://github.com/vser1
I: 1607, 1637

N: Bernát Gábor
W: https://github.com/gaborbernat
I: 1565

N: Nathan Houghton
W: https://github.com/n1000
I: 1619

N: Riccardo Schirone
W: https://github.com/ret2libc
C: Milano, Italy
I: 1616

N: Po-Chuan Hsieh
W: https://github.com/sunpoet
C: Taiwan
I: 1646

N: Javad Karabi
W: https://github.com/karabijavad
I: 1648

N: Mike Hommey
W: https://github.com/glandium
I: 1665

N: Anselm Kruis
W: https://github.com/akruis
I: 1695

N: Michał Górny
W: https://github.com/mgorny
I: 1726

N: Julien Lebot
W: https://github.com/julien-lebot
I: 1768

N: Armin Gruner
W: https://github.com/ArminGruner
I: 1800

N: Chris Burger
W: https://github.com/phobozad
I: 1830

N: aristocratos
W: https://github.com/aristocratos
I: 1837, 1838

N: Vincent A. Arcila
W: https://github.com/jandrovins
I: 1620, 1727

N: Tim Schlueter
W: https://github.com/modelrockettier
I: 1822
PK�(�\��<

doc/alt-python37-psutil/LICENSEnu�[���BSD 3-Clause License

Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola'
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 psutil 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.
PK�(�\1�zi]�]�#doc/alt-python37-psutil/HISTORY.rstnu�[���*Bug tracker at https://github.com/giampaolo/psutil/issues*

5.8.0
=====

2020-12-19

**Enhancements**

- 1863_: `disk_partitions()` exposes 2 extra fields: `maxfile` and `maxpath`,
  which are the maximum file name and path name length.
- 1872_: [Windows] added support for PyPy 2.7.
- 1879_: provide pre-compiled wheels for Linux and macOS (yey!).
- 1880_: get rid of Travis and Cirrus CI services (they are no longer free).
  CI testing is now done by GitHub Actions on Linux, macOS and FreeBSD (yes).
  AppVeyor is still being used for Windows CI.

**Bug fixes**

- 1708_: [Linux] get rid of sensors_temperatures() duplicates.  (patch by Tim
  Schlueter).
- 1839_: [Windows] always raise AccessDenied when failing to query 64 processes
  from 32 bit ones (NtWoW64 APIs).
- 1866_: [Windows] process exe(), cmdline(), environ() may raise "invalid
  access to memory location" on Python 3.9.
- 1874_: [Solaris] wrong swap output given when encrypted column is present.
- 1875_: [Windows] process username() may raise ERROR_NONE_MAPPED if the SID
  has no corresponding account name. In this case AccessDenied is now raised.
- 1877_: [Windows] OpenProcess may fail with ERROR_SUCCESS. Turn it into
  AccessDenied or NoSuchProcess depending on whether the PID is alive.
- 1886_: [macOS] EIO error may be raised on cmdline() and environment(). Now
  it gets translated into AccessDenied.
- 1891_: [macOS] get rid of deprecated getpagesize().

5.7.3
=====

2020-10-23

**Enhancements**

- 809_: [FreeBSD] add support for `Process.rlimit()`.
- 893_: [BSD] add support for `Process.environ()` (patch by Armin Gruner)
- 1830_: [UNIX] `net_if_stats()`'s `isup` also checks whether the NIC is
  running (meaning Wi-Fi or ethernet cable is connected).  (patch by Chris Burger)
- 1837_: [Linux] improved battery detection and charge "secsleft" calculation
  (patch by aristocratos)

**Bug fixes**

- 1620_: [Linux] physical cpu_count() result is incorrect on systems with more
  than one CPU socket.  (patch by Vincent A. Arcila)
- 1738_: [macOS] Process.exe() may raise FileNotFoundError if process is still
  alive but the exe file which launched it got deleted.
- 1791_: [macOS] fix missing include for getpagesize().
- 1823_: [Windows] Process.open_files() may cause a segfault due to a NULL
  pointer.
- 1838_: [Linux] sensors_battery(): if `percent` can be determined but not
  the remaining values, still return a result instead of None.
  (patch by aristocratos)

5.7.2
=====

2020-07-15

**Bug fixes**

- wheels for 2.7 were inadvertently deleted.

5.7.1
=====

2020-07-15

**Enhancements**

- 1729_: parallel tests on UNIX (make test-parallel). They're twice as fast!
- 1741_: "make build/install" is now run in parallel and it's about 15% faster
  on UNIX.
- 1747_: `Process.wait()` on POSIX returns an enum, showing the negative signal
  which was used to terminate the process::
    >>> import psutil
    >>> p = psutil.Process(9891)
    >>> p.terminate()
    >>> p.wait()
    <Negsignal.SIGTERM: -15>
- 1747_: `Process.wait()` return value is cached so that the exit code can be
  retrieved on then next call.
- 1747_: Process provides more info about the process on str() and repr()
  (status and exit code)::
    >>> proc
    psutil.Process(pid=12739, name='python3', status='terminated',
                   exitcode=<Negsigs.SIGTERM: -15>, started='15:08:20')
- 1757_: memory leak tests are now stable.
- 1768_: [Windows] added support for Windows Nano Server. (contributed by
  Julien Lebot)

**Bug fixes**

- 1726_: [Linux] cpu_freq() parsing should use spaces instead of tabs on ia64.
  (patch by Michał Górny)
- 1760_: [Linux] Process.rlimit() does not handle long long type properly.
- 1766_: [macOS] NoSuchProcess may be raised instead of ZombieProcess.
- 1781_: fix signature of callback function for getloadavg().  (patch by
  Ammar Askar)

5.7.0
=====

2020-02-18

**Enhancements**

- 1637_: [SunOS] add partial support for old SunOS 5.10 Update 0 to 3.
- 1648_: [Linux] sensors_temperatures() looks into an additional /sys/device/
  directory for additional data.  (patch by Javad Karabi)
- 1652_: [Windows] dropped support for Windows XP and Windows Server 2003.
  Minimum supported Windows version now is Windows Vista.
- 1671_: [FreeBSD] add CI testing/service for FreeBSD (Cirrus CI).
- 1677_: [Windows] process exe() will succeed for all process PIDs (instead of
  raising AccessDenied).
- 1679_: [Windows] net_connections() and Process.connections() are 10% faster.
- 1682_: [PyPy] added CI / test integration for PyPy via Travis.
- 1686_: [Windows] added support for PyPy on Windows.
- 1693_: [Windows] boot_time(), Process.create_time() and users()'s login time
  now have 1 micro second precision (before the precision was of 1 second).

**Bug fixes**

- 1538_: [NetBSD] process cwd() may return ENOENT instead of NoSuchProcess.
- 1627_: [Linux] Process.memory_maps() can raise KeyError.
- 1642_: [SunOS] querying basic info for PID 0 results in FileNotFoundError.
- 1646_: [FreeBSD] many Process methods may cause a segfault on FreeBSD 12.0
  due to a backward incompatible change in a C type introduced in 12.0.
- 1656_: [Windows] Process.memory_full_info() raises AccessDenied even for the
  current user and os.getpid().
- 1660_: [Windows] Process.open_files() complete rewrite + check of errors.
- 1662_: [Windows] process exe() may raise WinError 0.
- 1665_: [Linux] disk_io_counters() does not take into account extra fields
  added to recent kernels.  (patch by Mike Hommey)
- 1672_: use the right C type when dealing with PIDs (int or long). Thus far
  (long) was almost always assumed, which is wrong on most platforms.
- 1673_: [OpenBSD] Process connections(), num_fds() and threads() returned
  improper exception if process is gone.
- 1674_: [SunOS] disk_partitions() may raise OSError.
- 1684_: [Linux] disk_io_counters() may raise ValueError on systems not
  having /proc/diskstats.
- 1695_: [Linux] could not compile on kernels <= 2.6.13 due to
  PSUTIL_HAVE_IOPRIO not being defined.  (patch by Anselm Kruis)

5.6.7
=====

2019-11-26

**Bug fixes**

- 1630_: [Windows] can't compile source distribution due to C syntax error.

5.6.6
=====

2019-11-25

**Bug fixes**

- 1179_: [Linux] Process cmdline() now takes into account misbehaving processes
  renaming the command line and using inappropriate chars to separate args.
- 1616_: use of Py_DECREF instead of Py_CLEAR will result in double free and
  segfault
  (`CVE-2019-18874 <https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18874>`__).
  (patch by Riccardo Schirone)
- 1619_: [OpenBSD] compilation fails due to C syntax error.  (patch by Nathan
  Houghton)

5.6.5
=====

2019-11-06

**Bug fixes**

- 1615_: remove pyproject.toml as it was causing installation issues.

5.6.4
=====

2019-11-04

**Enhancements**

- 1527_: [Linux] added Process.cpu_times().iowait counter, which is the time
  spent waiting for blocking I/O to complete.
- 1565_: add PEP 517/8 build backend and requirements specification for better
  pip integration.  (patch by Bernát Gábor)

**Bug fixes**

- 875_: [Windows] Process' cmdline(), environ() or cwd() may occasionally fail
  with ERROR_PARTIAL_COPY which now gets translated to AccessDenied.
- 1126_: [Linux] cpu_affinity() segfaults on CentOS 5 / manylinux.
  cpu_affinity() support for CentOS 5 was removed.
- 1528_: [AIX] compilation error on AIX 7.2 due to 32 vs 64 bit differences.
  (patch by Arnon Yaari)
- 1535_: 'type' and 'family' fields returned by net_connections() are not
  always turned into enums.
- 1536_: [NetBSD] process cmdline() erroneously raise ZombieProcess error if
  cmdline has non encodable chars.
- 1546_: usage percent may be rounded to 0 on Python 2.
- 1552_: [Windows] getloadavg() math for calculating 5 and 15 mins values is
  incorrect.
- 1568_: [Linux] use CC compiler env var if defined.
- 1570_: [Windows] `NtWow64*` syscalls fail to raise the proper error code
- 1585_: [OSX] calling close() (in C) on possible negative integers.  (patch
  by Athos Ribeiro)
- 1606_: [SunOS] compilation fails on SunOS 5.10.  (patch by vser1)

5.6.3
=====

2019-06-11

**Enhancements**

- 1494_: [AIX] added support for Process.environ().  (patch by Arnon Yaari)

**Bug fixes**

- 1276_: [AIX] can't get whole cmdline().  (patch by Arnon Yaari)
- 1501_: [Windows] Process cmdline() and exe() raise unhandled "WinError 1168
  element not found" exceptions for "Registry" and "Memory Compression" psuedo
  processes on Windows 10.
- 1526_: [NetBSD] process cmdline() could raise MemoryError.  (patch by
  Kamil Rytarowski)

5.6.2
=====

2019-04-26

**Enhancements**

- 604_: [Windows, Windows] add new psutil.getloadavg(), returning system load
  average calculation, including on Windows (emulated).  (patch by Ammar Askar)
- 1404_: [Linux] cpu_count(logical=False) uses a second method (read from
  `/sys/devices/system/cpu/cpu[0-9]/topology/core_id`) in order to determine
  the number of physical CPUs in case /proc/cpuinfo does not provide this info.
- 1458_: provide coloured test output. Also show failures on KeyboardInterrupt.
- 1464_: various docfixes (always point to python3 doc, fix links, etc.).
- 1476_: [Windows] it is now possible to set process high I/O priority
  (ionice()).Also, I/O priority values are now exposed as 4 new constants:
  IOPRIO_VERYLOW, IOPRIO_LOW, IOPRIO_NORMAL, IOPRIO_HIGH.
- 1478_: add make command to re-run tests failed on last run.

**Bug fixes**

- 1223_: [Windows] boot_time() may return value on Windows XP.
- 1456_: [Linux] cpu_freq() returns None instead of 0.0 when min/max not
  available (patch by Alex Manuskin)
- 1462_: [Linux] (tests) make tests invariant to LANG setting (patch by
  Benjamin Drung)
- 1463_: cpu_distribution.py script was broken.
- 1470_: [Linux] disk_partitions(): fix corner case when /etc/mtab doesn't
  exist.  (patch by Cedric Lamoriniere)
- 1471_: [SunOS] Process name() and cmdline() can return SystemError.  (patch
  by Daniel Beer)
- 1472_: [Linux] cpu_freq() does not return all CPUs on Rasbperry-pi 3.
- 1474_: fix formatting of psutil.tests() which mimicks 'ps aux' output.
- 1475_: [Windows] OSError.winerror attribute wasn't properly checked resuling
  in WindowsError being raised instead of AccessDenied.
- 1477_: [Windows] wrong or absent error handling for private NTSTATUS Windows
  APIs. Different process methods were affected by this.
- 1480_: [Windows] psutil.cpu_count(logical=False) could cause a crash due to
  fixed read violation.  (patch by Samer Masterson)
- 1486_: [AIX, SunOS] AttributeError when interacting with Process methods
  involved into oneshot() context.
- 1491_: [SunOS] net_if_addrs(): free() ifap struct on error.  (patch by
  Agnewee)
- 1493_: [Linux] cpu_freq(): handle the case where
  /sys/devices/system/cpu/cpufreq/ exists but is empty.

5.6.1
=====

2019-03-11

**Bug fixes**

- 1329_: [AIX] psutil doesn't compile on AIX 6.1.  (patch by Arnon Yaari)
- 1448_: [Windows] crash on import due to rtlIpv6AddressToStringA not available
  on Wine.
- 1451_: [Windows] Process.memory_full_info() segfaults. NtQueryVirtualMemory
  is now used instead of QueryWorkingSet to calculate USS memory.

5.6.0
=====

2019-03-05

**Enhancements**

- 1379_: [Windows] Process suspend() and resume() now use NtSuspendProcess
  and NtResumeProcess instead of stopping/resuming all threads of a process.
  This is faster and more reliable (aka this is what ProcessHacker does).
- 1420_: [Windows] in case of exception disk_usage() now also shows the path
  name.
- 1422_: [Windows] Windows APIs requiring to be dynamically loaded from DLL
  libraries are now loaded only once on startup (instead of on per function
  call) significantly speeding up different functions and methods.
- 1426_: [Windows] PAGESIZE and number of processors is now calculated on
  startup.
- 1428_: in case of error, the traceback message now shows the underlying C
  function called which failed.
- 1433_: new Process.parents() method.  (idea by Ghislain Le Meur)
- 1437_: pids() are returned in sorted order.
- 1442_: python3 is now the default interpreter used by Makefile.

**Bug fixes**

- 1353_: process_iter() is now thread safe (it rarely raised TypeError).
- 1394_: [Windows] Process name() and exe() may erroneously return "Registry".
  QueryFullProcessImageNameW is now used instead of GetProcessImageFileNameW
  in order to prevent that.
- 1411_: [BSD] lack of Py_DECREF could cause segmentation fault on process
  instantiation.
- 1419_: [Windows] Process.environ() raises NotImplementedError when querying
  a 64-bit process in 32-bit-WoW mode. Now it raises AccessDenied.
- 1427_: [OSX] Process cmdline() and environ() may erroneously raise OSError
  on failed malloc().
- 1429_: [Windows] SE DEBUG was not properly set for current process. It is
  now, and it should result in less AccessDenied exceptions for low-pid
  processes.
- 1432_: [Windows] Process.memory_info_ex()'s USS memory is miscalculated
  because we're not using the actual system PAGESIZE.
- 1439_: [NetBSD] Process.connections() may return incomplete results if using
  oneshot().
- 1447_: original exception wasn't turned into NSP/AD exceptions when using
  Process.oneshot() ctx manager.

**Incompatible API changes**

- 1291_: [OSX] Process.memory_maps() was removed because inherently broken
  (segfault) for years.

5.5.1
=====

2019-02-15

**Enhancements**

- 1348_: [Windows] on Windows >= 8.1 if Process.cmdline() fails due to
  ERROR_ACCESS_DENIED attempt using NtQueryInformationProcess +
  ProcessCommandLineInformation. (patch by EccoTheFlintstone)

**Bug fixes**

- 1394_: [Windows] Process.exe() returns "[Error 0] The operation completed
  successfully" when Python process runs in "Virtual Secure Mode".
- 1402_: psutil exceptions' repr() show the internal private module path.
- 1408_: [AIX] psutil won't compile on AIX 7.1 due to missing header.  (patch
  by Arnon Yaari)

5.5.0
=====

2019-01-23

**Enhancements**

- 1350_: [FreeBSD] added support for sensors_temperatures().  (patch by Alex
  Manuskin)
- 1352_: [FreeBSD] added support for CPU frequency.  (patch by Alex Manuskin)

**Bug fixes**

- 1111_: Process.oneshot() is now thread safe.
- 1354_: [Linux] disk_io_counters() fails on Linux kernel 4.18+.
- 1357_: [Linux] Process' memory_maps() and io_counters() method are no longer
  exposed if not supported by the kernel.
- 1368_: [Windows] fix psutil.Process().ionice(...) mismatch.  (patch by
  EccoTheFlintstone)
- 1370_: [Windows] improper usage of CloseHandle() may lead to override the
  original error code when raising an exception.
- 1373_: incorrect handling of cache in Process.oneshot() context causes
  Process instances to return incorrect results.
- 1376_: [Windows] OpenProcess() now uses PROCESS_QUERY_LIMITED_INFORMATION
  access rights wherever possible, resulting in less AccessDenied exceptions
  being thrown for system processes.
- 1376_: [Windows] check if variable is NULL before free()ing it.  (patch by
  EccoTheFlintstone)

5.4.8
=====

2018-10-30

**Enhancements**

- 1197_: [Linux] cpu_freq() is now implemented by parsing /proc/cpuinfo in case
  /sys/devices/system/cpu/* filesystem is not available.
- 1310_: [Linux] psutil.sensors_temperatures() now parses /sys/class/thermal
  in case /sys/class/hwmon fs is not available (e.g. Raspberry Pi).  (patch
  by Alex Manuskin)
- 1320_: [Posix] better compilation support when using g++ instead of gcc.
  (patch by Jaime Fullaondo)

**Bug fixes**

- 715_: do not print exception on import time in case cpu_times() fails.
- 1004_: [Linux] Process.io_counters() may raise ValueError.
- 1277_: [OSX] available and used memory (psutil.virtual_memory()) metrics are
  not accurate.
- 1294_: [Windows] psutil.Process().connections() may sometimes fail with
  intermittent 0xC0000001.  (patch by Sylvain Duchesne)
- 1307_: [Linux] disk_partitions() does not honour PROCFS_PATH.
- 1320_: [AIX] system CPU times (psutil.cpu_times()) were being reported with
  ticks unit as opposed to seconds.  (patch by Jaime Fullaondo)
- 1332_: [OSX] psutil debug messages are erroneously printed all the time.
  (patch by Ilya Yanok)
- 1346_: [SunOS] net_connections() returns an empty list.  (patch by Oleksii
  Shevchuk)

5.4.7
=====

2018-08-14

**Enhancements**

- 1286_: [macOS] psutil.OSX constant is now deprecated in favor of new
  psutil.MACOS.
- 1309_: [Linux] added psutil.STATUS_PARKED constant for Process.status().
- 1321_: [Linux] add disk_io_counters() dual implementation relying on
  /sys/block filesystem in case /proc/diskstats is not available. (patch by
  Lawrence Ye)

**Bug fixes**

- 1209_: [macOS] Process.memory_maps() may fail with EINVAL due to poor
  task_for_pid() syscall. AccessDenied is now raised instead.
- 1278_: [macOS] Process.threads() incorrectly return microseconds instead of
  seconds. (patch by Nikhil Marathe)
- 1279_: [Linux, macOS, BSD] net_if_stats() may return ENODEV.
- 1294_: [Windows] psutil.Process().connections() may sometime fail with
  MemoryError.  (patch by sylvainduchesne)
- 1305_: [Linux] disk_io_stats() may report inflated r/w bytes values.
- 1309_: [Linux] Process.status() is unable to recognize "idle" and "parked"
  statuses (returns '?').
- 1313_: [Linux] disk_io_counters() can report inflated IO counters due to
  erroneously counting base disk device and its partition(s) twice.
- 1323_: [Linux] sensors_temperatures() may fail with ValueError.

5.4.6
=====

2018-06-07

**Bug fixes**

- 1258_: [Windows] Process.username() may cause a segfault (Python interpreter
  crash).  (patch by Jean-Luc Migot)
- 1273_: net_if_addr() namedtuple's name has been renamed from "snic" to
  "snicaddr".
- 1274_: [Linux] there was a small chance Process.children() may swallow
  AccessDenied exceptions.

5.4.5
=====

2018-04-14

**Bug fixes**

- 1268_: setup.py's extra_require parameter requires latest setuptools version,
  breaking quite a lot of installations.

5.4.4
=====

2018-04-13

**Enhancements**

- 1239_: [Linux] expose kernel "slab" memory for psutil.virtual_memory().
  (patch by Maxime Mouial)

**Bug fixes**

- 694_: [SunOS] cmdline() could be truncated at the 15th character when
  reading it from /proc. An extra effort is made by reading it from process
  address space first.  (patch by Georg Sauthoff)
- 771_: [Windows] cpu_count() (both logical and physical) return a wrong
  (smaller) number on systems using process groups (> 64 cores).
- 771_: [Windows] cpu_times(percpu=True) return fewer CPUs on systems using
  process groups (> 64 cores).
- 771_: [Windows] cpu_stats() and cpu_freq() may return incorrect results on
  systems using process groups (> 64 cores).
- 1193_: [SunOS] Return uid/gid from /proc/pid/psinfo if there aren't
  enough permissions for /proc/pid/cred.  (patch by Georg Sauthoff)
- 1194_: [SunOS] Return nice value from psinfo as getpriority() doesn't
  support real-time processes.  (patch by Georg Sauthoff)
- 1194_: [SunOS] Fix double free in psutil_proc_cpu_num().  (patch by Georg
  Sauthoff)
- 1194_: [SunOS] Fix undefined behavior related to strict-aliasing rules
  and warnings.  (patch by Georg Sauthoff)
- 1210_: [Linux] cpu_percent() steal time may remain stuck at 100% due to Linux
  erroneously reporting a decreased steal time between calls. (patch by Arnon
  Yaari)
- 1216_: fix compatibility with python 2.6 on Windows (patch by Dan Vinakovsky)
- 1222_: [Linux] Process.memory_full_info() was erroneously summing "Swap:" and
  "SwapPss:". Same for "Pss:" and "SwapPss". Not anymore.
- 1224_: [Windows] Process.wait() may erroneously raise TimeoutExpired.
- 1238_: [Linux] sensors_battery() may return None in case battery is not
  listed as "BAT0" under /sys/class/power_supply.
- 1240_: [Windows] cpu_times() float loses accuracy in a long running system.
  (patch by stswandering)
- 1245_: [Linux] sensors_temperatures() may fail with IOError "no such file".
- 1255_: [FreeBSD] swap_memory() stats were erroneously represented in KB.
  (patch by Denis Krienbühl)

**Backward compatibility**

- 771_: [Windows] cpu_count(logical=False) on Windows XP and Vista is no
  longer supported and returns None.

5.4.3
=====

*2018-01-01*

**Enhancements**

- 775_: disk_partitions() on Windows return mount points.

**Bug fixes**

- 1193_: pids() may return False on macOS.

5.4.2
=====

*2017-12-07*

**Enhancements**

- 1173_: introduced PSUTIL_DEBUG environment variable which can be set in order
  to print useful debug messages on stderr (useful in case of nasty errors).
- 1177_: added support for sensors_battery() on macOS.  (patch by Arnon Yaari)
- 1183_: Process.children() is 2x faster on UNIX and 2.4x faster on Linux.
- 1188_: deprecated method Process.memory_info_ex() now warns by using
  FutureWarning instead of DeprecationWarning.

**Bug fixes**

- 1152_: [Windows] disk_io_counters() may return an empty dict.
- 1169_: [Linux] users() "hostname" returns username instead.  (patch by
  janderbrain)
- 1172_: [Windows] `make test` does not work.
- 1179_: [Linux] Process.cmdline() is now able to splits cmdline args for
  misbehaving processes which overwrite /proc/pid/cmdline and use spaces
  instead of null bytes as args separator.
- 1181_: [macOS] Process.memory_maps() may raise ENOENT.
- 1187_: [macOS] pids() does not return PID 0 on recent macOS versions.

5.4.1
=====

*2017-11-08*

**Enhancements**

- 1164_: [AIX] add support for Process.num_ctx_switches().  (patch by Arnon
  Yaari)
- 1053_: abandon Python 3.3 support (psutil still works but it's no longer
  tested).

**Bug fixes**

- 1150_: [Windows] when a process is terminate()d now the exit code is set to
  SIGTERM instead of 0.  (patch by Akos Kiss)
- 1151_: python -m psutil.tests fail
- 1154_: [AIX] psutil won't compile on AIX 6.1.0.  (patch by Arnon Yaari)
- 1167_: [Windows] net_io_counter() packets count now include also non-unicast
  packets.  (patch by Matthew Long)

5.4.0
=====

*2017-10-12*

**Enhancements**

- 1123_: [AIX] added support for AIX platform.  (patch by Arnon Yaari)

**Bug fixes**

- 1009_: [Linux] sensors_temperatures() may crash with IOError.
- 1012_: [Windows] disk_io_counters()'s read_time and write_time were expressed
  in tens of micro seconds instead of milliseconds.
- 1127_: [macOS] invalid reference counting in Process.open_files() may lead to
  segfault.  (patch by Jakub Bacic)
- 1129_: [Linux] sensors_fans() may crash with IOError.  (patch by Sebastian
  Saip)
- 1131_: [SunOS] fix compilation warnings.  (patch by Arnon Yaari)
- 1133_: [Windows] can't compile on newer versions of Visual Studio 2017 15.4.
  (patch by Max Bélanger)
- 1138_: [Linux] can't compile on CentOS 5.0 and RedHat 5.0.
  (patch by Prodesire)

5.3.1
=====

*2017-09-10*

**Enhancements**

- 1124_: documentation moved to http://psutil.readthedocs.io

**Bug fixes**

- 1105_: [FreeBSD] psutil does not compile on FreeBSD 12.
- 1125_: [BSD] net_connections() raises TypeError.

**Compatibility notes**

- 1120_: .exe files for Windows are no longer uploaded on PyPI as per PEP-527;
  only wheels are provided.

5.3.0
=====

*2017-09-01*

**Enhancements**

- 802_: disk_io_counters() and net_io_counters() numbers no longer wrap
  (restart from 0). Introduced a new "nowrap" argument.
- 928_: psutil.net_connections() and psutil.Process.connections() "laddr" and
  "raddr" are now named tuples.
- 1015_: swap_memory() now relies on /proc/meminfo instead of sysinfo() syscall
  so that it can be used in conjunction with PROCFS_PATH in order to retrieve
  memory info about Linux containers such as Docker and Heroku.
- 1022_: psutil.users() provides a new "pid" field.
- 1025_: process_iter() accepts two new parameters in order to invoke
  Process.as_dict(): "attrs" and "ad_value". With this you can iterate over all
  processes in one shot without needing to catch NoSuchProcess and do list/dict
  comprehensions.
- 1040_: implemented full unicode support.
- 1051_: disk_usage() on Python 3 is now able to accept bytes.
- 1058_: test suite now enables all warnings by default.
- 1060_: source distribution is dynamically generated so that it only includes
  relevant files.
- 1079_: [FreeBSD] net_connections()'s fd number is now being set for real
  (instead of -1).  (patch by Gleb Smirnoff)
- 1091_: [SunOS] implemented Process.environ().  (patch by Oleksii Shevchuk)

**Bug fixes**

- 989_: [Windows] boot_time() may return a negative value.
- 1007_: [Windows] boot_time() can have a 1 sec fluctuation between calls; the
  value of the first call is now cached so that boot_time() always returns the
  same value if fluctuation is <= 1 second.
- 1013_: [FreeBSD] psutil.net_connections() may return incorrect PID.  (patch
  by Gleb Smirnoff)
- 1014_: [Linux] Process class can mask legitimate ENOENT exceptions as
  NoSuchProcess.
- 1016_: disk_io_counters() raises RuntimeError on a system with no disks.
- 1017_: net_io_counters() raises RuntimeError on a system with no network
  cards installed.
- 1021_: [Linux] open_files() may erroneously raise NoSuchProcess instead of
  skipping a file which gets deleted while open files are retrieved.
- 1029_: [macOS, FreeBSD] Process.connections('unix') on Python 3 doesn't
  properly handle unicode paths and may raise UnicodeDecodeError.
- 1033_: [macOS, FreeBSD] memory leak for net_connections() and
  Process.connections() when retrieving UNIX sockets (kind='unix').
- 1040_: fixed many unicode related issues such as UnicodeDecodeError on
  Python 3 + UNIX and invalid encoded data on Windows.
- 1042_: [FreeBSD] psutil won't compile on FreeBSD 12.
- 1044_: [macOS] different Process methods incorrectly raise AccessDenied for
  zombie processes.
- 1046_: [Windows] disk_partitions() on Windows overrides user's SetErrorMode.
- 1047_: [Windows] Process username(): memory leak in case exception is thrown.
- 1048_: [Windows] users()'s host field report an invalid IP address.
- 1050_: [Windows] Process.memory_maps memory() leaks memory.
- 1055_: cpu_count() is no longer cached; this is useful on systems such as
  Linux where CPUs can be disabled at runtime. This also reflects on
  Process.cpu_percent() which no longer uses the cache.
- 1058_: fixed Python warnings.
- 1062_: disk_io_counters() and net_io_counters() raise TypeError if no disks
  or NICs are installed on the system.
- 1063_: [NetBSD] net_connections() may list incorrect sockets.
- 1064_: [NetBSD] swap_memory() may segfault in case of error.
- 1065_: [OpenBSD] Process.cmdline() may raise SystemError.
- 1067_: [NetBSD] Process.cmdline() leaks memory if process has terminated.
- 1069_: [FreeBSD] Process.cpu_num() may return 255 for certain kernel
  processes.
- 1071_: [Linux] cpu_freq() may raise IOError on old RedHat distros.
- 1074_: [FreeBSD] sensors_battery() raises OSError in case of no battery.
- 1075_: [Windows] net_if_addrs(): inet_ntop() return value is not checked.
- 1077_: [SunOS] net_if_addrs() shows garbage addresses on SunOS 5.10.
  (patch by Oleksii Shevchuk)
- 1077_: [SunOS] net_connections() does not work on SunOS 5.10. (patch by
  Oleksii Shevchuk)
- 1079_: [FreeBSD] net_connections() didn't list locally connected sockets.
  (patch by Gleb Smirnoff)
- 1085_: cpu_count() return value is now checked and forced to None if <= 1.
- 1087_: Process.cpu_percent() guard against cpu_count() returning None and
  assumes 1 instead.
- 1093_: [SunOS] memory_maps() shows wrong 64 bit addresses.
- 1094_: [Windows] psutil.pid_exists() may lie. Also, all process APIs relying
  on OpenProcess Windows API now check whether the PID is actually running.
- 1098_: [Windows] Process.wait() may erroneously return sooner, when the PID
  is still alive.
- 1099_: [Windows] Process.terminate() may raise AccessDenied even if the
  process already died.
- 1101_: [Linux] sensors_temperatures() may raise ENODEV.

**Porting notes**

- 1039_: returned types consolidation:
  - Windows / Process.cpu_times(): fields #3 and #4 were int instead of float
  - Linux / FreeBSD: connections('unix'): raddr is now set to "" instead of
    None
  - OpenBSD: connections('unix'): laddr and raddr are now set to "" instead of
    None
- 1040_: all strings are encoded by using OS fs encoding.
- 1040_: the following Windows APIs on Python 2 now return a string instead of
  unicode:
  - Process.memory_maps().path
  - WindowsService.bin_path()
  - WindowsService.description()
  - WindowsService.display_name()
  - WindowsService.username()

5.2.2
=====

*2017-04-10*

**Bug fixes**

- 1000_: fixed some setup.py warnings.
- 1002_: [SunOS] remove C macro which will not be available on new Solaris
  versions. (patch by Danek Duvall)
- 1004_: [Linux] Process.io_counters() may raise ValueError.
- 1006_: [Linux] cpu_freq() may return None on some Linux versions does not
  support the function; now the function is not declared instead.
- 1009_: [Linux] sensors_temperatures() may raise OSError.
- 1010_: [Linux] virtual_memory() may raise ValueError on Ubuntu 14.04.

5.2.1
=====

*2017-03-24*

**Bug fixes**

- 981_: [Linux] cpu_freq() may return an empty list.
- 993_: [Windows] Process.memory_maps() on Python 3 may raise
  UnicodeDecodeError.
- 996_: [Linux] sensors_temperatures() may not show all temperatures.
- 997_: [FreeBSD] virtual_memory() may fail due to missing sysctl parameter on
  FreeBSD 12.

5.2.0
=====

*2017-03-05*

**Enhancements**

- 971_: [Linux] Add psutil.sensors_fans() function.  (patch by Nicolas Hennion)
- 976_: [Windows] Process.io_counters() has 2 new fields: *other_count* and
  *other_bytes*.
- 976_: [Linux] Process.io_counters() has 2 new fields: *read_chars* and
  *write_chars*.

**Bug fixes**

- 872_: [Linux] can now compile on Linux by using MUSL C library.
- 985_: [Windows] Fix a crash in `Process.open_files` when the worker thread
  for `NtQueryObject` times out.
- 986_: [Linux] Process.cwd() may raise NoSuchProcess instead of ZombieProcess.

5.1.3
=====

**Bug fixes**

- 971_: [Linux] sensors_temperatures() didn't work on CentOS 7.
- 973_: cpu_percent() may raise ZeroDivisionError.

5.1.2
=====

*2017-02-03*

**Bug fixes**

- 966_: [Linux] sensors_battery().power_plugged may erroneously return None on
  Python 3.
- 968_: [Linux] disk_io_counters() raises TypeError on python 3.
- 970_: [Linux] sensors_battery()'s name and label fields on Python 3 are bytes
  instead of str.

5.1.1
=====

*2017-02-03*

**Enhancements**

- 966_: [Linux] sensors_battery().percent is a float and is more precise.

**Bug fixes**

- 964_: [Windows] Process.username() and psutil.users() may return badly
  decoding character on Python 3.
- 965_: [Linux] disk_io_counters() may miscalculate sector size and report the
  wrong number of bytes read and written.
- 966_: [Linux] sensors_battery() may fail with "no such file error".
- 966_: [Linux] sensors_battery().power_plugged may lie.

5.1.0
=====

*2017-02-01*

**Enhancements**

- 357_: added psutil.Process.cpu_num() (what CPU a process is on).
- 371_: added psutil.sensors_temperatures() (Linux only).
- 941_: added psutil.cpu_freq() (CPU frequency).
- 955_: added psutil.sensors_battery() (Linux, Windows, only).
- 956_: cpu_affinity([]) can now be used as an alias to set affinity against
  all eligible CPUs.

**Bug fixes**

- 687_: [Linux] pid_exists() no longer returns True if passed a process thread
  ID.
- 948_: cannot install psutil with PYTHONOPTIMIZE=2.
- 950_: [Windows] Process.cpu_percent() was calculated incorrectly and showed
  higher number than real usage.
- 951_: [Windows] the uploaded wheels for Python 3.6 64 bit didn't work.
- 959_: psutil exception objects could not be pickled.
- 960_: Popen.wait() did not return the correct negative exit status if process
  is ``kill()``ed by a signal.
- 961_: [Windows] WindowsService.description() may fail with
  ERROR_MUI_FILE_NOT_FOUND.

5.0.1
=====

*2016-12-21*

**Enhancements**

- 939_: tar.gz distribution went from 1.8M to 258K.
- 811_: [Windows] provide a more meaningful error message if trying to use
  psutil on unsupported Windows XP.

**Bug fixes**

- 609_: [SunOS] psutil does not compile on Solaris 10.
- 936_: [Windows] fix compilation error on VS 2013 (patch by Max Bélanger).
- 940_: [Linux] cpu_percent() and cpu_times_percent() was calculated
  incorrectly as "iowait", "guest" and "guest_nice" times were not properly
  taken into account.
- 944_: [OpenBSD] psutil.pids() was omitting PID 0.

5.0.0
=====

*2016-11-06*

**Enhncements**

- 799_: new Process.oneshot() context manager making Process methods around
  +2x faster in general and from +2x to +6x faster on Windows.
- 943_: better error message in case of version conflict on import.

**Bug fixes**

- 932_: [NetBSD] net_connections() and Process.connections() may fail without
  raising an exception.
- 933_: [Windows] memory leak in cpu_stats() and WindowsService.description().

4.4.2
=====

*2016-10-26*

**Bug fixes**

- 931_: psutil no longer compiles on Solaris.

4.4.1
=====

*2016-10-25*

**Bug fixes**

- 927_: ``Popen.__del__`` may cause maximum recursion depth error.

4.4.0
=====

*2016-10-23*

**Enhancements**

- 874_: [Windows] net_if_addrs() returns also the netmask.
- 887_: [Linux] virtual_memory()'s 'available' and 'used' values are more
  precise and match "free" cmdline utility.  "available" also takes into
  account LCX containers preventing "available" to overflow "total".
- 891_: procinfo.py script has been updated and provides a lot more info.

**Bug fixes**

- 514_: [macOS] possibly fix Process.memory_maps() segfault (critical!).
- 783_: [macOS] Process.status() may erroneously return "running" for zombie
  processes.
- 798_: [Windows] Process.open_files() returns and empty list on Windows 10.
- 825_: [Linux] cpu_affinity; fix possible double close and use of unopened
  socket.
- 880_: [Windows] Handle race condition inside psutil_net_connections.
- 885_: ValueError is raised if a negative integer is passed to cpu_percent()
  functions.
- 892_: [Linux] Process.cpu_affinity([-1]) raise SystemError with no error
  set; now ValueError is raised.
- 906_: [BSD] disk_partitions(all=False) returned an empty list. Now the
  argument is ignored and all partitions are always returned.
- 907_: [FreeBSD] Process.exe() may fail with OSError(ENOENT).
- 908_: [macOS, BSD] different process methods could errounesuly mask the real
  error for high-privileged PIDs and raise NoSuchProcess and AccessDenied
  instead of OSError and RuntimeError.
- 909_: [macOS] Process open_files() and connections() methods may raise
  OSError with no exception set if process is gone.
- 916_: [macOS] fix many compilation warnings.

4.3.1
=====

*2016-09-01*

**Enhancements**

- 881_: "make install" now works also when using a virtual env.

**Bug fixes**

- 854_: Process.as_dict() raises ValueError if passed an erroneous attrs name.
- 857_: [SunOS] Process cpu_times(), cpu_percent(), threads() amd memory_maps()
  may raise RuntimeError if attempting to query a 64bit process with a 32bit
  python. "Null" values are returned as a fallback.
- 858_: Process.as_dict() should not return memory_info_ex() because it's
  deprecated.
- 863_: [Windows] memory_map truncates addresses above 32 bits
- 866_: [Windows] win_service_iter() and services in general are not able to
  handle unicode service names / descriptions.
- 869_: [Windows] Process.wait() may raise TimeoutExpired with wrong timeout
  unit (ms instead of sec).
- 870_: [Windows] Handle leak inside psutil_get_process_data.

4.3.0
=====

*2016-06-18*

**Enhancements**

- 819_: [Linux] different speedup improvements:
  Process.ppid() is 20% faster
  Process.status() is 28% faster
  Process.name() is 25% faster
  Process.num_threads is 20% faster on Python 3

**Bug fixes**

- 810_: [Windows] Windows wheels are incompatible with pip 7.1.2.
- 812_: [NetBSD] fix compilation on NetBSD-5.x.
- 823_: [NetBSD] virtual_memory() raises TypeError on Python 3.
- 829_: [UNIX] psutil.disk_usage() percent field takes root reserved space
  into account.
- 816_: [Windows] fixed net_io_counter() values wrapping after 4.3GB in
  Windows Vista (NT 6.0) and above using 64bit values from newer win APIs.

4.2.0
=====

*2016-05-14*

**Enhancements**

- 795_: [Windows] new APIs to deal with Windows services: win_service_iter()
  and win_service_get().
- 800_: [Linux] psutil.virtual_memory() returns a new "shared" memory field.
- 819_: [Linux] speedup /proc parsing:
  - Process.ppid() is 20% faster
  - Process.status() is 28% faster
  - Process.name() is 25% faster
  - Process.num_threads is 20% faster on Python 3

**Bug fixes**

- 797_: [Linux] net_if_stats() may raise OSError for certain NIC cards.
- 813_: Process.as_dict() should ignore extraneous attribute names which gets
  attached to the Process instance.

4.1.0
=====

*2016-03-12*

**Enhancements**

- 777_: [Linux] Process.open_files() on Linux return 3 new fields: position,
  mode and flags.
- 779_: Process.cpu_times() returns two new fields, 'children_user' and
  'children_system' (always set to 0 on macOS and Windows).
- 789_: [Windows] psutil.cpu_times() return two new fields: "interrupt" and
  "dpc". Same for psutil.cpu_times_percent().
- 792_: new psutil.cpu_stats() function returning number of CPU ctx switches
  interrupts, soft interrupts and syscalls.

**Bug fixes**

- 774_: [FreeBSD] net_io_counters() dropout is no longer set to 0 if the kernel
  provides it.
- 776_: [Linux] Process.cpu_affinity() may erroneously raise NoSuchProcess.
  (patch by wxwright)
- 780_: [macOS] psutil does not compile with some gcc versions.
- 786_: net_if_addrs() may report incomplete MAC addresses.
- 788_: [NetBSD] virtual_memory()'s buffers and shared values were set to 0.
- 790_: [macOS] psutil won't compile on macOS 10.4.

4.0.0
=====

*2016-02-17*

**Enhancements**

- 523_: [Linux, FreeBSD] disk_io_counters() return a new "busy_time" field.
- 660_: [Windows] make.bat is smarter in finding alternative VS install
  locations.  (patch by mpderbec)
- 732_: Process.environ().  (patch by Frank Benkstein)
- 753_: [Linux, macOS, Windows] Process USS and PSS (Linux) "real" memory stats.
  (patch by Eric Rahm)
- 755_: Process.memory_percent() "memtype" parameter.
- 758_: tests now live in psutil namespace.
- 760_: expose OS constants (psutil.LINUX, psutil.macOS, etc.)
- 756_: [Linux] disk_io_counters() return 2 new fields: read_merged_count and
  write_merged_count.
- 762_: new scripts/procsmem.py script.

**Bug fixes**

- 685_: [Linux] virtual_memory() provides wrong results on systems with a lot
  of physical memory.
- 704_: [Solaris] psutil does not compile on Solaris sparc.
- 734_: on Python 3 invalid UTF-8 data is not correctly handled for process
  name(), cwd(), exe(), cmdline() and open_files() methods resulting in
  UnicodeDecodeError exceptions. 'surrogateescape' error handler is now
  used as a workaround for replacing the corrupted data.
- 737_: [Windows] when the bitness of psutil and the target process was
  different cmdline() and cwd() could return a wrong result or incorrectly
  report an AccessDenied error.
- 741_: [OpenBSD] psutil does not compile on mips64.
- 751_: [Linux] fixed call to Py_DECREF on possible Null object.
- 754_: [Linux] cmdline() can be wrong in case of zombie process.
- 759_: [Linux] Process.memory_maps() may return paths ending with " (deleted)"
- 761_: [Windows] psutil.boot_time() wraps to 0 after 49 days.
- 764_: [NetBSD] fix compilation on NetBSD-6.x.
- 766_: [Linux] net_connections() can't handle malformed /proc/net/unix file.
- 767_: [Linux] disk_io_counters() may raise ValueError on 2.6 kernels and it's
  broken on 2.4 kernels.
- 770_: [NetBSD] disk_io_counters() metrics didn't update.

3.4.2
=====

*2016-01-20*

**Enhancements**

- 728_: [Solaris] exposed psutil.PROCFS_PATH constant to change the default
  location of /proc filesystem.

**Bug fixes**

- 724_: [FreeBSD] psutil.virtual_memory().total is incorrect.
- 730_: [FreeBSD] psutil.virtual_memory() crashes.

3.4.1
=====

*2016-01-15*

**Enhancements**

- 557_: [NetBSD] added NetBSD support.  (contributed by Ryo Onodera and
  Thomas Klausner)
- 708_: [Linux] psutil.net_connections() and Process.connections() on Python 2
  can be up to 3x faster in case of many connections.
  Also psutil.Process.memory_maps() is slightly faster.
- 718_: process_iter() is now thread safe.

**Bug fixes**

- 714_: [OpenBSD] virtual_memory().cached value was always set to 0.
- 715_: don't crash at import time if cpu_times() fail for some reason.
- 717_: [Linux] Process.open_files fails if deleted files still visible.
- 722_: [Linux] swap_memory() no longer crashes if sin/sout can't be determined
  due to missing /proc/vmstat.
- 724_: [FreeBSD] virtual_memory().total is slightly incorrect.

3.3.0
=====

*2015-11-25*

**Enhancements**

- 558_: [Linux] exposed psutil.PROCFS_PATH constant to change the default
  location of /proc filesystem.
- 615_: [OpenBSD] added OpenBSD support.  (contributed by Landry Breuil)

**Bug fixes**

- 692_: [UNIX] Process.name() is no longer cached as it may change.

3.2.2
=====

*2015-10-04*

**Bug fixes**

- 517_: [SunOS] net_io_counters failed to detect network interfaces
  correctly on Solaris 10
- 541_: [FreeBSD] disk_io_counters r/w times were expressed in seconds instead
  of milliseconds.  (patch by dasumin)
- 610_: [SunOS] fix build and tests on Solaris 10
- 623_: [Linux] process or system connections raises ValueError if IPv6 is not
  supported by the system.
- 678_: [Linux] can't install psutil due to bug in setup.py.
- 688_: [Windows] compilation fails with MSVC 2015, Python 3.5. (patch by
  Mike Sarahan)

3.2.1
=====

*2015-09-03*

**Bug fixes**

- 677_: [Linux] can't install psutil due to bug in setup.py.

3.2.0
=====

*2015-09-02*

**Enhancements**

- 644_: [Windows] added support for CTRL_C_EVENT and CTRL_BREAK_EVENT signals
  to use with Process.send_signal().
- 648_: CI test integration for macOS. (patch by Jeff Tang)
- 663_: [UNIX] net_if_addrs() now returns point-to-point (VPNs) addresses.
- 655_: [Windows] different issues regarding unicode handling were fixed. On
  Python 2 all APIs returning a string will now return an encoded version of it
  by using sys.getfilesystemencoding() codec. The APIs involved are:
  - psutil.net_if_addrs()
  - psutil.net_if_stats()
  - psutil.net_io_counters()
  - psutil.Process.cmdline()
  - psutil.Process.name()
  - psutil.Process.username()
  - psutil.users()

**Bug fixes**

- 513_: [Linux] fixed integer overflow for RLIM_INFINITY.
- 641_: [Windows] fixed many compilation warnings.  (patch by Jeff Tang)
- 652_: [Windows] net_if_addrs() UnicodeDecodeError in case of non-ASCII NIC
  names.
- 655_: [Windows] net_if_stats() UnicodeDecodeError in case of non-ASCII NIC
  names.
- 659_: [Linux] compilation error on Suse 10. (patch by maozguttman)
- 664_: [Linux] compilation error on Alpine Linux. (patch by Bart van Kleef)
- 670_: [Windows] segfgault of net_if_addrs() in case of non-ASCII NIC names.
  (patch by sk6249)
- 672_: [Windows] compilation fails if using Windows SDK v8.0. (patch by
  Steven Winfield)
- 675_: [Linux] net_connections(); UnicodeDecodeError may occur when listing
  UNIX sockets.

3.1.1
=====

*2015-07-15*

**Bug fixes**

- 603_: [Linux] ionice_set value range is incorrect.  (patch by spacewander)
- 645_: [Linux] psutil.cpu_times_percent() may produce negative results.
- 656_: 'from psutil import *' does not work.

3.1.0
=====

*2015-07-15*

**Enhancements**

- 534_: [Linux] disk_partitions() added support for ZFS filesystems.
- 646_: continuous tests integration for Windows with
  https://ci.appveyor.com/project/giampaolo/psutil.
- 647_: new dev guide:
  https://github.com/giampaolo/psutil/blob/master/docs/DEVGUIDE.rst
- 651_: continuous code quality test integration with scrutinizer-ci.com

**Bug fixes**

- 340_: [Windows] Process.open_files() no longer hangs. Instead it uses a
  thred which times out and skips the file handle in case it's taking too long
  to be retrieved.  (patch by Jeff Tang, PR #597)
- 627_: [Windows] Process.name() no longer raises AccessDenied for pids owned
  by another user.
- 636_: [Windows] Process.memory_info() raise AccessDenied.
- 637_: [UNIX] raise exception if trying to send signal to Process PID 0 as it
  will affect os.getpid()'s process group instead of PID 0.
- 639_: [Linux] Process.cmdline() can be truncated.
- 640_: [Linux] *connections functions may swallow errors and return an
  incomplete list of connnections.
- 642_: repr() of exceptions is incorrect.
- 653_: [Windows] Add inet_ntop function for Windows XP to support IPv6.
- 641_: [Windows] Replace deprecated string functions with safe equivalents.

3.0.1
=====

*2015-06-18*

**Bug fixes**

- 632_: [Linux] better error message if cannot parse process UNIX connections.
- 634_: [Linux] Proces.cmdline() does not include empty string arguments.
- 635_: [UNIX] crash on module import if 'enum' package is installed on python
  < 3.4.

3.0.0
=====

*2015-06-13*

**Enhancements**

- 250_: new psutil.net_if_stats() returning NIC statistics (isup, duplex,
  speed, MTU).
- 376_: new psutil.net_if_addrs() returning all NIC addresses a-la ifconfig.
- 469_: on Python >= 3.4 ``IOPRIO_CLASS_*`` and ``*_PRIORITY_CLASS`` constants
  returned by psutil.Process' ionice() and nice() methods are enums instead of
  plain integers.
- 581_: add .gitignore. (patch by Gabi Davar)
- 582_: connection constants returned by psutil.net_connections() and
  psutil.Process.connections() were turned from int to enums on Python > 3.4.
- 587_: Move native extension into the package.
- 589_: Process.cpu_affinity() accepts any kind of iterable (set, tuple, ...),
  not only lists.
- 594_: all deprecated APIs were removed.
- 599_: [Windows] process name() can now be determined for all processes even
  when running as a limited user.
- 602_: pre-commit GIT hook.
- 629_: enhanced support for py.test and nose test discovery and tests run.
- 616_: [Windows] Add inet_ntop function for Windows XP.

**Bug fixes**

- 428_: [all UNIXes except Linux] correct handling of zombie processes;
  introduced new ZombieProcess exception class.
- 512_: [BSD] fix segfault in net_connections().
- 555_: [Linux] psutil.users() correctly handles ":0" as an alias for
  "localhost"
- 579_: [Windows] Fixed open_files() for PID>64K.
- 579_: [Windows] fixed many compiler warnings.
- 585_: [FreeBSD] net_connections() may raise KeyError.
- 586_: [FreeBSD] cpu_affinity() segfaults on set in case an invalid CPU
  number is provided.
- 593_: [FreeBSD] Process().memory_maps() segfaults.
- 606_: Process.parent() may swallow NoSuchProcess exceptions.
- 611_: [SunOS] net_io_counters has send and received swapped
- 614_: [Linux]: cpu_count(logical=False) return the number of physical CPUs
  instead of physical cores.
- 618_: [SunOS] swap tests fail on Solaris when run as normal user
- 628_: [Linux] Process.name() truncates process name in case it contains
  spaces or parentheses.

2.2.1
=====

*2015-02-02*

**Bug fixes**

- 496_: [Linux] fix "ValueError: ambiguos inode with multiple PIDs references"
  (patch by Bruno Binet)

2.2.0
=====

*2015-01-06*

**Enhancements**

- 521_: drop support for Python 2.4 and 2.5.
- 553_: new examples/pstree.py script.
- 564_: C extension version mismatch in case the user messed up with psutil
  installation or with sys.path is now detected at import time.
- 568_: New examples/pidof.py script.
- 569_: [FreeBSD] add support for process CPU affinity.

**Bug fixes**

- 496_: [Solaris] can't import psutil.
- 547_: [UNIX] Process.username() may raise KeyError if UID can't be resolved.
- 551_: [Windows] get rid of the unicode hack for net_io_counters() NIC names.
- 556_: [Linux] lots of file handles were left open.
- 561_: [Linux] net_connections() might skip some legitimate UNIX sockets.
  (patch by spacewander)
- 565_: [Windows] use proper encoding for psutil.Process.username() and
  psutil.users(). (patch by Sylvain Mouquet)
- 567_: [Linux] in the alternative implementation of CPU affinity PyList_Append
  and Py_BuildValue return values are not checked.
- 569_: [FreeBSD] fix memory leak in psutil.cpu_count(logical=False).
- 571_: [Linux] Process.open_files() might swallow AccessDenied exceptions and
  return an incomplete list of open files.

2.1.3
=====

*2014-09-26*

- 536_: [Linux]: fix "undefined symbol: CPU_ALLOC" compilation error.

2.1.2
=====

*2014-09-21*

**Enhancements**

- 407_: project moved from Google Code to Github; code moved from Mercurial
  to Git.
- 492_: use tox to run tests on multiple python versions.  (patch by msabramo)
- 505_: [Windows] distribution as wheel packages.
- 511_: new examples/ps.py sample code.

**Bug fixes**

- 340_: [Windows] Process.get_open_files() no longer hangs.  (patch by
  Jeff Tang)
- 501_: [Windows] disk_io_counters() may return negative values.
- 503_: [Linux] in rare conditions Process exe(), open_files() and
  connections() methods can raise OSError(ESRCH) instead of NoSuchProcess.
- 504_: [Linux] can't build RPM packages via setup.py
- 506_: [Linux] python 2.4 support was broken.
- 522_: [Linux] Process.cpu_affinity() might return EINVAL.  (patch by David
  Daeschler)
- 529_: [Windows] Process.exe() may raise unhandled WindowsError exception
  for PIDs 0 and 4.  (patch by Jeff Tang)
- 530_: [Linux] psutil.disk_io_counters() may crash on old Linux distros
  (< 2.6.5)  (patch by Yaolong Huang)
- 533_: [Linux] Process.memory_maps() may raise TypeError on old Linux distros.

2.1.1
=====

*2014-04-30*

**Bug fixes**

- 446_: [Windows] fix encoding error when using net_io_counters() on Python 3.
  (patch by Szigeti Gabor Niif)
- 460_: [Windows] net_io_counters() wraps after 4G.
- 491_: [Linux] psutil.net_connections() exceptions. (patch by Alexander Grothe)

2.1.0
=====

*2014-04-08*

**Enhancements**

- 387_: system-wide open connections a-la netstat.

**Bug fixes**

- 421_: [Solaris] psutil does not compile on SunOS 5.10 (patch by Naveed
  Roudsari)
- 489_: [Linux] psutil.disk_partitions() return an empty list.

2.0.0
=====

*2014-03-10*

**Enhancements**

- 424_: [Windows] installer for Python 3.X 64 bit.
- 427_: number of logical and physical CPUs (psutil.cpu_count()).
- 447_: psutil.wait_procs() timeout parameter is now optional.
- 452_: make Process instances hashable and usable with set()s.
- 453_: tests on Python < 2.7 require unittest2 module.
- 459_: add a make file for running tests and other repetitive tasks (also
  on Windows).
- 463_: make timeout parameter of cpu_percent* functions default to 0.0 'cause
  it's a common trap to introduce slowdowns.
- 468_: move documentation to readthedocs.com.
- 477_: process cpu_percent() is about 30% faster.  (suggested by crusaderky)
- 478_: [Linux] almost all APIs are about 30% faster on Python 3.X.
- 479_: long deprecated psutil.error module is gone; exception classes now
  live in "psutil" namespace only.

**Bug fixes**

- 193_: psutil.Popen constructor can throw an exception if the spawned process
  terminates quickly.
- 340_: [Windows] process get_open_files() no longer hangs.  (patch by
  jtang@vahna.net)
- 443_: [Linux] fix a potential overflow issue for Process.set_cpu_affinity()
  on systems with more than 64 CPUs.
- 448_: [Windows] get_children() and ppid() memory leak (patch by Ulrich
  Klank).
- 457_: [POSIX] pid_exists() always returns True for PID 0.
- 461_: namedtuples are not pickle-able.
- 466_: [Linux] process exe improper null bytes handling.  (patch by
  Gautam Singh)
- 470_: wait_procs() might not wait.  (patch by crusaderky)
- 471_: [Windows] process exe improper unicode handling. (patch by
  alex@mroja.net)
- 473_: psutil.Popen.wait() does not set returncode attribute.
- 474_: [Windows] Process.cpu_percent() is no longer capped at 100%.
- 476_: [Linux] encoding error for process name and cmdline.

**API changes**

For the sake of consistency a lot of psutil APIs have been renamed.
In most cases accessing the old names will work but it will cause a
DeprecationWarning.

- psutil.* module level constants have being replaced by functions:

  +-----------------------+-------------------------------+
  | Old name              | Replacement                   |
  +=======================+===============================+
  | psutil.NUM_CPUS       | psutil.cpu_cpunt()            |
  +-----------------------+-------------------------------+
  | psutil.BOOT_TIME      | psutil.boot_time()            |
  +-----------------------+-------------------------------+
  | psutil.TOTAL_PHYMEM   | psutil.virtual_memory().total |
  +-----------------------+-------------------------------+

- Renamed psutil.* functions:

  +--------------------------+-------------------------------+
  | Old name                 | Replacement                   |
  +==========================+===============================+
  | - psutil.get_pid_list()  | psutil.pids()                 |
  +--------------------------+-------------------------------+
  | - psutil.get_users()     | psutil.users()                |
  +--------------------------+-------------------------------+
  | - psutil.get_boot_time() | psutil.boot_time()            |
  +--------------------------+-------------------------------+

- All psutil.Process ``get_*`` methods lost the ``get_`` prefix.
  get_ext_memory_info() renamed to memory_info_ex().
  Assuming "p = psutil.Process()":

  +--------------------------+----------------------+
  | Old name                 | Replacement          |
  +==========================+======================+
  | p.get_children()         | p.children()         |
  +--------------------------+----------------------+
  | p.get_connections()      | p.connections()      |
  +--------------------------+----------------------+
  | p.get_cpu_affinity()     | p.cpu_affinity()     |
  +--------------------------+----------------------+
  | p.get_cpu_percent()      | p.cpu_percent()      |
  +--------------------------+----------------------+
  | p.get_cpu_times()        | p.cpu_times()        |
  +--------------------------+----------------------+
  | p.get_ext_memory_info()  | p.memory_info_ex()   |
  +--------------------------+----------------------+
  | p.get_io_counters()      | p.io_counters()      |
  +--------------------------+----------------------+
  | p.get_ionice()           | p.ionice()           |
  +--------------------------+----------------------+
  | p.get_memory_info()      | p.memory_info()      |
  +--------------------------+----------------------+
  | p.get_memory_maps()      | p.memory_maps()      |
  +--------------------------+----------------------+
  | p.get_memory_percent()   | p.memory_percent()   |
  +--------------------------+----------------------+
  | p.get_nice()             | p.nice()             |
  +--------------------------+----------------------+
  | p.get_num_ctx_switches() | p.num_ctx_switches() |
  +--------------------------+----------------------+
  | p.get_num_fds()          | p.num_fds()          |
  +--------------------------+----------------------+
  | p.get_num_threads()      | p.num_threads()      |
  +--------------------------+----------------------+
  | p.get_open_files()       | p.open_files()       |
  +--------------------------+----------------------+
  | p.get_rlimit()           | p.rlimit()           |
  +--------------------------+----------------------+
  | p.get_threads()          | p.threads()          |
  +--------------------------+----------------------+
  | p.getcwd()               | p.cwd()              |
  +--------------------------+----------------------+

- All psutil.Process ``set_*`` methods lost the ``set_`` prefix.
  Assuming "p = psutil.Process()":

  +----------------------+---------------------------------+
  | Old name             | Replacement                     |
  +======================+=================================+
  | p.set_nice()         | p.nice(value)                   |
  +----------------------+---------------------------------+
  | p.set_ionice()       | p.ionice(ioclass, value=None)   |
  +----------------------+---------------------------------+
  | p.set_cpu_affinity() | p.cpu_affinity(cpus)            |
  +----------------------+---------------------------------+
  | p.set_rlimit()       | p.rlimit(resource, limits=None) |
  +----------------------+---------------------------------+

- Except for 'pid' all psutil.Process class properties have been turned into
  methods. This is the only case which there are no aliases.
  Assuming "p = psutil.Process()":

  +---------------+-----------------+
  | Old name      | Replacement     |
  +===============+=================+
  | p.name        | p.name()        |
  +---------------+-----------------+
  | p.parent      | p.parent()      |
  +---------------+-----------------+
  | p.ppid        | p.ppid()        |
  +---------------+-----------------+
  | p.exe         | p.exe()         |
  +---------------+-----------------+
  | p.cmdline     | p.cmdline()     |
  +---------------+-----------------+
  | p.status      | p.status()      |
  +---------------+-----------------+
  | p.uids        | p.uids()        |
  +---------------+-----------------+
  | p.gids        | p.gids()        |
  +---------------+-----------------+
  | p.username    | p.username()    |
  +---------------+-----------------+
  | p.create_time | p.create_time() |
  +---------------+-----------------+

- timeout parameter of cpu_percent* functions defaults to 0.0 instead of 0.1.
- long deprecated psutil.error module is gone; exception classes now live in
  "psutil" namespace only.
- Process instances' "retcode" attribute returned by psutil.wait_procs() has
  been renamed to "returncode" for consistency with subprocess.Popen.

1.2.1
=====

*2013-11-25*

**Bug fixes**

- 348_: [Windows XP] fixed "ImportError: DLL load failed" occurring on module
  import.
- 425_: [Solaris] crash on import due to failure at determining BOOT_TIME.
- 443_: [Linux] can't set CPU affinity on systems with more than 64 cores.

1.2.0
=====

*2013-11-20*

**Enhancements**

- 439_: assume os.getpid() if no argument is passed to psutil.Process
  constructor.
- 440_: new psutil.wait_procs() utility function which waits for multiple
  processes to terminate.

**Bug fixes**

- 348_: [Windows XP/Vista] fix "ImportError: DLL load failed" occurring on
  module import.

1.1.3
=====

*2013-11-07*

**Bug fixes**

- 442_: [Linux] psutil won't compile on certain version of Linux because of
  missing prlimit(2) syscall.

1.1.2
=====

*2013-10-22*

**Bug fixes**

- 442_: [Linux] psutil won't compile on Debian 6.0 because of missing
  prlimit(2) syscall.

1.1.1
=====

*2013-10-08*

**Bug fixes**

- 442_: [Linux] psutil won't compile on kernels < 2.6.36 due to missing
  prlimit(2) syscall.

1.1.0
=====

*2013-09-28*

**Enhancements**

- 410_: host tar.gz and windows binary files are on PyPI.
- 412_: [Linux] get/set process resource limits.
- 415_: [Windows] Process.get_children() is an order of magnitude faster.
- 426_: [Windows] Process.name is an order of magnitude faster.
- 431_: [UNIX] Process.name is slightly faster because it unnecessarily
  retrieved also process cmdline.

**Bug fixes**

- 391_: [Windows] psutil.cpu_times_percent() returns negative percentages.
- 408_: STATUS_* and CONN_* constants don't properly serialize on JSON.
- 411_: [Windows] examples/disk_usage.py may pop-up a GUI error.
- 413_: [Windows] Process.get_memory_info() leaks memory.
- 414_: [Windows] Process.exe on Windows XP may raise ERROR_INVALID_PARAMETER.
- 416_: psutil.disk_usage() doesn't work well with unicode path names.
- 430_: [Linux] process IO counters report wrong number of r/w syscalls.
- 435_: [Linux] psutil.net_io_counters() might report erreneous NIC names.
- 436_: [Linux] psutil.net_io_counters() reports a wrong 'dropin' value.

**API changes**

- 408_: turn STATUS_* and CONN_* constants into plain Python strings.

1.0.1
=====

*2013-07-12*

**Bug fixes**

- 405_: network_io_counters(pernic=True) no longer works as intended in 1.0.0.

1.0.0
=====

*2013-07-10*

**Enhancements**

- 18_:  Solaris support (yay!)  (thanks Justin Venus)
- 367_: Process.get_connections() 'status' strings are now constants.
- 380_: test suite exits with non-zero on failure.  (patch by floppymaster)
- 391_: introduce unittest2 facilities and provide workarounds if unittest2
  is not installed (python < 2.7).

**Bug fixes**

- 374_: [Windows] negative memory usage reported if process uses a lot of
  memory.
- 379_: [Linux] Process.get_memory_maps() may raise ValueError.
- 394_: [macOS] Mapped memory regions report incorrect file name.
- 404_: [Linux] sched_*affinity() are implicitly declared. (patch by Arfrever)

**API changes**

- Process.get_connections() 'status' field is no longer a string but a
  constant object (psutil.CONN_*).
- Process.get_connections() 'local_address' and 'remote_address' fields
  renamed to 'laddr' and 'raddr'.
- psutil.network_io_counters() renamed to psutil.net_io_counters().

0.7.1
=====

*2013-05-03*

**Bug fixes**

- 325_: [BSD] psutil.virtual_memory() can raise SystemError.
  (patch by Jan Beich)
- 370_: [BSD] Process.get_connections() requires root.  (patch by John Baldwin)
- 372_: [BSD] different process methods raise NoSuchProcess instead of
  AccessDenied.

0.7.0
=====

*2013-04-12*

**Enhancements**

- 233_: code migrated to Mercurial (yay!)
- 246_: psutil.error module is deprecated and scheduled for removal.
- 328_: [Windows] process IO nice/priority support.
- 359_: psutil.get_boot_time()
- 361_: [Linux] psutil.cpu_times() now includes new 'steal', 'guest' and
  'guest_nice' fields available on recent Linux kernels.
  Also, psutil.cpu_percent() is more accurate.
- 362_: cpu_times_percent() (per-CPU-time utilization as a percentage)

**Bug fixes**

- 234_: [Windows] disk_io_counters() fails to list certain disks.
- 264_: [Windows] use of psutil.disk_partitions() may cause a message box to
  appear.
- 313_: [Linux] psutil.virtual_memory() and psutil.swap_memory() can crash on
  certain exotic Linux flavors having an incomplete /proc interface.
  If that's the case we now set the unretrievable stats to 0 and raise a
  RuntimeWarning.
- 315_: [macOS] fix some compilation warnings.
- 317_: [Windows] cannot set process CPU affinity above 31 cores.
- 319_: [Linux] process get_memory_maps() raises KeyError 'Anonymous' on Debian
  squeeze.
- 321_: [UNIX] Process.ppid property is no longer cached as the kernel may set
  the ppid to 1 in case of a zombie process.
- 323_: [macOS] disk_io_counters()'s read_time and write_time parameters were
  reporting microseconds not milliseconds.  (patch by Gregory Szorc)
- 331_: Process cmdline is no longer cached after first acces as it may change.
- 333_: [macOS] Leak of Mach ports on macOS (patch by rsesek@google.com)
- 337_: [Linux] process methods not working because of a poor /proc
  implementation will raise NotImplementedError rather than RuntimeError
  and Process.as_dict() will not blow up.  (patch by Curtin1060)
- 338_: [Linux] disk_io_counters() fails to find some disks.
- 339_: [FreeBSD] get_pid_list() can allocate all the memory on system.
- 341_: [Linux] psutil might crash on import due to error in retrieving system
  terminals map.
- 344_: [FreeBSD] swap_memory() might return incorrect results due to
  kvm_open(3) not being called. (patch by Jean Sebastien)
- 338_: [Linux] disk_io_counters() fails to find some disks.
- 351_: [Windows] if psutil is compiled with mingw32 (provided installers for
  py2.4 and py2.5 are) disk_io_counters() will fail. (Patch by m.malycha)
- 353_: [macOS] get_users() returns an empty list on macOS 10.8.
- 356_: Process.parent now checks whether parent PID has been reused in which
  case returns None.
- 365_: Process.set_nice() should check PID has not been reused by another
  process.
- 366_: [FreeBSD] get_memory_maps(), get_num_fds(), get_open_files() and
  getcwd() Process methods raise RuntimeError instead of AccessDenied.

**API changes**

- Process.cmdline property is no longer cached after first access.
- Process.ppid property is no longer cached after first access.
- [Linux] Process methods not working because of a poor /proc implementation
  will raise NotImplementedError instead of RuntimeError.
- psutil.error module is deprecated and scheduled for removal.

0.6.1
=====

*2012-08-16*

**Enhancements**

- 316_: process cmdline property now makes a better job at guessing the process
  executable from the cmdline.

**Bug fixes**

- 316_: process exe was resolved in case it was a symlink.
- 318_: python 2.4 compatibility was broken.

**API changes**

- process exe can now return an empty string instead of raising AccessDenied.
- process exe is no longer resolved in case it's a symlink.

0.6.0
=====

*2012-08-13*

**Enhancements**

- 216_: [POSIX] get_connections() UNIX sockets support.
- 220_: [FreeBSD] get_connections() has been rewritten in C and no longer
  requires lsof.
- 222_: [macOS] add support for process cwd.
- 261_: process extended memory info.
- 295_: [macOS] process executable path is now determined by asking the OS
  instead of being guessed from process cmdline.
- 297_: [macOS] the Process methods below were always raising AccessDenied for
  any process except the current one. Now this is no longer true. Also
  they are 2.5x faster.
  - name
  - get_memory_info()
  - get_memory_percent()
  - get_cpu_times()
  - get_cpu_percent()
  - get_num_threads()
- 300_: examples/pmap.py script.
- 301_: process_iter() now yields processes sorted by their PIDs.
- 302_: process number of voluntary and involuntary context switches.
- 303_: [Windows] the Process methods below were always raising AccessDenied
  for any process not owned by current user. Now this is no longer true:
  - create_time
  - get_cpu_times()
  - get_cpu_percent()
  - get_memory_info()
  - get_memory_percent()
  - get_num_handles()
  - get_io_counters()
- 305_: add examples/netstat.py script.
- 311_: system memory functions has been refactorized and rewritten and now
  provide a more detailed and consistent representation of the system
  memory. New psutil.virtual_memory() function provides the following
  memory amounts:
  - total
  - available
  - percent
  - used
  - active [POSIX]
  - inactive [POSIX]
  - buffers (BSD, Linux)
  - cached (BSD, macOS)
  - wired (macOS, BSD)
  - shared [FreeBSD]
  New psutil.swap_memory() provides:
  - total
  - used
  - free
  - percent
  - sin (no. of bytes the system has swapped in from disk (cumulative))
  - sout (no. of bytes the system has swapped out from disk (cumulative))
  All old memory-related functions are deprecated.
  Also two new example scripts were added:  free.py and meminfo.py.
- 312_: psutil.network_io_counters() namedtuple includes 4 new fields:
  errin, errout dropin and dropout, reflecting the number of packets
  dropped and with errors.

**Bug fixes**

- 298_: [macOS and BSD] memory leak in get_num_fds().
- 299_: potential memory leak every time PyList_New(0) is used.
- 303_: [Windows] potential heap corruption in get_num_threads() and
  get_status() Process methods.
- 305_: [FreeBSD] psutil can't compile on FreeBSD 9 due to removal of utmp.h.
- 306_: at C level, errors are not checked when invoking Py* functions which
  create or manipulate Python objects leading to potential memory related
  errors and/or segmentation faults.
- 307_: [FreeBSD] values returned by psutil.network_io_counters() are wrong.
- 308_: [BSD / Windows] psutil.virtmem_usage() wasn't actually returning
  information about swap memory usage as it was supposed to do. It does
  now.
- 309_: get_open_files() might not return files which can not be accessed
  due to limited permissions. AccessDenied is now raised instead.

**API changes**

- psutil.phymem_usage() is deprecated       (use psutil.virtual_memory())
- psutil.virtmem_usage() is deprecated      (use psutil.swap_memory())
- psutil.phymem_buffers() on Linux is deprecated  (use psutil.virtual_memory())
- psutil.cached_phymem() on Linux is deprecated   (use psutil.virtual_memory())
- [Windows and BSD] psutil.virtmem_usage() now returns information about swap
  memory instead of virtual memory.

0.5.1
=====

*2012-06-29*

**Enhancements**

- 293_: [Windows] process executable path is now determined by asking the OS
  instead of being guessed from process cmdline.

**Bug fixes**

- 292_: [Linux] race condition in process files/threads/connections.
- 294_: [Windows] Process CPU affinity is only able to set CPU #0.

0.5.0
=====

*2012-06-27*

**Enhancements**

- 195_: [Windows] number of handles opened by process.
- 209_: psutil.disk_partitions() now provides also mount options.
- 229_: list users currently connected on the system (psutil.get_users()).
- 238_: [Linux, Windows] process CPU affinity (get and set).
- 242_: Process.get_children(recursive=True): return all process
  descendants.
- 245_: [POSIX] Process.wait() incrementally consumes less CPU cycles.
- 257_: [Windows] removed Windows 2000 support.
- 258_: [Linux] Process.get_memory_info() is now 0.5x faster.
- 260_: process's mapped memory regions. (Windows patch by wj32.64, macOS patch
  by Jeremy Whitlock)
- 262_: [Windows] psutil.disk_partitions() was slow due to inspecting the
  floppy disk drive also when "all" argument was False.
- 273_: psutil.get_process_list() is deprecated.
- 274_: psutil no longer requires 2to3 at installation time in order to work
  with Python 3.
- 278_: new Process.as_dict() method.
- 281_: ppid, name, exe, cmdline and create_time properties of Process class
  are now cached after being accessed.
- 282_: psutil.STATUS_* constants can now be compared by using their string
  representation.
- 283_: speedup Process.is_running() by caching its return value in case the
  process is terminated.
- 284_: [POSIX] per-process number of opened file descriptors.
- 287_: psutil.process_iter() now caches Process instances between calls.
- 290_: Process.nice property is deprecated in favor of new get_nice() and
  set_nice() methods.

**Bug fixes**

- 193_: psutil.Popen constructor can throw an exception if the spawned process
  terminates quickly.
- 240_: [macOS] incorrect use of free() for Process.get_connections().
- 244_: [POSIX] Process.wait() can hog CPU resources if called against a
  process which is not our children.
- 248_: [Linux] psutil.network_io_counters() might return erroneous NIC names.
- 252_: [Windows] process getcwd() erroneously raise NoSuchProcess for
  processes owned by another user.  It now raises AccessDenied instead.
- 266_: [Windows] psutil.get_pid_list() only shows 1024 processes.
  (patch by Amoser)
- 267_: [macOS] Process.get_connections() - an erroneous remote address was
  returned. (Patch by Amoser)
- 272_: [Linux] Porcess.get_open_files() - potential race condition can lead to
  unexpected NoSuchProcess exception.  Also, we can get incorrect reports
  of not absolutized path names.
- 275_: [Linux] Process.get_io_counters() erroneously raise NoSuchProcess on
  old Linux versions. Where not available it now raises
  NotImplementedError.
- 286_: Process.is_running() doesn't actually check whether PID has been
  reused.
- 314_: Process.get_children() can sometimes return non-children.

**API changes**

- Process.nice property is deprecated in favor of new get_nice() and set_nice()
  methods.
- psutil.get_process_list() is deprecated.
- ppid, name, exe, cmdline and create_time properties of Process class are now
  cached after being accessed, meaning NoSuchProcess will no longer be raised
  in case the process is gone in the meantime.
- psutil.STATUS_* constants can now be compared by using their string
  representation.

0.4.1
=====

*2011-12-14*

**Bug fixes**

- 228_: some example scripts were not working with python 3.
- 230_: [Windows / macOS] memory leak in Process.get_connections().
- 232_: [Linux] psutil.phymem_usage() can report erroneous values which are
  different than "free" command.
- 236_: [Windows] memory/handle leak in Process's get_memory_info(),
  suspend() and resume() methods.

0.4.0
=====

*2011-10-29*

**Enhancements**

- 150_: network I/O counters. (macOS and Windows patch by Jeremy Whitlock)
- 154_: [FreeBSD] add support for process getcwd()
- 157_: [Windows] provide installer for Python 3.2 64-bit.
- 198_: Process.wait(timeout=0) can now be used to make wait() return
  immediately.
- 206_: disk I/O counters. (macOS and Windows patch by Jeremy Whitlock)
- 213_: examples/iotop.py script.
- 217_: Process.get_connections() now has a "kind" argument to filter
  for connections with different criteria.
- 221_: [FreeBSD] Process.get_open_files has been rewritten in C and no longer
  relies on lsof.
- 223_: examples/top.py script.
- 227_: examples/nettop.py script.

**Bug fixes**

- 135_: [macOS] psutil cannot create Process object.
- 144_: [Linux] no longer support 0 special PID.
- 188_: [Linux] psutil import error on Linux ARM architectures.
- 194_: [POSIX] psutil.Process.get_cpu_percent() now reports a percentage over
  100 on multicore processors.
- 197_: [Linux] Process.get_connections() is broken on platforms not
  supporting IPv6.
- 200_: [Linux] psutil.NUM_CPUS not working on armel and sparc architectures
  and causing crash on module import.
- 201_: [Linux] Process.get_connections() is broken on big-endian
  architectures.
- 211_: Process instance can unexpectedly raise NoSuchProcess if tested for
  equality with another object.
- 218_: [Linux] crash at import time on Debian 64-bit because of a missing
  line in /proc/meminfo.
- 226_: [FreeBSD] crash at import time on FreeBSD 7 and minor.

0.3.0
=====

*2011-07-08*

**Enhancements**

- 125_: system per-cpu percentage utilization and times.
- 163_: per-process associated terminal (TTY).
- 171_: added get_phymem() and get_virtmem() functions returning system
  memory information (total, used, free) and memory percent usage.
  total_* avail_* and used_* memory functions are deprecated.
- 172_: disk usage statistics.
- 174_: mounted disk partitions.
- 179_: setuptools is now used in setup.py

**Bug fixes**

- 159_: SetSeDebug() does not close handles or unset impersonation on return.
- 164_: [Windows] wait function raises a TimeoutException when a process
  returns -1 .
- 165_: process.status raises an unhandled exception.
- 166_: get_memory_info() leaks handles hogging system resources.
- 168_: psutil.cpu_percent() returns erroneous results when used in
  non-blocking mode.  (patch by Philip Roberts)
- 178_: macOS - Process.get_threads() leaks memory
- 180_: [Windows] Process's get_num_threads() and get_threads() methods can
  raise NoSuchProcess exception while process still exists.

0.2.1
=====

*2011-03-20*

**Enhancements**

- 64_: per-process I/O counters.
- 116_: per-process wait() (wait for process to terminate and return its exit
  code).
- 134_: per-process get_threads() returning information (id, user and kernel
  times) about threads opened by process.
- 136_: process executable path on FreeBSD is now determined by asking the
  kernel instead of guessing it from cmdline[0].
- 137_: per-process real, effective and saved user and group ids.
- 140_: system boot time.
- 142_: per-process get and set niceness (priority).
- 143_: per-process status.
- 147_: per-process I/O nice (priority) - Linux only.
- 148_: psutil.Popen class which tidies up subprocess.Popen and psutil.Process
  in a unique interface.
- 152_: [macOS] get_process_open_files() implementation has been rewritten
  in C and no longer relies on lsof resulting in a 3x speedup.
- 153_: [macOS] get_process_connection() implementation has been rewritten
  in C and no longer relies on lsof resulting in a 3x speedup.

**Bug fixes**

- 83_:  process cmdline is empty on macOS 64-bit.
- 130_: a race condition can cause IOError exception be raised on
  Linux if process disappears between open() and subsequent read() calls.
- 145_: WindowsError was raised instead of psutil.AccessDenied when using
  process resume() or suspend() on Windows.
- 146_: 'exe' property on Linux can raise TypeError if path contains NULL
  bytes.
- 151_: exe and getcwd() for PID 0 on Linux return inconsistent data.

**API changes**

- Process "uid" and "gid" properties are deprecated in favor of "uids" and
  "gids" properties.

0.2.0
=====

*2010-11-13*

**Enhancements**

- 79_: per-process open files.
- 88_: total system physical cached memory.
- 88_: total system physical memory buffers used by the kernel.
- 91_: per-process send_signal() and terminate() methods.
- 95_: NoSuchProcess and AccessDenied exception classes now provide "pid",
  "name" and "msg" attributes.
- 97_: per-process children.
- 98_: Process.get_cpu_times() and Process.get_memory_info now return
  a namedtuple instead of a tuple.
- 103_: per-process opened TCP and UDP connections.
- 107_: add support for Windows 64 bit. (patch by cjgohlke)
- 111_: per-process executable name.
- 113_: exception messages now include process name and pid.
- 114_: process username Windows implementation has been rewritten in pure
  C and no longer uses WMI resulting in a big speedup. Also, pywin32 is no
  longer required as a third-party dependancy. (patch by wj32)
- 117_: added support for Windows 2000.
- 123_: psutil.cpu_percent() and psutil.Process.cpu_percent() accept a
  new 'interval' parameter.
- 129_: per-process number of threads.

**Bug fixes**

- 80_: fixed warnings when installing psutil with easy_install.
- 81_: psutil fails to compile with Visual Studio.
- 94_: suspend() raises OSError instead of AccessDenied.
- 86_: psutil didn't compile against FreeBSD 6.x.
- 102_: orphaned process handles obtained by using OpenProcess in C were
  left behind every time Process class was instantiated.
- 111_: path and name Process properties report truncated or erroneous
  values on UNIX.
- 120_: cpu_percent() always returning 100% on macOS.
- 112_: uid and gid properties don't change if process changes effective
  user/group id at some point.
- 126_: ppid, uid, gid, name, exe, cmdline and create_time properties are
  no longer cached and correctly raise NoSuchProcess exception if the process
  disappears.

**API changes**

- psutil.Process.path property is deprecated and works as an alias for "exe"
  property.
- psutil.Process.kill(): signal argument was removed - to send a signal to the
  process use send_signal(signal) method instead.
- psutil.Process.get_memory_info() returns a nametuple instead of a tuple.
- psutil.cpu_times() returns a nametuple instead of a tuple.
- New psutil.Process methods: get_open_files(), get_connections(),
  send_signal() and terminate().
- ppid, uid, gid, name, exe, cmdline and create_time properties are no longer
  cached and raise NoSuchProcess exception if process disappears.
- psutil.cpu_percent() no longer returns immediately (see issue 123).
- psutil.Process.get_cpu_percent() and psutil.cpu_percent() no longer returns
  immediately by default (see issue 123).

0.1.3
=====

*2010-03-02*

**Enhancements**

- 14_: per-process username
- 51_: per-process current working directory (Windows and Linux only)
- 59_: Process.is_running() is now 10 times faster
- 61_: added supoprt for FreeBSD 64 bit
- 71_: implemented suspend/resume process
- 75_: python 3 support

**Bug fixes**

- 36_: process cpu_times() and memory_info() functions succeeded also for dead
  processes while a NoSuchProcess exception is supposed to be raised.
- 48_: incorrect size for mib array defined in getcmdargs for BSD
- 49_: possible memory leak due to missing free() on error condition on
- 50_: fixed getcmdargs() memory fragmentation on BSD
- 55_: test_pid_4 was failing on Windows Vista
- 57_: some unit tests were failing on systems where no swap memory is
  available
- 58_: is_running() is now called before kill() to make sure we are going
  to kill the correct process.
- 73_: virtual memory size reported on macOS includes shared library size
- 77_: NoSuchProcess wasn't raised on Process.create_time if kill() was
  used first.

0.1.2
=====

*2009-05-06*

**Enhancements**

- 32_: Per-process CPU user/kernel times
- 33_: Process create time
- 34_: Per-process CPU utilization percentage
- 38_: Per-process memory usage (bytes)
- 41_: Per-process memory utilization (percent)
- 39_: System uptime
- 43_: Total system virtual memory
- 46_: Total system physical memory
- 44_: Total system used/free virtual and physical memory

**Bug fixes**

- 36_: [Windows] NoSuchProcess not raised when accessing timing methods.
- 40_: test_get_cpu_times() failing on FreeBSD and macOS.
- 42_: [Windows] get_memory_percent() raises AccessDenied.

0.1.1
=====

*2009-03-06*

**Enhancements**

- 4_: FreeBSD support for all functions of psutil
- 9_: Process.uid and Process.gid now retrieve process UID and GID.
- 11_: Support for parent/ppid - Process.parent property returns a
  Process object representing the parent process, and Process.ppid returns
  the parent PID.
- 12_ & 15:
  NoSuchProcess exception now raised when creating an object
  for a nonexistent process, or when retrieving information about a process
  that has gone away.
- 21_: AccessDenied exception created for raising access denied errors
  from OSError or WindowsError on individual platforms.
- 26_: psutil.process_iter() function to iterate over processes as
  Process objects with a generator.
- Process objects can now also be compared with == operator for equality
  (PID, name, command line are compared).

**Bug fixes**

- 16_: [Windows] Special case for "System Idle Process" (PID 0) which
  otherwise would return an "invalid parameter" exception.
- 17_: get_process_list() ignores NoSuchProcess and AccessDenied
  exceptions during building of the list.
- 22_: [Windows] Process(0).kill() was failing with an unset exception.
- 23_: Special case for pid_exists(0)
- 24_: [Windows] Process(0).kill() now raises AccessDenied exception instead
  of WindowsError.
- 30_: psutil.get_pid_list() was returning two ins

.. _1: https://github.com/giampaolo/psutil/issues/1
.. _2: https://github.com/giampaolo/psutil/issues/2
.. _3: https://github.com/giampaolo/psutil/issues/3
.. _4: https://github.com/giampaolo/psutil/issues/4
.. _5: https://github.com/giampaolo/psutil/issues/5
.. _6: https://github.com/giampaolo/psutil/issues/6
.. _7: https://github.com/giampaolo/psutil/issues/7
.. _8: https://github.com/giampaolo/psutil/issues/8
.. _9: https://github.com/giampaolo/psutil/issues/9
.. _10: https://github.com/giampaolo/psutil/issues/10
.. _11: https://github.com/giampaolo/psutil/issues/11
.. _12: https://github.com/giampaolo/psutil/issues/12
.. _13: https://github.com/giampaolo/psutil/issues/13
.. _14: https://github.com/giampaolo/psutil/issues/14
.. _15: https://github.com/giampaolo/psutil/issues/15
.. _16: https://github.com/giampaolo/psutil/issues/16
.. _17: https://github.com/giampaolo/psutil/issues/17
.. _18: https://github.com/giampaolo/psutil/issues/18
.. _19: https://github.com/giampaolo/psutil/issues/19
.. _20: https://github.com/giampaolo/psutil/issues/20
.. _21: https://github.com/giampaolo/psutil/issues/21
.. _22: https://github.com/giampaolo/psutil/issues/22
.. _23: https://github.com/giampaolo/psutil/issues/23
.. _24: https://github.com/giampaolo/psutil/issues/24
.. _25: https://github.com/giampaolo/psutil/issues/25
.. _26: https://github.com/giampaolo/psutil/issues/26
.. _27: https://github.com/giampaolo/psutil/issues/27
.. _28: https://github.com/giampaolo/psutil/issues/28
.. _29: https://github.com/giampaolo/psutil/issues/29
.. _30: https://github.com/giampaolo/psutil/issues/30
.. _31: https://github.com/giampaolo/psutil/issues/31
.. _32: https://github.com/giampaolo/psutil/issues/32
.. _33: https://github.com/giampaolo/psutil/issues/33
.. _34: https://github.com/giampaolo/psutil/issues/34
.. _35: https://github.com/giampaolo/psutil/issues/35
.. _36: https://github.com/giampaolo/psutil/issues/36
.. _37: https://github.com/giampaolo/psutil/issues/37
.. _38: https://github.com/giampaolo/psutil/issues/38
.. _39: https://github.com/giampaolo/psutil/issues/39
.. _40: https://github.com/giampaolo/psutil/issues/40
.. _41: https://github.com/giampaolo/psutil/issues/41
.. _42: https://github.com/giampaolo/psutil/issues/42
.. _43: https://github.com/giampaolo/psutil/issues/43
.. _44: https://github.com/giampaolo/psutil/issues/44
.. _45: https://github.com/giampaolo/psutil/issues/45
.. _46: https://github.com/giampaolo/psutil/issues/46
.. _47: https://github.com/giampaolo/psutil/issues/47
.. _48: https://github.com/giampaolo/psutil/issues/48
.. _49: https://github.com/giampaolo/psutil/issues/49
.. _50: https://github.com/giampaolo/psutil/issues/50
.. _51: https://github.com/giampaolo/psutil/issues/51
.. _52: https://github.com/giampaolo/psutil/issues/52
.. _53: https://github.com/giampaolo/psutil/issues/53
.. _54: https://github.com/giampaolo/psutil/issues/54
.. _55: https://github.com/giampaolo/psutil/issues/55
.. _56: https://github.com/giampaolo/psutil/issues/56
.. _57: https://github.com/giampaolo/psutil/issues/57
.. _58: https://github.com/giampaolo/psutil/issues/58
.. _59: https://github.com/giampaolo/psutil/issues/59
.. _60: https://github.com/giampaolo/psutil/issues/60
.. _61: https://github.com/giampaolo/psutil/issues/61
.. _62: https://github.com/giampaolo/psutil/issues/62
.. _63: https://github.com/giampaolo/psutil/issues/63
.. _64: https://github.com/giampaolo/psutil/issues/64
.. _65: https://github.com/giampaolo/psutil/issues/65
.. _66: https://github.com/giampaolo/psutil/issues/66
.. _67: https://github.com/giampaolo/psutil/issues/67
.. _68: https://github.com/giampaolo/psutil/issues/68
.. _69: https://github.com/giampaolo/psutil/issues/69
.. _70: https://github.com/giampaolo/psutil/issues/70
.. _71: https://github.com/giampaolo/psutil/issues/71
.. _72: https://github.com/giampaolo/psutil/issues/72
.. _73: https://github.com/giampaolo/psutil/issues/73
.. _74: https://github.com/giampaolo/psutil/issues/74
.. _75: https://github.com/giampaolo/psutil/issues/75
.. _76: https://github.com/giampaolo/psutil/issues/76
.. _77: https://github.com/giampaolo/psutil/issues/77
.. _78: https://github.com/giampaolo/psutil/issues/78
.. _79: https://github.com/giampaolo/psutil/issues/79
.. _80: https://github.com/giampaolo/psutil/issues/80
.. _81: https://github.com/giampaolo/psutil/issues/81
.. _82: https://github.com/giampaolo/psutil/issues/82
.. _83: https://github.com/giampaolo/psutil/issues/83
.. _84: https://github.com/giampaolo/psutil/issues/84
.. _85: https://github.com/giampaolo/psutil/issues/85
.. _86: https://github.com/giampaolo/psutil/issues/86
.. _87: https://github.com/giampaolo/psutil/issues/87
.. _88: https://github.com/giampaolo/psutil/issues/88
.. _89: https://github.com/giampaolo/psutil/issues/89
.. _90: https://github.com/giampaolo/psutil/issues/90
.. _91: https://github.com/giampaolo/psutil/issues/91
.. _92: https://github.com/giampaolo/psutil/issues/92
.. _93: https://github.com/giampaolo/psutil/issues/93
.. _94: https://github.com/giampaolo/psutil/issues/94
.. _95: https://github.com/giampaolo/psutil/issues/95
.. _96: https://github.com/giampaolo/psutil/issues/96
.. _97: https://github.com/giampaolo/psutil/issues/97
.. _98: https://github.com/giampaolo/psutil/issues/98
.. _99: https://github.com/giampaolo/psutil/issues/99
.. _100: https://github.com/giampaolo/psutil/issues/100
.. _101: https://github.com/giampaolo/psutil/issues/101
.. _102: https://github.com/giampaolo/psutil/issues/102
.. _103: https://github.com/giampaolo/psutil/issues/103
.. _104: https://github.com/giampaolo/psutil/issues/104
.. _105: https://github.com/giampaolo/psutil/issues/105
.. _106: https://github.com/giampaolo/psutil/issues/106
.. _107: https://github.com/giampaolo/psutil/issues/107
.. _108: https://github.com/giampaolo/psutil/issues/108
.. _109: https://github.com/giampaolo/psutil/issues/109
.. _110: https://github.com/giampaolo/psutil/issues/110
.. _111: https://github.com/giampaolo/psutil/issues/111
.. _112: https://github.com/giampaolo/psutil/issues/112
.. _113: https://github.com/giampaolo/psutil/issues/113
.. _114: https://github.com/giampaolo/psutil/issues/114
.. _115: https://github.com/giampaolo/psutil/issues/115
.. _116: https://github.com/giampaolo/psutil/issues/116
.. _117: https://github.com/giampaolo/psutil/issues/117
.. _118: https://github.com/giampaolo/psutil/issues/118
.. _119: https://github.com/giampaolo/psutil/issues/119
.. _120: https://github.com/giampaolo/psutil/issues/120
.. _121: https://github.com/giampaolo/psutil/issues/121
.. _122: https://github.com/giampaolo/psutil/issues/122
.. _123: https://github.com/giampaolo/psutil/issues/123
.. _124: https://github.com/giampaolo/psutil/issues/124
.. _125: https://github.com/giampaolo/psutil/issues/125
.. _126: https://github.com/giampaolo/psutil/issues/126
.. _127: https://github.com/giampaolo/psutil/issues/127
.. _128: https://github.com/giampaolo/psutil/issues/128
.. _129: https://github.com/giampaolo/psutil/issues/129
.. _130: https://github.com/giampaolo/psutil/issues/130
.. _131: https://github.com/giampaolo/psutil/issues/131
.. _132: https://github.com/giampaolo/psutil/issues/132
.. _133: https://github.com/giampaolo/psutil/issues/133
.. _134: https://github.com/giampaolo/psutil/issues/134
.. _135: https://github.com/giampaolo/psutil/issues/135
.. _136: https://github.com/giampaolo/psutil/issues/136
.. _137: https://github.com/giampaolo/psutil/issues/137
.. _138: https://github.com/giampaolo/psutil/issues/138
.. _139: https://github.com/giampaolo/psutil/issues/139
.. _140: https://github.com/giampaolo/psutil/issues/140
.. _141: https://github.com/giampaolo/psutil/issues/141
.. _142: https://github.com/giampaolo/psutil/issues/142
.. _143: https://github.com/giampaolo/psutil/issues/143
.. _144: https://github.com/giampaolo/psutil/issues/144
.. _145: https://github.com/giampaolo/psutil/issues/145
.. _146: https://github.com/giampaolo/psutil/issues/146
.. _147: https://github.com/giampaolo/psutil/issues/147
.. _148: https://github.com/giampaolo/psutil/issues/148
.. _149: https://github.com/giampaolo/psutil/issues/149
.. _150: https://github.com/giampaolo/psutil/issues/150
.. _151: https://github.com/giampaolo/psutil/issues/151
.. _152: https://github.com/giampaolo/psutil/issues/152
.. _153: https://github.com/giampaolo/psutil/issues/153
.. _154: https://github.com/giampaolo/psutil/issues/154
.. _155: https://github.com/giampaolo/psutil/issues/155
.. _156: https://github.com/giampaolo/psutil/issues/156
.. _157: https://github.com/giampaolo/psutil/issues/157
.. _158: https://github.com/giampaolo/psutil/issues/158
.. _159: https://github.com/giampaolo/psutil/issues/159
.. _160: https://github.com/giampaolo/psutil/issues/160
.. _161: https://github.com/giampaolo/psutil/issues/161
.. _162: https://github.com/giampaolo/psutil/issues/162
.. _163: https://github.com/giampaolo/psutil/issues/163
.. _164: https://github.com/giampaolo/psutil/issues/164
.. _165: https://github.com/giampaolo/psutil/issues/165
.. _166: https://github.com/giampaolo/psutil/issues/166
.. _167: https://github.com/giampaolo/psutil/issues/167
.. _168: https://github.com/giampaolo/psutil/issues/168
.. _169: https://github.com/giampaolo/psutil/issues/169
.. _170: https://github.com/giampaolo/psutil/issues/170
.. _171: https://github.com/giampaolo/psutil/issues/171
.. _172: https://github.com/giampaolo/psutil/issues/172
.. _173: https://github.com/giampaolo/psutil/issues/173
.. _174: https://github.com/giampaolo/psutil/issues/174
.. _175: https://github.com/giampaolo/psutil/issues/175
.. _176: https://github.com/giampaolo/psutil/issues/176
.. _177: https://github.com/giampaolo/psutil/issues/177
.. _178: https://github.com/giampaolo/psutil/issues/178
.. _179: https://github.com/giampaolo/psutil/issues/179
.. _180: https://github.com/giampaolo/psutil/issues/180
.. _181: https://github.com/giampaolo/psutil/issues/181
.. _182: https://github.com/giampaolo/psutil/issues/182
.. _183: https://github.com/giampaolo/psutil/issues/183
.. _184: https://github.com/giampaolo/psutil/issues/184
.. _185: https://github.com/giampaolo/psutil/issues/185
.. _186: https://github.com/giampaolo/psutil/issues/186
.. _187: https://github.com/giampaolo/psutil/issues/187
.. _188: https://github.com/giampaolo/psutil/issues/188
.. _189: https://github.com/giampaolo/psutil/issues/189
.. _190: https://github.com/giampaolo/psutil/issues/190
.. _191: https://github.com/giampaolo/psutil/issues/191
.. _192: https://github.com/giampaolo/psutil/issues/192
.. _193: https://github.com/giampaolo/psutil/issues/193
.. _194: https://github.com/giampaolo/psutil/issues/194
.. _195: https://github.com/giampaolo/psutil/issues/195
.. _196: https://github.com/giampaolo/psutil/issues/196
.. _197: https://github.com/giampaolo/psutil/issues/197
.. _198: https://github.com/giampaolo/psutil/issues/198
.. _199: https://github.com/giampaolo/psutil/issues/199
.. _200: https://github.com/giampaolo/psutil/issues/200
.. _201: https://github.com/giampaolo/psutil/issues/201
.. _202: https://github.com/giampaolo/psutil/issues/202
.. _203: https://github.com/giampaolo/psutil/issues/203
.. _204: https://github.com/giampaolo/psutil/issues/204
.. _205: https://github.com/giampaolo/psutil/issues/205
.. _206: https://github.com/giampaolo/psutil/issues/206
.. _207: https://github.com/giampaolo/psutil/issues/207
.. _208: https://github.com/giampaolo/psutil/issues/208
.. _209: https://github.com/giampaolo/psutil/issues/209
.. _210: https://github.com/giampaolo/psutil/issues/210
.. _211: https://github.com/giampaolo/psutil/issues/211
.. _212: https://github.com/giampaolo/psutil/issues/212
.. _213: https://github.com/giampaolo/psutil/issues/213
.. _214: https://github.com/giampaolo/psutil/issues/214
.. _215: https://github.com/giampaolo/psutil/issues/215
.. _216: https://github.com/giampaolo/psutil/issues/216
.. _217: https://github.com/giampaolo/psutil/issues/217
.. _218: https://github.com/giampaolo/psutil/issues/218
.. _219: https://github.com/giampaolo/psutil/issues/219
.. _220: https://github.com/giampaolo/psutil/issues/220
.. _221: https://github.com/giampaolo/psutil/issues/221
.. _222: https://github.com/giampaolo/psutil/issues/222
.. _223: https://github.com/giampaolo/psutil/issues/223
.. _224: https://github.com/giampaolo/psutil/issues/224
.. _225: https://github.com/giampaolo/psutil/issues/225
.. _226: https://github.com/giampaolo/psutil/issues/226
.. _227: https://github.com/giampaolo/psutil/issues/227
.. _228: https://github.com/giampaolo/psutil/issues/228
.. _229: https://github.com/giampaolo/psutil/issues/229
.. _230: https://github.com/giampaolo/psutil/issues/230
.. _231: https://github.com/giampaolo/psutil/issues/231
.. _232: https://github.com/giampaolo/psutil/issues/232
.. _233: https://github.com/giampaolo/psutil/issues/233
.. _234: https://github.com/giampaolo/psutil/issues/234
.. _235: https://github.com/giampaolo/psutil/issues/235
.. _236: https://github.com/giampaolo/psutil/issues/236
.. _237: https://github.com/giampaolo/psutil/issues/237
.. _238: https://github.com/giampaolo/psutil/issues/238
.. _239: https://github.com/giampaolo/psutil/issues/239
.. _240: https://github.com/giampaolo/psutil/issues/240
.. _241: https://github.com/giampaolo/psutil/issues/241
.. _242: https://github.com/giampaolo/psutil/issues/242
.. _243: https://github.com/giampaolo/psutil/issues/243
.. _244: https://github.com/giampaolo/psutil/issues/244
.. _245: https://github.com/giampaolo/psutil/issues/245
.. _246: https://github.com/giampaolo/psutil/issues/246
.. _247: https://github.com/giampaolo/psutil/issues/247
.. _248: https://github.com/giampaolo/psutil/issues/248
.. _249: https://github.com/giampaolo/psutil/issues/249
.. _250: https://github.com/giampaolo/psutil/issues/250
.. _251: https://github.com/giampaolo/psutil/issues/251
.. _252: https://github.com/giampaolo/psutil/issues/252
.. _253: https://github.com/giampaolo/psutil/issues/253
.. _254: https://github.com/giampaolo/psutil/issues/254
.. _255: https://github.com/giampaolo/psutil/issues/255
.. _256: https://github.com/giampaolo/psutil/issues/256
.. _257: https://github.com/giampaolo/psutil/issues/257
.. _258: https://github.com/giampaolo/psutil/issues/258
.. _259: https://github.com/giampaolo/psutil/issues/259
.. _260: https://github.com/giampaolo/psutil/issues/260
.. _261: https://github.com/giampaolo/psutil/issues/261
.. _262: https://github.com/giampaolo/psutil/issues/262
.. _263: https://github.com/giampaolo/psutil/issues/263
.. _264: https://github.com/giampaolo/psutil/issues/264
.. _265: https://github.com/giampaolo/psutil/issues/265
.. _266: https://github.com/giampaolo/psutil/issues/266
.. _267: https://github.com/giampaolo/psutil/issues/267
.. _268: https://github.com/giampaolo/psutil/issues/268
.. _269: https://github.com/giampaolo/psutil/issues/269
.. _270: https://github.com/giampaolo/psutil/issues/270
.. _271: https://github.com/giampaolo/psutil/issues/271
.. _272: https://github.com/giampaolo/psutil/issues/272
.. _273: https://github.com/giampaolo/psutil/issues/273
.. _274: https://github.com/giampaolo/psutil/issues/274
.. _275: https://github.com/giampaolo/psutil/issues/275
.. _276: https://github.com/giampaolo/psutil/issues/276
.. _277: https://github.com/giampaolo/psutil/issues/277
.. _278: https://github.com/giampaolo/psutil/issues/278
.. _279: https://github.com/giampaolo/psutil/issues/279
.. _280: https://github.com/giampaolo/psutil/issues/280
.. _281: https://github.com/giampaolo/psutil/issues/281
.. _282: https://github.com/giampaolo/psutil/issues/282
.. _283: https://github.com/giampaolo/psutil/issues/283
.. _284: https://github.com/giampaolo/psutil/issues/284
.. _285: https://github.com/giampaolo/psutil/issues/285
.. _286: https://github.com/giampaolo/psutil/issues/286
.. _287: https://github.com/giampaolo/psutil/issues/287
.. _288: https://github.com/giampaolo/psutil/issues/288
.. _289: https://github.com/giampaolo/psutil/issues/289
.. _290: https://github.com/giampaolo/psutil/issues/290
.. _291: https://github.com/giampaolo/psutil/issues/291
.. _292: https://github.com/giampaolo/psutil/issues/292
.. _293: https://github.com/giampaolo/psutil/issues/293
.. _294: https://github.com/giampaolo/psutil/issues/294
.. _295: https://github.com/giampaolo/psutil/issues/295
.. _296: https://github.com/giampaolo/psutil/issues/296
.. _297: https://github.com/giampaolo/psutil/issues/297
.. _298: https://github.com/giampaolo/psutil/issues/298
.. _299: https://github.com/giampaolo/psutil/issues/299
.. _300: https://github.com/giampaolo/psutil/issues/300
.. _301: https://github.com/giampaolo/psutil/issues/301
.. _302: https://github.com/giampaolo/psutil/issues/302
.. _303: https://github.com/giampaolo/psutil/issues/303
.. _304: https://github.com/giampaolo/psutil/issues/304
.. _305: https://github.com/giampaolo/psutil/issues/305
.. _306: https://github.com/giampaolo/psutil/issues/306
.. _307: https://github.com/giampaolo/psutil/issues/307
.. _308: https://github.com/giampaolo/psutil/issues/308
.. _309: https://github.com/giampaolo/psutil/issues/309
.. _310: https://github.com/giampaolo/psutil/issues/310
.. _311: https://github.com/giampaolo/psutil/issues/311
.. _312: https://github.com/giampaolo/psutil/issues/312
.. _313: https://github.com/giampaolo/psutil/issues/313
.. _314: https://github.com/giampaolo/psutil/issues/314
.. _315: https://github.com/giampaolo/psutil/issues/315
.. _316: https://github.com/giampaolo/psutil/issues/316
.. _317: https://github.com/giampaolo/psutil/issues/317
.. _318: https://github.com/giampaolo/psutil/issues/318
.. _319: https://github.com/giampaolo/psutil/issues/319
.. _320: https://github.com/giampaolo/psutil/issues/320
.. _321: https://github.com/giampaolo/psutil/issues/321
.. _322: https://github.com/giampaolo/psutil/issues/322
.. _323: https://github.com/giampaolo/psutil/issues/323
.. _324: https://github.com/giampaolo/psutil/issues/324
.. _325: https://github.com/giampaolo/psutil/issues/325
.. _326: https://github.com/giampaolo/psutil/issues/326
.. _327: https://github.com/giampaolo/psutil/issues/327
.. _328: https://github.com/giampaolo/psutil/issues/328
.. _329: https://github.com/giampaolo/psutil/issues/329
.. _330: https://github.com/giampaolo/psutil/issues/330
.. _331: https://github.com/giampaolo/psutil/issues/331
.. _332: https://github.com/giampaolo/psutil/issues/332
.. _333: https://github.com/giampaolo/psutil/issues/333
.. _334: https://github.com/giampaolo/psutil/issues/334
.. _335: https://github.com/giampaolo/psutil/issues/335
.. _336: https://github.com/giampaolo/psutil/issues/336
.. _337: https://github.com/giampaolo/psutil/issues/337
.. _338: https://github.com/giampaolo/psutil/issues/338
.. _339: https://github.com/giampaolo/psutil/issues/339
.. _340: https://github.com/giampaolo/psutil/issues/340
.. _341: https://github.com/giampaolo/psutil/issues/341
.. _342: https://github.com/giampaolo/psutil/issues/342
.. _343: https://github.com/giampaolo/psutil/issues/343
.. _344: https://github.com/giampaolo/psutil/issues/344
.. _345: https://github.com/giampaolo/psutil/issues/345
.. _346: https://github.com/giampaolo/psutil/issues/346
.. _347: https://github.com/giampaolo/psutil/issues/347
.. _348: https://github.com/giampaolo/psutil/issues/348
.. _349: https://github.com/giampaolo/psutil/issues/349
.. _350: https://github.com/giampaolo/psutil/issues/350
.. _351: https://github.com/giampaolo/psutil/issues/351
.. _352: https://github.com/giampaolo/psutil/issues/352
.. _353: https://github.com/giampaolo/psutil/issues/353
.. _354: https://github.com/giampaolo/psutil/issues/354
.. _355: https://github.com/giampaolo/psutil/issues/355
.. _356: https://github.com/giampaolo/psutil/issues/356
.. _357: https://github.com/giampaolo/psutil/issues/357
.. _358: https://github.com/giampaolo/psutil/issues/358
.. _359: https://github.com/giampaolo/psutil/issues/359
.. _360: https://github.com/giampaolo/psutil/issues/360
.. _361: https://github.com/giampaolo/psutil/issues/361
.. _362: https://github.com/giampaolo/psutil/issues/362
.. _363: https://github.com/giampaolo/psutil/issues/363
.. _364: https://github.com/giampaolo/psutil/issues/364
.. _365: https://github.com/giampaolo/psutil/issues/365
.. _366: https://github.com/giampaolo/psutil/issues/366
.. _367: https://github.com/giampaolo/psutil/issues/367
.. _368: https://github.com/giampaolo/psutil/issues/368
.. _369: https://github.com/giampaolo/psutil/issues/369
.. _370: https://github.com/giampaolo/psutil/issues/370
.. _371: https://github.com/giampaolo/psutil/issues/371
.. _372: https://github.com/giampaolo/psutil/issues/372
.. _373: https://github.com/giampaolo/psutil/issues/373
.. _374: https://github.com/giampaolo/psutil/issues/374
.. _375: https://github.com/giampaolo/psutil/issues/375
.. _376: https://github.com/giampaolo/psutil/issues/376
.. _377: https://github.com/giampaolo/psutil/issues/377
.. _378: https://github.com/giampaolo/psutil/issues/378
.. _379: https://github.com/giampaolo/psutil/issues/379
.. _380: https://github.com/giampaolo/psutil/issues/380
.. _381: https://github.com/giampaolo/psutil/issues/381
.. _382: https://github.com/giampaolo/psutil/issues/382
.. _383: https://github.com/giampaolo/psutil/issues/383
.. _384: https://github.com/giampaolo/psutil/issues/384
.. _385: https://github.com/giampaolo/psutil/issues/385
.. _386: https://github.com/giampaolo/psutil/issues/386
.. _387: https://github.com/giampaolo/psutil/issues/387
.. _388: https://github.com/giampaolo/psutil/issues/388
.. _389: https://github.com/giampaolo/psutil/issues/389
.. _390: https://github.com/giampaolo/psutil/issues/390
.. _391: https://github.com/giampaolo/psutil/issues/391
.. _392: https://github.com/giampaolo/psutil/issues/392
.. _393: https://github.com/giampaolo/psutil/issues/393
.. _394: https://github.com/giampaolo/psutil/issues/394
.. _395: https://github.com/giampaolo/psutil/issues/395
.. _396: https://github.com/giampaolo/psutil/issues/396
.. _397: https://github.com/giampaolo/psutil/issues/397
.. _398: https://github.com/giampaolo/psutil/issues/398
.. _399: https://github.com/giampaolo/psutil/issues/399
.. _400: https://github.com/giampaolo/psutil/issues/400
.. _401: https://github.com/giampaolo/psutil/issues/401
.. _402: https://github.com/giampaolo/psutil/issues/402
.. _403: https://github.com/giampaolo/psutil/issues/403
.. _404: https://github.com/giampaolo/psutil/issues/404
.. _405: https://github.com/giampaolo/psutil/issues/405
.. _406: https://github.com/giampaolo/psutil/issues/406
.. _407: https://github.com/giampaolo/psutil/issues/407
.. _408: https://github.com/giampaolo/psutil/issues/408
.. _409: https://github.com/giampaolo/psutil/issues/409
.. _410: https://github.com/giampaolo/psutil/issues/410
.. _411: https://github.com/giampaolo/psutil/issues/411
.. _412: https://github.com/giampaolo/psutil/issues/412
.. _413: https://github.com/giampaolo/psutil/issues/413
.. _414: https://github.com/giampaolo/psutil/issues/414
.. _415: https://github.com/giampaolo/psutil/issues/415
.. _416: https://github.com/giampaolo/psutil/issues/416
.. _417: https://github.com/giampaolo/psutil/issues/417
.. _418: https://github.com/giampaolo/psutil/issues/418
.. _419: https://github.com/giampaolo/psutil/issues/419
.. _420: https://github.com/giampaolo/psutil/issues/420
.. _421: https://github.com/giampaolo/psutil/issues/421
.. _422: https://github.com/giampaolo/psutil/issues/422
.. _423: https://github.com/giampaolo/psutil/issues/423
.. _424: https://github.com/giampaolo/psutil/issues/424
.. _425: https://github.com/giampaolo/psutil/issues/425
.. _426: https://github.com/giampaolo/psutil/issues/426
.. _427: https://github.com/giampaolo/psutil/issues/427
.. _428: https://github.com/giampaolo/psutil/issues/428
.. _429: https://github.com/giampaolo/psutil/issues/429
.. _430: https://github.com/giampaolo/psutil/issues/430
.. _431: https://github.com/giampaolo/psutil/issues/431
.. _432: https://github.com/giampaolo/psutil/issues/432
.. _433: https://github.com/giampaolo/psutil/issues/433
.. _434: https://github.com/giampaolo/psutil/issues/434
.. _435: https://github.com/giampaolo/psutil/issues/435
.. _436: https://github.com/giampaolo/psutil/issues/436
.. _437: https://github.com/giampaolo/psutil/issues/437
.. _438: https://github.com/giampaolo/psutil/issues/438
.. _439: https://github.com/giampaolo/psutil/issues/439
.. _440: https://github.com/giampaolo/psutil/issues/440
.. _441: https://github.com/giampaolo/psutil/issues/441
.. _442: https://github.com/giampaolo/psutil/issues/442
.. _443: https://github.com/giampaolo/psutil/issues/443
.. _444: https://github.com/giampaolo/psutil/issues/444
.. _445: https://github.com/giampaolo/psutil/issues/445
.. _446: https://github.com/giampaolo/psutil/issues/446
.. _447: https://github.com/giampaolo/psutil/issues/447
.. _448: https://github.com/giampaolo/psutil/issues/448
.. _449: https://github.com/giampaolo/psutil/issues/449
.. _450: https://github.com/giampaolo/psutil/issues/450
.. _451: https://github.com/giampaolo/psutil/issues/451
.. _452: https://github.com/giampaolo/psutil/issues/452
.. _453: https://github.com/giampaolo/psutil/issues/453
.. _454: https://github.com/giampaolo/psutil/issues/454
.. _455: https://github.com/giampaolo/psutil/issues/455
.. _456: https://github.com/giampaolo/psutil/issues/456
.. _457: https://github.com/giampaolo/psutil/issues/457
.. _458: https://github.com/giampaolo/psutil/issues/458
.. _459: https://github.com/giampaolo/psutil/issues/459
.. _460: https://github.com/giampaolo/psutil/issues/460
.. _461: https://github.com/giampaolo/psutil/issues/461
.. _462: https://github.com/giampaolo/psutil/issues/462
.. _463: https://github.com/giampaolo/psutil/issues/463
.. _464: https://github.com/giampaolo/psutil/issues/464
.. _465: https://github.com/giampaolo/psutil/issues/465
.. _466: https://github.com/giampaolo/psutil/issues/466
.. _467: https://github.com/giampaolo/psutil/issues/467
.. _468: https://github.com/giampaolo/psutil/issues/468
.. _469: https://github.com/giampaolo/psutil/issues/469
.. _470: https://github.com/giampaolo/psutil/issues/470
.. _471: https://github.com/giampaolo/psutil/issues/471
.. _472: https://github.com/giampaolo/psutil/issues/472
.. _473: https://github.com/giampaolo/psutil/issues/473
.. _474: https://github.com/giampaolo/psutil/issues/474
.. _475: https://github.com/giampaolo/psutil/issues/475
.. _476: https://github.com/giampaolo/psutil/issues/476
.. _477: https://github.com/giampaolo/psutil/issues/477
.. _478: https://github.com/giampaolo/psutil/issues/478
.. _479: https://github.com/giampaolo/psutil/issues/479
.. _480: https://github.com/giampaolo/psutil/issues/480
.. _481: https://github.com/giampaolo/psutil/issues/481
.. _482: https://github.com/giampaolo/psutil/issues/482
.. _483: https://github.com/giampaolo/psutil/issues/483
.. _484: https://github.com/giampaolo/psutil/issues/484
.. _485: https://github.com/giampaolo/psutil/issues/485
.. _486: https://github.com/giampaolo/psutil/issues/486
.. _487: https://github.com/giampaolo/psutil/issues/487
.. _488: https://github.com/giampaolo/psutil/issues/488
.. _489: https://github.com/giampaolo/psutil/issues/489
.. _490: https://github.com/giampaolo/psutil/issues/490
.. _491: https://github.com/giampaolo/psutil/issues/491
.. _492: https://github.com/giampaolo/psutil/issues/492
.. _493: https://github.com/giampaolo/psutil/issues/493
.. _494: https://github.com/giampaolo/psutil/issues/494
.. _495: https://github.com/giampaolo/psutil/issues/495
.. _496: https://github.com/giampaolo/psutil/issues/496
.. _497: https://github.com/giampaolo/psutil/issues/497
.. _498: https://github.com/giampaolo/psutil/issues/498
.. _499: https://github.com/giampaolo/psutil/issues/499
.. _500: https://github.com/giampaolo/psutil/issues/500
.. _501: https://github.com/giampaolo/psutil/issues/501
.. _502: https://github.com/giampaolo/psutil/issues/502
.. _503: https://github.com/giampaolo/psutil/issues/503
.. _504: https://github.com/giampaolo/psutil/issues/504
.. _505: https://github.com/giampaolo/psutil/issues/505
.. _506: https://github.com/giampaolo/psutil/issues/506
.. _507: https://github.com/giampaolo/psutil/issues/507
.. _508: https://github.com/giampaolo/psutil/issues/508
.. _509: https://github.com/giampaolo/psutil/issues/509
.. _510: https://github.com/giampaolo/psutil/issues/510
.. _511: https://github.com/giampaolo/psutil/issues/511
.. _512: https://github.com/giampaolo/psutil/issues/512
.. _513: https://github.com/giampaolo/psutil/issues/513
.. _514: https://github.com/giampaolo/psutil/issues/514
.. _515: https://github.com/giampaolo/psutil/issues/515
.. _516: https://github.com/giampaolo/psutil/issues/516
.. _517: https://github.com/giampaolo/psutil/issues/517
.. _518: https://github.com/giampaolo/psutil/issues/518
.. _519: https://github.com/giampaolo/psutil/issues/519
.. _520: https://github.com/giampaolo/psutil/issues/520
.. _521: https://github.com/giampaolo/psutil/issues/521
.. _522: https://github.com/giampaolo/psutil/issues/522
.. _523: https://github.com/giampaolo/psutil/issues/523
.. _524: https://github.com/giampaolo/psutil/issues/524
.. _525: https://github.com/giampaolo/psutil/issues/525
.. _526: https://github.com/giampaolo/psutil/issues/526
.. _527: https://github.com/giampaolo/psutil/issues/527
.. _528: https://github.com/giampaolo/psutil/issues/528
.. _529: https://github.com/giampaolo/psutil/issues/529
.. _530: https://github.com/giampaolo/psutil/issues/530
.. _531: https://github.com/giampaolo/psutil/issues/531
.. _532: https://github.com/giampaolo/psutil/issues/532
.. _533: https://github.com/giampaolo/psutil/issues/533
.. _534: https://github.com/giampaolo/psutil/issues/534
.. _535: https://github.com/giampaolo/psutil/issues/535
.. _536: https://github.com/giampaolo/psutil/issues/536
.. _537: https://github.com/giampaolo/psutil/issues/537
.. _538: https://github.com/giampaolo/psutil/issues/538
.. _539: https://github.com/giampaolo/psutil/issues/539
.. _540: https://github.com/giampaolo/psutil/issues/540
.. _541: https://github.com/giampaolo/psutil/issues/541
.. _542: https://github.com/giampaolo/psutil/issues/542
.. _543: https://github.com/giampaolo/psutil/issues/543
.. _544: https://github.com/giampaolo/psutil/issues/544
.. _545: https://github.com/giampaolo/psutil/issues/545
.. _546: https://github.com/giampaolo/psutil/issues/546
.. _547: https://github.com/giampaolo/psutil/issues/547
.. _548: https://github.com/giampaolo/psutil/issues/548
.. _549: https://github.com/giampaolo/psutil/issues/549
.. _550: https://github.com/giampaolo/psutil/issues/550
.. _551: https://github.com/giampaolo/psutil/issues/551
.. _552: https://github.com/giampaolo/psutil/issues/552
.. _553: https://github.com/giampaolo/psutil/issues/553
.. _554: https://github.com/giampaolo/psutil/issues/554
.. _555: https://github.com/giampaolo/psutil/issues/555
.. _556: https://github.com/giampaolo/psutil/issues/556
.. _557: https://github.com/giampaolo/psutil/issues/557
.. _558: https://github.com/giampaolo/psutil/issues/558
.. _559: https://github.com/giampaolo/psutil/issues/559
.. _560: https://github.com/giampaolo/psutil/issues/560
.. _561: https://github.com/giampaolo/psutil/issues/561
.. _562: https://github.com/giampaolo/psutil/issues/562
.. _563: https://github.com/giampaolo/psutil/issues/563
.. _564: https://github.com/giampaolo/psutil/issues/564
.. _565: https://github.com/giampaolo/psutil/issues/565
.. _566: https://github.com/giampaolo/psutil/issues/566
.. _567: https://github.com/giampaolo/psutil/issues/567
.. _568: https://github.com/giampaolo/psutil/issues/568
.. _569: https://github.com/giampaolo/psutil/issues/569
.. _570: https://github.com/giampaolo/psutil/issues/570
.. _571: https://github.com/giampaolo/psutil/issues/571
.. _572: https://github.com/giampaolo/psutil/issues/572
.. _573: https://github.com/giampaolo/psutil/issues/573
.. _574: https://github.com/giampaolo/psutil/issues/574
.. _575: https://github.com/giampaolo/psutil/issues/575
.. _576: https://github.com/giampaolo/psutil/issues/576
.. _577: https://github.com/giampaolo/psutil/issues/577
.. _578: https://github.com/giampaolo/psutil/issues/578
.. _579: https://github.com/giampaolo/psutil/issues/579
.. _580: https://github.com/giampaolo/psutil/issues/580
.. _581: https://github.com/giampaolo/psutil/issues/581
.. _582: https://github.com/giampaolo/psutil/issues/582
.. _583: https://github.com/giampaolo/psutil/issues/583
.. _584: https://github.com/giampaolo/psutil/issues/584
.. _585: https://github.com/giampaolo/psutil/issues/585
.. _586: https://github.com/giampaolo/psutil/issues/586
.. _587: https://github.com/giampaolo/psutil/issues/587
.. _588: https://github.com/giampaolo/psutil/issues/588
.. _589: https://github.com/giampaolo/psutil/issues/589
.. _590: https://github.com/giampaolo/psutil/issues/590
.. _591: https://github.com/giampaolo/psutil/issues/591
.. _592: https://github.com/giampaolo/psutil/issues/592
.. _593: https://github.com/giampaolo/psutil/issues/593
.. _594: https://github.com/giampaolo/psutil/issues/594
.. _595: https://github.com/giampaolo/psutil/issues/595
.. _596: https://github.com/giampaolo/psutil/issues/596
.. _597: https://github.com/giampaolo/psutil/issues/597
.. _598: https://github.com/giampaolo/psutil/issues/598
.. _599: https://github.com/giampaolo/psutil/issues/599
.. _600: https://github.com/giampaolo/psutil/issues/600
.. _601: https://github.com/giampaolo/psutil/issues/601
.. _602: https://github.com/giampaolo/psutil/issues/602
.. _603: https://github.com/giampaolo/psutil/issues/603
.. _604: https://github.com/giampaolo/psutil/issues/604
.. _605: https://github.com/giampaolo/psutil/issues/605
.. _606: https://github.com/giampaolo/psutil/issues/606
.. _607: https://github.com/giampaolo/psutil/issues/607
.. _608: https://github.com/giampaolo/psutil/issues/608
.. _609: https://github.com/giampaolo/psutil/issues/609
.. _610: https://github.com/giampaolo/psutil/issues/610
.. _611: https://github.com/giampaolo/psutil/issues/611
.. _612: https://github.com/giampaolo/psutil/issues/612
.. _613: https://github.com/giampaolo/psutil/issues/613
.. _614: https://github.com/giampaolo/psutil/issues/614
.. _615: https://github.com/giampaolo/psutil/issues/615
.. _616: https://github.com/giampaolo/psutil/issues/616
.. _617: https://github.com/giampaolo/psutil/issues/617
.. _618: https://github.com/giampaolo/psutil/issues/618
.. _619: https://github.com/giampaolo/psutil/issues/619
.. _620: https://github.com/giampaolo/psutil/issues/620
.. _621: https://github.com/giampaolo/psutil/issues/621
.. _622: https://github.com/giampaolo/psutil/issues/622
.. _623: https://github.com/giampaolo/psutil/issues/623
.. _624: https://github.com/giampaolo/psutil/issues/624
.. _625: https://github.com/giampaolo/psutil/issues/625
.. _626: https://github.com/giampaolo/psutil/issues/626
.. _627: https://github.com/giampaolo/psutil/issues/627
.. _628: https://github.com/giampaolo/psutil/issues/628
.. _629: https://github.com/giampaolo/psutil/issues/629
.. _630: https://github.com/giampaolo/psutil/issues/630
.. _631: https://github.com/giampaolo/psutil/issues/631
.. _632: https://github.com/giampaolo/psutil/issues/632
.. _633: https://github.com/giampaolo/psutil/issues/633
.. _634: https://github.com/giampaolo/psutil/issues/634
.. _635: https://github.com/giampaolo/psutil/issues/635
.. _636: https://github.com/giampaolo/psutil/issues/636
.. _637: https://github.com/giampaolo/psutil/issues/637
.. _638: https://github.com/giampaolo/psutil/issues/638
.. _639: https://github.com/giampaolo/psutil/issues/639
.. _640: https://github.com/giampaolo/psutil/issues/640
.. _641: https://github.com/giampaolo/psutil/issues/641
.. _642: https://github.com/giampaolo/psutil/issues/642
.. _643: https://github.com/giampaolo/psutil/issues/643
.. _644: https://github.com/giampaolo/psutil/issues/644
.. _645: https://github.com/giampaolo/psutil/issues/645
.. _646: https://github.com/giampaolo/psutil/issues/646
.. _647: https://github.com/giampaolo/psutil/issues/647
.. _648: https://github.com/giampaolo/psutil/issues/648
.. _649: https://github.com/giampaolo/psutil/issues/649
.. _650: https://github.com/giampaolo/psutil/issues/650
.. _651: https://github.com/giampaolo/psutil/issues/651
.. _652: https://github.com/giampaolo/psutil/issues/652
.. _653: https://github.com/giampaolo/psutil/issues/653
.. _654: https://github.com/giampaolo/psutil/issues/654
.. _655: https://github.com/giampaolo/psutil/issues/655
.. _656: https://github.com/giampaolo/psutil/issues/656
.. _657: https://github.com/giampaolo/psutil/issues/657
.. _658: https://github.com/giampaolo/psutil/issues/658
.. _659: https://github.com/giampaolo/psutil/issues/659
.. _660: https://github.com/giampaolo/psutil/issues/660
.. _661: https://github.com/giampaolo/psutil/issues/661
.. _662: https://github.com/giampaolo/psutil/issues/662
.. _663: https://github.com/giampaolo/psutil/issues/663
.. _664: https://github.com/giampaolo/psutil/issues/664
.. _665: https://github.com/giampaolo/psutil/issues/665
.. _666: https://github.com/giampaolo/psutil/issues/666
.. _667: https://github.com/giampaolo/psutil/issues/667
.. _668: https://github.com/giampaolo/psutil/issues/668
.. _669: https://github.com/giampaolo/psutil/issues/669
.. _670: https://github.com/giampaolo/psutil/issues/670
.. _671: https://github.com/giampaolo/psutil/issues/671
.. _672: https://github.com/giampaolo/psutil/issues/672
.. _673: https://github.com/giampaolo/psutil/issues/673
.. _674: https://github.com/giampaolo/psutil/issues/674
.. _675: https://github.com/giampaolo/psutil/issues/675
.. _676: https://github.com/giampaolo/psutil/issues/676
.. _677: https://github.com/giampaolo/psutil/issues/677
.. _678: https://github.com/giampaolo/psutil/issues/678
.. _679: https://github.com/giampaolo/psutil/issues/679
.. _680: https://github.com/giampaolo/psutil/issues/680
.. _681: https://github.com/giampaolo/psutil/issues/681
.. _682: https://github.com/giampaolo/psutil/issues/682
.. _683: https://github.com/giampaolo/psutil/issues/683
.. _684: https://github.com/giampaolo/psutil/issues/684
.. _685: https://github.com/giampaolo/psutil/issues/685
.. _686: https://github.com/giampaolo/psutil/issues/686
.. _687: https://github.com/giampaolo/psutil/issues/687
.. _688: https://github.com/giampaolo/psutil/issues/688
.. _689: https://github.com/giampaolo/psutil/issues/689
.. _690: https://github.com/giampaolo/psutil/issues/690
.. _691: https://github.com/giampaolo/psutil/issues/691
.. _692: https://github.com/giampaolo/psutil/issues/692
.. _693: https://github.com/giampaolo/psutil/issues/693
.. _694: https://github.com/giampaolo/psutil/issues/694
.. _695: https://github.com/giampaolo/psutil/issues/695
.. _696: https://github.com/giampaolo/psutil/issues/696
.. _697: https://github.com/giampaolo/psutil/issues/697
.. _698: https://github.com/giampaolo/psutil/issues/698
.. _699: https://github.com/giampaolo/psutil/issues/699
.. _700: https://github.com/giampaolo/psutil/issues/700
.. _701: https://github.com/giampaolo/psutil/issues/701
.. _702: https://github.com/giampaolo/psutil/issues/702
.. _703: https://github.com/giampaolo/psutil/issues/703
.. _704: https://github.com/giampaolo/psutil/issues/704
.. _705: https://github.com/giampaolo/psutil/issues/705
.. _706: https://github.com/giampaolo/psutil/issues/706
.. _707: https://github.com/giampaolo/psutil/issues/707
.. _708: https://github.com/giampaolo/psutil/issues/708
.. _709: https://github.com/giampaolo/psutil/issues/709
.. _710: https://github.com/giampaolo/psutil/issues/710
.. _711: https://github.com/giampaolo/psutil/issues/711
.. _712: https://github.com/giampaolo/psutil/issues/712
.. _713: https://github.com/giampaolo/psutil/issues/713
.. _714: https://github.com/giampaolo/psutil/issues/714
.. _715: https://github.com/giampaolo/psutil/issues/715
.. _716: https://github.com/giampaolo/psutil/issues/716
.. _717: https://github.com/giampaolo/psutil/issues/717
.. _718: https://github.com/giampaolo/psutil/issues/718
.. _719: https://github.com/giampaolo/psutil/issues/719
.. _720: https://github.com/giampaolo/psutil/issues/720
.. _721: https://github.com/giampaolo/psutil/issues/721
.. _722: https://github.com/giampaolo/psutil/issues/722
.. _723: https://github.com/giampaolo/psutil/issues/723
.. _724: https://github.com/giampaolo/psutil/issues/724
.. _725: https://github.com/giampaolo/psutil/issues/725
.. _726: https://github.com/giampaolo/psutil/issues/726
.. _727: https://github.com/giampaolo/psutil/issues/727
.. _728: https://github.com/giampaolo/psutil/issues/728
.. _729: https://github.com/giampaolo/psutil/issues/729
.. _730: https://github.com/giampaolo/psutil/issues/730
.. _731: https://github.com/giampaolo/psutil/issues/731
.. _732: https://github.com/giampaolo/psutil/issues/732
.. _733: https://github.com/giampaolo/psutil/issues/733
.. _734: https://github.com/giampaolo/psutil/issues/734
.. _735: https://github.com/giampaolo/psutil/issues/735
.. _736: https://github.com/giampaolo/psutil/issues/736
.. _737: https://github.com/giampaolo/psutil/issues/737
.. _738: https://github.com/giampaolo/psutil/issues/738
.. _739: https://github.com/giampaolo/psutil/issues/739
.. _740: https://github.com/giampaolo/psutil/issues/740
.. _741: https://github.com/giampaolo/psutil/issues/741
.. _742: https://github.com/giampaolo/psutil/issues/742
.. _743: https://github.com/giampaolo/psutil/issues/743
.. _744: https://github.com/giampaolo/psutil/issues/744
.. _745: https://github.com/giampaolo/psutil/issues/745
.. _746: https://github.com/giampaolo/psutil/issues/746
.. _747: https://github.com/giampaolo/psutil/issues/747
.. _748: https://github.com/giampaolo/psutil/issues/748
.. _749: https://github.com/giampaolo/psutil/issues/749
.. _750: https://github.com/giampaolo/psutil/issues/750
.. _751: https://github.com/giampaolo/psutil/issues/751
.. _752: https://github.com/giampaolo/psutil/issues/752
.. _753: https://github.com/giampaolo/psutil/issues/753
.. _754: https://github.com/giampaolo/psutil/issues/754
.. _755: https://github.com/giampaolo/psutil/issues/755
.. _756: https://github.com/giampaolo/psutil/issues/756
.. _757: https://github.com/giampaolo/psutil/issues/757
.. _758: https://github.com/giampaolo/psutil/issues/758
.. _759: https://github.com/giampaolo/psutil/issues/759
.. _760: https://github.com/giampaolo/psutil/issues/760
.. _761: https://github.com/giampaolo/psutil/issues/761
.. _762: https://github.com/giampaolo/psutil/issues/762
.. _763: https://github.com/giampaolo/psutil/issues/763
.. _764: https://github.com/giampaolo/psutil/issues/764
.. _765: https://github.com/giampaolo/psutil/issues/765
.. _766: https://github.com/giampaolo/psutil/issues/766
.. _767: https://github.com/giampaolo/psutil/issues/767
.. _768: https://github.com/giampaolo/psutil/issues/768
.. _769: https://github.com/giampaolo/psutil/issues/769
.. _770: https://github.com/giampaolo/psutil/issues/770
.. _771: https://github.com/giampaolo/psutil/issues/771
.. _772: https://github.com/giampaolo/psutil/issues/772
.. _773: https://github.com/giampaolo/psutil/issues/773
.. _774: https://github.com/giampaolo/psutil/issues/774
.. _775: https://github.com/giampaolo/psutil/issues/775
.. _776: https://github.com/giampaolo/psutil/issues/776
.. _777: https://github.com/giampaolo/psutil/issues/777
.. _778: https://github.com/giampaolo/psutil/issues/778
.. _779: https://github.com/giampaolo/psutil/issues/779
.. _780: https://github.com/giampaolo/psutil/issues/780
.. _781: https://github.com/giampaolo/psutil/issues/781
.. _782: https://github.com/giampaolo/psutil/issues/782
.. _783: https://github.com/giampaolo/psutil/issues/783
.. _784: https://github.com/giampaolo/psutil/issues/784
.. _785: https://github.com/giampaolo/psutil/issues/785
.. _786: https://github.com/giampaolo/psutil/issues/786
.. _787: https://github.com/giampaolo/psutil/issues/787
.. _788: https://github.com/giampaolo/psutil/issues/788
.. _789: https://github.com/giampaolo/psutil/issues/789
.. _790: https://github.com/giampaolo/psutil/issues/790
.. _791: https://github.com/giampaolo/psutil/issues/791
.. _792: https://github.com/giampaolo/psutil/issues/792
.. _793: https://github.com/giampaolo/psutil/issues/793
.. _794: https://github.com/giampaolo/psutil/issues/794
.. _795: https://github.com/giampaolo/psutil/issues/795
.. _796: https://github.com/giampaolo/psutil/issues/796
.. _797: https://github.com/giampaolo/psutil/issues/797
.. _798: https://github.com/giampaolo/psutil/issues/798
.. _799: https://github.com/giampaolo/psutil/issues/799
.. _800: https://github.com/giampaolo/psutil/issues/800
.. _801: https://github.com/giampaolo/psutil/issues/801
.. _802: https://github.com/giampaolo/psutil/issues/802
.. _803: https://github.com/giampaolo/psutil/issues/803
.. _804: https://github.com/giampaolo/psutil/issues/804
.. _805: https://github.com/giampaolo/psutil/issues/805
.. _806: https://github.com/giampaolo/psutil/issues/806
.. _807: https://github.com/giampaolo/psutil/issues/807
.. _808: https://github.com/giampaolo/psutil/issues/808
.. _809: https://github.com/giampaolo/psutil/issues/809
.. _810: https://github.com/giampaolo/psutil/issues/810
.. _811: https://github.com/giampaolo/psutil/issues/811
.. _812: https://github.com/giampaolo/psutil/issues/812
.. _813: https://github.com/giampaolo/psutil/issues/813
.. _814: https://github.com/giampaolo/psutil/issues/814
.. _815: https://github.com/giampaolo/psutil/issues/815
.. _816: https://github.com/giampaolo/psutil/issues/816
.. _817: https://github.com/giampaolo/psutil/issues/817
.. _818: https://github.com/giampaolo/psutil/issues/818
.. _819: https://github.com/giampaolo/psutil/issues/819
.. _820: https://github.com/giampaolo/psutil/issues/820
.. _821: https://github.com/giampaolo/psutil/issues/821
.. _822: https://github.com/giampaolo/psutil/issues/822
.. _823: https://github.com/giampaolo/psutil/issues/823
.. _824: https://github.com/giampaolo/psutil/issues/824
.. _825: https://github.com/giampaolo/psutil/issues/825
.. _826: https://github.com/giampaolo/psutil/issues/826
.. _827: https://github.com/giampaolo/psutil/issues/827
.. _828: https://github.com/giampaolo/psutil/issues/828
.. _829: https://github.com/giampaolo/psutil/issues/829
.. _830: https://github.com/giampaolo/psutil/issues/830
.. _831: https://github.com/giampaolo/psutil/issues/831
.. _832: https://github.com/giampaolo/psutil/issues/832
.. _833: https://github.com/giampaolo/psutil/issues/833
.. _834: https://github.com/giampaolo/psutil/issues/834
.. _835: https://github.com/giampaolo/psutil/issues/835
.. _836: https://github.com/giampaolo/psutil/issues/836
.. _837: https://github.com/giampaolo/psutil/issues/837
.. _838: https://github.com/giampaolo/psutil/issues/838
.. _839: https://github.com/giampaolo/psutil/issues/839
.. _840: https://github.com/giampaolo/psutil/issues/840
.. _841: https://github.com/giampaolo/psutil/issues/841
.. _842: https://github.com/giampaolo/psutil/issues/842
.. _843: https://github.com/giampaolo/psutil/issues/843
.. _844: https://github.com/giampaolo/psutil/issues/844
.. _845: https://github.com/giampaolo/psutil/issues/845
.. _846: https://github.com/giampaolo/psutil/issues/846
.. _847: https://github.com/giampaolo/psutil/issues/847
.. _848: https://github.com/giampaolo/psutil/issues/848
.. _849: https://github.com/giampaolo/psutil/issues/849
.. _850: https://github.com/giampaolo/psutil/issues/850
.. _851: https://github.com/giampaolo/psutil/issues/851
.. _852: https://github.com/giampaolo/psutil/issues/852
.. _853: https://github.com/giampaolo/psutil/issues/853
.. _854: https://github.com/giampaolo/psutil/issues/854
.. _855: https://github.com/giampaolo/psutil/issues/855
.. _856: https://github.com/giampaolo/psutil/issues/856
.. _857: https://github.com/giampaolo/psutil/issues/857
.. _858: https://github.com/giampaolo/psutil/issues/858
.. _859: https://github.com/giampaolo/psutil/issues/859
.. _860: https://github.com/giampaolo/psutil/issues/860
.. _861: https://github.com/giampaolo/psutil/issues/861
.. _862: https://github.com/giampaolo/psutil/issues/862
.. _863: https://github.com/giampaolo/psutil/issues/863
.. _864: https://github.com/giampaolo/psutil/issues/864
.. _865: https://github.com/giampaolo/psutil/issues/865
.. _866: https://github.com/giampaolo/psutil/issues/866
.. _867: https://github.com/giampaolo/psutil/issues/867
.. _868: https://github.com/giampaolo/psutil/issues/868
.. _869: https://github.com/giampaolo/psutil/issues/869
.. _870: https://github.com/giampaolo/psutil/issues/870
.. _871: https://github.com/giampaolo/psutil/issues/871
.. _872: https://github.com/giampaolo/psutil/issues/872
.. _873: https://github.com/giampaolo/psutil/issues/873
.. _874: https://github.com/giampaolo/psutil/issues/874
.. _875: https://github.com/giampaolo/psutil/issues/875
.. _876: https://github.com/giampaolo/psutil/issues/876
.. _877: https://github.com/giampaolo/psutil/issues/877
.. _878: https://github.com/giampaolo/psutil/issues/878
.. _879: https://github.com/giampaolo/psutil/issues/879
.. _880: https://github.com/giampaolo/psutil/issues/880
.. _881: https://github.com/giampaolo/psutil/issues/881
.. _882: https://github.com/giampaolo/psutil/issues/882
.. _883: https://github.com/giampaolo/psutil/issues/883
.. _884: https://github.com/giampaolo/psutil/issues/884
.. _885: https://github.com/giampaolo/psutil/issues/885
.. _886: https://github.com/giampaolo/psutil/issues/886
.. _887: https://github.com/giampaolo/psutil/issues/887
.. _888: https://github.com/giampaolo/psutil/issues/888
.. _889: https://github.com/giampaolo/psutil/issues/889
.. _890: https://github.com/giampaolo/psutil/issues/890
.. _891: https://github.com/giampaolo/psutil/issues/891
.. _892: https://github.com/giampaolo/psutil/issues/892
.. _893: https://github.com/giampaolo/psutil/issues/893
.. _894: https://github.com/giampaolo/psutil/issues/894
.. _895: https://github.com/giampaolo/psutil/issues/895
.. _896: https://github.com/giampaolo/psutil/issues/896
.. _897: https://github.com/giampaolo/psutil/issues/897
.. _898: https://github.com/giampaolo/psutil/issues/898
.. _899: https://github.com/giampaolo/psutil/issues/899
.. _900: https://github.com/giampaolo/psutil/issues/900
.. _901: https://github.com/giampaolo/psutil/issues/901
.. _902: https://github.com/giampaolo/psutil/issues/902
.. _903: https://github.com/giampaolo/psutil/issues/903
.. _904: https://github.com/giampaolo/psutil/issues/904
.. _905: https://github.com/giampaolo/psutil/issues/905
.. _906: https://github.com/giampaolo/psutil/issues/906
.. _907: https://github.com/giampaolo/psutil/issues/907
.. _908: https://github.com/giampaolo/psutil/issues/908
.. _909: https://github.com/giampaolo/psutil/issues/909
.. _910: https://github.com/giampaolo/psutil/issues/910
.. _911: https://github.com/giampaolo/psutil/issues/911
.. _912: https://github.com/giampaolo/psutil/issues/912
.. _913: https://github.com/giampaolo/psutil/issues/913
.. _914: https://github.com/giampaolo/psutil/issues/914
.. _915: https://github.com/giampaolo/psutil/issues/915
.. _916: https://github.com/giampaolo/psutil/issues/916
.. _917: https://github.com/giampaolo/psutil/issues/917
.. _918: https://github.com/giampaolo/psutil/issues/918
.. _919: https://github.com/giampaolo/psutil/issues/919
.. _920: https://github.com/giampaolo/psutil/issues/920
.. _921: https://github.com/giampaolo/psutil/issues/921
.. _922: https://github.com/giampaolo/psutil/issues/922
.. _923: https://github.com/giampaolo/psutil/issues/923
.. _924: https://github.com/giampaolo/psutil/issues/924
.. _925: https://github.com/giampaolo/psutil/issues/925
.. _926: https://github.com/giampaolo/psutil/issues/926
.. _927: https://github.com/giampaolo/psutil/issues/927
.. _928: https://github.com/giampaolo/psutil/issues/928
.. _929: https://github.com/giampaolo/psutil/issues/929
.. _930: https://github.com/giampaolo/psutil/issues/930
.. _931: https://github.com/giampaolo/psutil/issues/931
.. _932: https://github.com/giampaolo/psutil/issues/932
.. _933: https://github.com/giampaolo/psutil/issues/933
.. _934: https://github.com/giampaolo/psutil/issues/934
.. _935: https://github.com/giampaolo/psutil/issues/935
.. _936: https://github.com/giampaolo/psutil/issues/936
.. _937: https://github.com/giampaolo/psutil/issues/937
.. _938: https://github.com/giampaolo/psutil/issues/938
.. _939: https://github.com/giampaolo/psutil/issues/939
.. _940: https://github.com/giampaolo/psutil/issues/940
.. _941: https://github.com/giampaolo/psutil/issues/941
.. _942: https://github.com/giampaolo/psutil/issues/942
.. _943: https://github.com/giampaolo/psutil/issues/943
.. _944: https://github.com/giampaolo/psutil/issues/944
.. _945: https://github.com/giampaolo/psutil/issues/945
.. _946: https://github.com/giampaolo/psutil/issues/946
.. _947: https://github.com/giampaolo/psutil/issues/947
.. _948: https://github.com/giampaolo/psutil/issues/948
.. _949: https://github.com/giampaolo/psutil/issues/949
.. _950: https://github.com/giampaolo/psutil/issues/950
.. _951: https://github.com/giampaolo/psutil/issues/951
.. _952: https://github.com/giampaolo/psutil/issues/952
.. _953: https://github.com/giampaolo/psutil/issues/953
.. _954: https://github.com/giampaolo/psutil/issues/954
.. _955: https://github.com/giampaolo/psutil/issues/955
.. _956: https://github.com/giampaolo/psutil/issues/956
.. _957: https://github.com/giampaolo/psutil/issues/957
.. _958: https://github.com/giampaolo/psutil/issues/958
.. _959: https://github.com/giampaolo/psutil/issues/959
.. _960: https://github.com/giampaolo/psutil/issues/960
.. _961: https://github.com/giampaolo/psutil/issues/961
.. _962: https://github.com/giampaolo/psutil/issues/962
.. _963: https://github.com/giampaolo/psutil/issues/963
.. _964: https://github.com/giampaolo/psutil/issues/964
.. _965: https://github.com/giampaolo/psutil/issues/965
.. _966: https://github.com/giampaolo/psutil/issues/966
.. _967: https://github.com/giampaolo/psutil/issues/967
.. _968: https://github.com/giampaolo/psutil/issues/968
.. _969: https://github.com/giampaolo/psutil/issues/969
.. _970: https://github.com/giampaolo/psutil/issues/970
.. _971: https://github.com/giampaolo/psutil/issues/971
.. _972: https://github.com/giampaolo/psutil/issues/972
.. _973: https://github.com/giampaolo/psutil/issues/973
.. _974: https://github.com/giampaolo/psutil/issues/974
.. _975: https://github.com/giampaolo/psutil/issues/975
.. _976: https://github.com/giampaolo/psutil/issues/976
.. _977: https://github.com/giampaolo/psutil/issues/977
.. _978: https://github.com/giampaolo/psutil/issues/978
.. _979: https://github.com/giampaolo/psutil/issues/979
.. _980: https://github.com/giampaolo/psutil/issues/980
.. _981: https://github.com/giampaolo/psutil/issues/981
.. _982: https://github.com/giampaolo/psutil/issues/982
.. _983: https://github.com/giampaolo/psutil/issues/983
.. _984: https://github.com/giampaolo/psutil/issues/984
.. _985: https://github.com/giampaolo/psutil/issues/985
.. _986: https://github.com/giampaolo/psutil/issues/986
.. _987: https://github.com/giampaolo/psutil/issues/987
.. _988: https://github.com/giampaolo/psutil/issues/988
.. _989: https://github.com/giampaolo/psutil/issues/989
.. _990: https://github.com/giampaolo/psutil/issues/990
.. _991: https://github.com/giampaolo/psutil/issues/991
.. _992: https://github.com/giampaolo/psutil/issues/992
.. _993: https://github.com/giampaolo/psutil/issues/993
.. _994: https://github.com/giampaolo/psutil/issues/994
.. _995: https://github.com/giampaolo/psutil/issues/995
.. _996: https://github.com/giampaolo/psutil/issues/996
.. _997: https://github.com/giampaolo/psutil/issues/997
.. _998: https://github.com/giampaolo/psutil/issues/998
.. _999: https://github.com/giampaolo/psutil/issues/999
.. _1000: https://github.com/giampaolo/psutil/issues/1000
.. _1001: https://github.com/giampaolo/psutil/issues/1001
.. _1002: https://github.com/giampaolo/psutil/issues/1002
.. _1003: https://github.com/giampaolo/psutil/issues/1003
.. _1004: https://github.com/giampaolo/psutil/issues/1004
.. _1005: https://github.com/giampaolo/psutil/issues/1005
.. _1006: https://github.com/giampaolo/psutil/issues/1006
.. _1007: https://github.com/giampaolo/psutil/issues/1007
.. _1008: https://github.com/giampaolo/psutil/issues/1008
.. _1009: https://github.com/giampaolo/psutil/issues/1009
.. _1010: https://github.com/giampaolo/psutil/issues/1010
.. _1011: https://github.com/giampaolo/psutil/issues/1011
.. _1012: https://github.com/giampaolo/psutil/issues/1012
.. _1013: https://github.com/giampaolo/psutil/issues/1013
.. _1014: https://github.com/giampaolo/psutil/issues/1014
.. _1015: https://github.com/giampaolo/psutil/issues/1015
.. _1016: https://github.com/giampaolo/psutil/issues/1016
.. _1017: https://github.com/giampaolo/psutil/issues/1017
.. _1018: https://github.com/giampaolo/psutil/issues/1018
.. _1019: https://github.com/giampaolo/psutil/issues/1019
.. _1020: https://github.com/giampaolo/psutil/issues/1020
.. _1021: https://github.com/giampaolo/psutil/issues/1021
.. _1022: https://github.com/giampaolo/psutil/issues/1022
.. _1023: https://github.com/giampaolo/psutil/issues/1023
.. _1024: https://github.com/giampaolo/psutil/issues/1024
.. _1025: https://github.com/giampaolo/psutil/issues/1025
.. _1026: https://github.com/giampaolo/psutil/issues/1026
.. _1027: https://github.com/giampaolo/psutil/issues/1027
.. _1028: https://github.com/giampaolo/psutil/issues/1028
.. _1029: https://github.com/giampaolo/psutil/issues/1029
.. _1030: https://github.com/giampaolo/psutil/issues/1030
.. _1031: https://github.com/giampaolo/psutil/issues/1031
.. _1032: https://github.com/giampaolo/psutil/issues/1032
.. _1033: https://github.com/giampaolo/psutil/issues/1033
.. _1034: https://github.com/giampaolo/psutil/issues/1034
.. _1035: https://github.com/giampaolo/psutil/issues/1035
.. _1036: https://github.com/giampaolo/psutil/issues/1036
.. _1037: https://github.com/giampaolo/psutil/issues/1037
.. _1038: https://github.com/giampaolo/psutil/issues/1038
.. _1039: https://github.com/giampaolo/psutil/issues/1039
.. _1040: https://github.com/giampaolo/psutil/issues/1040
.. _1041: https://github.com/giampaolo/psutil/issues/1041
.. _1042: https://github.com/giampaolo/psutil/issues/1042
.. _1043: https://github.com/giampaolo/psutil/issues/1043
.. _1044: https://github.com/giampaolo/psutil/issues/1044
.. _1045: https://github.com/giampaolo/psutil/issues/1045
.. _1046: https://github.com/giampaolo/psutil/issues/1046
.. _1047: https://github.com/giampaolo/psutil/issues/1047
.. _1048: https://github.com/giampaolo/psutil/issues/1048
.. _1049: https://github.com/giampaolo/psutil/issues/1049
.. _1050: https://github.com/giampaolo/psutil/issues/1050
.. _1051: https://github.com/giampaolo/psutil/issues/1051
.. _1052: https://github.com/giampaolo/psutil/issues/1052
.. _1053: https://github.com/giampaolo/psutil/issues/1053
.. _1054: https://github.com/giampaolo/psutil/issues/1054
.. _1055: https://github.com/giampaolo/psutil/issues/1055
.. _1056: https://github.com/giampaolo/psutil/issues/1056
.. _1057: https://github.com/giampaolo/psutil/issues/1057
.. _1058: https://github.com/giampaolo/psutil/issues/1058
.. _1059: https://github.com/giampaolo/psutil/issues/1059
.. _1060: https://github.com/giampaolo/psutil/issues/1060
.. _1061: https://github.com/giampaolo/psutil/issues/1061
.. _1062: https://github.com/giampaolo/psutil/issues/1062
.. _1063: https://github.com/giampaolo/psutil/issues/1063
.. _1064: https://github.com/giampaolo/psutil/issues/1064
.. _1065: https://github.com/giampaolo/psutil/issues/1065
.. _1066: https://github.com/giampaolo/psutil/issues/1066
.. _1067: https://github.com/giampaolo/psutil/issues/1067
.. _1068: https://github.com/giampaolo/psutil/issues/1068
.. _1069: https://github.com/giampaolo/psutil/issues/1069
.. _1070: https://github.com/giampaolo/psutil/issues/1070
.. _1071: https://github.com/giampaolo/psutil/issues/1071
.. _1072: https://github.com/giampaolo/psutil/issues/1072
.. _1073: https://github.com/giampaolo/psutil/issues/1073
.. _1074: https://github.com/giampaolo/psutil/issues/1074
.. _1075: https://github.com/giampaolo/psutil/issues/1075
.. _1076: https://github.com/giampaolo/psutil/issues/1076
.. _1077: https://github.com/giampaolo/psutil/issues/1077
.. _1078: https://github.com/giampaolo/psutil/issues/1078
.. _1079: https://github.com/giampaolo/psutil/issues/1079
.. _1080: https://github.com/giampaolo/psutil/issues/1080
.. _1081: https://github.com/giampaolo/psutil/issues/1081
.. _1082: https://github.com/giampaolo/psutil/issues/1082
.. _1083: https://github.com/giampaolo/psutil/issues/1083
.. _1084: https://github.com/giampaolo/psutil/issues/1084
.. _1085: https://github.com/giampaolo/psutil/issues/1085
.. _1086: https://github.com/giampaolo/psutil/issues/1086
.. _1087: https://github.com/giampaolo/psutil/issues/1087
.. _1088: https://github.com/giampaolo/psutil/issues/1088
.. _1089: https://github.com/giampaolo/psutil/issues/1089
.. _1090: https://github.com/giampaolo/psutil/issues/1090
.. _1091: https://github.com/giampaolo/psutil/issues/1091
.. _1092: https://github.com/giampaolo/psutil/issues/1092
.. _1093: https://github.com/giampaolo/psutil/issues/1093
.. _1094: https://github.com/giampaolo/psutil/issues/1094
.. _1095: https://github.com/giampaolo/psutil/issues/1095
.. _1096: https://github.com/giampaolo/psutil/issues/1096
.. _1097: https://github.com/giampaolo/psutil/issues/1097
.. _1098: https://github.com/giampaolo/psutil/issues/1098
.. _1099: https://github.com/giampaolo/psutil/issues/1099
.. _1100: https://github.com/giampaolo/psutil/issues/1100
.. _1101: https://github.com/giampaolo/psutil/issues/1101
.. _1102: https://github.com/giampaolo/psutil/issues/1102
.. _1103: https://github.com/giampaolo/psutil/issues/1103
.. _1104: https://github.com/giampaolo/psutil/issues/1104
.. _1105: https://github.com/giampaolo/psutil/issues/1105
.. _1106: https://github.com/giampaolo/psutil/issues/1106
.. _1107: https://github.com/giampaolo/psutil/issues/1107
.. _1108: https://github.com/giampaolo/psutil/issues/1108
.. _1109: https://github.com/giampaolo/psutil/issues/1109
.. _1110: https://github.com/giampaolo/psutil/issues/1110
.. _1111: https://github.com/giampaolo/psutil/issues/1111
.. _1112: https://github.com/giampaolo/psutil/issues/1112
.. _1113: https://github.com/giampaolo/psutil/issues/1113
.. _1114: https://github.com/giampaolo/psutil/issues/1114
.. _1115: https://github.com/giampaolo/psutil/issues/1115
.. _1116: https://github.com/giampaolo/psutil/issues/1116
.. _1117: https://github.com/giampaolo/psutil/issues/1117
.. _1118: https://github.com/giampaolo/psutil/issues/1118
.. _1119: https://github.com/giampaolo/psutil/issues/1119
.. _1120: https://github.com/giampaolo/psutil/issues/1120
.. _1121: https://github.com/giampaolo/psutil/issues/1121
.. _1122: https://github.com/giampaolo/psutil/issues/1122
.. _1123: https://github.com/giampaolo/psutil/issues/1123
.. _1124: https://github.com/giampaolo/psutil/issues/1124
.. _1125: https://github.com/giampaolo/psutil/issues/1125
.. _1126: https://github.com/giampaolo/psutil/issues/1126
.. _1127: https://github.com/giampaolo/psutil/issues/1127
.. _1128: https://github.com/giampaolo/psutil/issues/1128
.. _1129: https://github.com/giampaolo/psutil/issues/1129
.. _1130: https://github.com/giampaolo/psutil/issues/1130
.. _1131: https://github.com/giampaolo/psutil/issues/1131
.. _1132: https://github.com/giampaolo/psutil/issues/1132
.. _1133: https://github.com/giampaolo/psutil/issues/1133
.. _1134: https://github.com/giampaolo/psutil/issues/1134
.. _1135: https://github.com/giampaolo/psutil/issues/1135
.. _1136: https://github.com/giampaolo/psutil/issues/1136
.. _1137: https://github.com/giampaolo/psutil/issues/1137
.. _1138: https://github.com/giampaolo/psutil/issues/1138
.. _1139: https://github.com/giampaolo/psutil/issues/1139
.. _1140: https://github.com/giampaolo/psutil/issues/1140
.. _1141: https://github.com/giampaolo/psutil/issues/1141
.. _1142: https://github.com/giampaolo/psutil/issues/1142
.. _1143: https://github.com/giampaolo/psutil/issues/1143
.. _1144: https://github.com/giampaolo/psutil/issues/1144
.. _1145: https://github.com/giampaolo/psutil/issues/1145
.. _1146: https://github.com/giampaolo/psutil/issues/1146
.. _1147: https://github.com/giampaolo/psutil/issues/1147
.. _1148: https://github.com/giampaolo/psutil/issues/1148
.. _1149: https://github.com/giampaolo/psutil/issues/1149
.. _1150: https://github.com/giampaolo/psutil/issues/1150
.. _1151: https://github.com/giampaolo/psutil/issues/1151
.. _1152: https://github.com/giampaolo/psutil/issues/1152
.. _1153: https://github.com/giampaolo/psutil/issues/1153
.. _1154: https://github.com/giampaolo/psutil/issues/1154
.. _1155: https://github.com/giampaolo/psutil/issues/1155
.. _1156: https://github.com/giampaolo/psutil/issues/1156
.. _1157: https://github.com/giampaolo/psutil/issues/1157
.. _1158: https://github.com/giampaolo/psutil/issues/1158
.. _1159: https://github.com/giampaolo/psutil/issues/1159
.. _1160: https://github.com/giampaolo/psutil/issues/1160
.. _1161: https://github.com/giampaolo/psutil/issues/1161
.. _1162: https://github.com/giampaolo/psutil/issues/1162
.. _1163: https://github.com/giampaolo/psutil/issues/1163
.. _1164: https://github.com/giampaolo/psutil/issues/1164
.. _1165: https://github.com/giampaolo/psutil/issues/1165
.. _1166: https://github.com/giampaolo/psutil/issues/1166
.. _1167: https://github.com/giampaolo/psutil/issues/1167
.. _1168: https://github.com/giampaolo/psutil/issues/1168
.. _1169: https://github.com/giampaolo/psutil/issues/1169
.. _1170: https://github.com/giampaolo/psutil/issues/1170
.. _1171: https://github.com/giampaolo/psutil/issues/1171
.. _1172: https://github.com/giampaolo/psutil/issues/1172
.. _1173: https://github.com/giampaolo/psutil/issues/1173
.. _1174: https://github.com/giampaolo/psutil/issues/1174
.. _1175: https://github.com/giampaolo/psutil/issues/1175
.. _1176: https://github.com/giampaolo/psutil/issues/1176
.. _1177: https://github.com/giampaolo/psutil/issues/1177
.. _1178: https://github.com/giampaolo/psutil/issues/1178
.. _1179: https://github.com/giampaolo/psutil/issues/1179
.. _1180: https://github.com/giampaolo/psutil/issues/1180
.. _1181: https://github.com/giampaolo/psutil/issues/1181
.. _1182: https://github.com/giampaolo/psutil/issues/1182
.. _1183: https://github.com/giampaolo/psutil/issues/1183
.. _1184: https://github.com/giampaolo/psutil/issues/1184
.. _1185: https://github.com/giampaolo/psutil/issues/1185
.. _1186: https://github.com/giampaolo/psutil/issues/1186
.. _1187: https://github.com/giampaolo/psutil/issues/1187
.. _1188: https://github.com/giampaolo/psutil/issues/1188
.. _1189: https://github.com/giampaolo/psutil/issues/1189
.. _1190: https://github.com/giampaolo/psutil/issues/1190
.. _1191: https://github.com/giampaolo/psutil/issues/1191
.. _1192: https://github.com/giampaolo/psutil/issues/1192
.. _1193: https://github.com/giampaolo/psutil/issues/1193
.. _1194: https://github.com/giampaolo/psutil/issues/1194
.. _1195: https://github.com/giampaolo/psutil/issues/1195
.. _1196: https://github.com/giampaolo/psutil/issues/1196
.. _1197: https://github.com/giampaolo/psutil/issues/1197
.. _1198: https://github.com/giampaolo/psutil/issues/1198
.. _1199: https://github.com/giampaolo/psutil/issues/1199
.. _1200: https://github.com/giampaolo/psutil/issues/1200
.. _1201: https://github.com/giampaolo/psutil/issues/1201
.. _1202: https://github.com/giampaolo/psutil/issues/1202
.. _1203: https://github.com/giampaolo/psutil/issues/1203
.. _1204: https://github.com/giampaolo/psutil/issues/1204
.. _1205: https://github.com/giampaolo/psutil/issues/1205
.. _1206: https://github.com/giampaolo/psutil/issues/1206
.. _1207: https://github.com/giampaolo/psutil/issues/1207
.. _1208: https://github.com/giampaolo/psutil/issues/1208
.. _1209: https://github.com/giampaolo/psutil/issues/1209
.. _1210: https://github.com/giampaolo/psutil/issues/1210
.. _1211: https://github.com/giampaolo/psutil/issues/1211
.. _1212: https://github.com/giampaolo/psutil/issues/1212
.. _1213: https://github.com/giampaolo/psutil/issues/1213
.. _1214: https://github.com/giampaolo/psutil/issues/1214
.. _1215: https://github.com/giampaolo/psutil/issues/1215
.. _1216: https://github.com/giampaolo/psutil/issues/1216
.. _1217: https://github.com/giampaolo/psutil/issues/1217
.. _1218: https://github.com/giampaolo/psutil/issues/1218
.. _1219: https://github.com/giampaolo/psutil/issues/1219
.. _1220: https://github.com/giampaolo/psutil/issues/1220
.. _1221: https://github.com/giampaolo/psutil/issues/1221
.. _1222: https://github.com/giampaolo/psutil/issues/1222
.. _1223: https://github.com/giampaolo/psutil/issues/1223
.. _1224: https://github.com/giampaolo/psutil/issues/1224
.. _1225: https://github.com/giampaolo/psutil/issues/1225
.. _1226: https://github.com/giampaolo/psutil/issues/1226
.. _1227: https://github.com/giampaolo/psutil/issues/1227
.. _1228: https://github.com/giampaolo/psutil/issues/1228
.. _1229: https://github.com/giampaolo/psutil/issues/1229
.. _1230: https://github.com/giampaolo/psutil/issues/1230
.. _1231: https://github.com/giampaolo/psutil/issues/1231
.. _1232: https://github.com/giampaolo/psutil/issues/1232
.. _1233: https://github.com/giampaolo/psutil/issues/1233
.. _1234: https://github.com/giampaolo/psutil/issues/1234
.. _1235: https://github.com/giampaolo/psutil/issues/1235
.. _1236: https://github.com/giampaolo/psutil/issues/1236
.. _1237: https://github.com/giampaolo/psutil/issues/1237
.. _1238: https://github.com/giampaolo/psutil/issues/1238
.. _1239: https://github.com/giampaolo/psutil/issues/1239
.. _1240: https://github.com/giampaolo/psutil/issues/1240
.. _1241: https://github.com/giampaolo/psutil/issues/1241
.. _1242: https://github.com/giampaolo/psutil/issues/1242
.. _1243: https://github.com/giampaolo/psutil/issues/1243
.. _1244: https://github.com/giampaolo/psutil/issues/1244
.. _1245: https://github.com/giampaolo/psutil/issues/1245
.. _1246: https://github.com/giampaolo/psutil/issues/1246
.. _1247: https://github.com/giampaolo/psutil/issues/1247
.. _1248: https://github.com/giampaolo/psutil/issues/1248
.. _1249: https://github.com/giampaolo/psutil/issues/1249
.. _1250: https://github.com/giampaolo/psutil/issues/1250
.. _1251: https://github.com/giampaolo/psutil/issues/1251
.. _1252: https://github.com/giampaolo/psutil/issues/1252
.. _1253: https://github.com/giampaolo/psutil/issues/1253
.. _1254: https://github.com/giampaolo/psutil/issues/1254
.. _1255: https://github.com/giampaolo/psutil/issues/1255
.. _1256: https://github.com/giampaolo/psutil/issues/1256
.. _1257: https://github.com/giampaolo/psutil/issues/1257
.. _1258: https://github.com/giampaolo/psutil/issues/1258
.. _1259: https://github.com/giampaolo/psutil/issues/1259
.. _1260: https://github.com/giampaolo/psutil/issues/1260
.. _1261: https://github.com/giampaolo/psutil/issues/1261
.. _1262: https://github.com/giampaolo/psutil/issues/1262
.. _1263: https://github.com/giampaolo/psutil/issues/1263
.. _1264: https://github.com/giampaolo/psutil/issues/1264
.. _1265: https://github.com/giampaolo/psutil/issues/1265
.. _1266: https://github.com/giampaolo/psutil/issues/1266
.. _1267: https://github.com/giampaolo/psutil/issues/1267
.. _1268: https://github.com/giampaolo/psutil/issues/1268
.. _1269: https://github.com/giampaolo/psutil/issues/1269
.. _1270: https://github.com/giampaolo/psutil/issues/1270
.. _1271: https://github.com/giampaolo/psutil/issues/1271
.. _1272: https://github.com/giampaolo/psutil/issues/1272
.. _1273: https://github.com/giampaolo/psutil/issues/1273
.. _1274: https://github.com/giampaolo/psutil/issues/1274
.. _1275: https://github.com/giampaolo/psutil/issues/1275
.. _1276: https://github.com/giampaolo/psutil/issues/1276
.. _1277: https://github.com/giampaolo/psutil/issues/1277
.. _1278: https://github.com/giampaolo/psutil/issues/1278
.. _1279: https://github.com/giampaolo/psutil/issues/1279
.. _1280: https://github.com/giampaolo/psutil/issues/1280
.. _1281: https://github.com/giampaolo/psutil/issues/1281
.. _1282: https://github.com/giampaolo/psutil/issues/1282
.. _1283: https://github.com/giampaolo/psutil/issues/1283
.. _1284: https://github.com/giampaolo/psutil/issues/1284
.. _1285: https://github.com/giampaolo/psutil/issues/1285
.. _1286: https://github.com/giampaolo/psutil/issues/1286
.. _1287: https://github.com/giampaolo/psutil/issues/1287
.. _1288: https://github.com/giampaolo/psutil/issues/1288
.. _1289: https://github.com/giampaolo/psutil/issues/1289
.. _1290: https://github.com/giampaolo/psutil/issues/1290
.. _1291: https://github.com/giampaolo/psutil/issues/1291
.. _1292: https://github.com/giampaolo/psutil/issues/1292
.. _1293: https://github.com/giampaolo/psutil/issues/1293
.. _1294: https://github.com/giampaolo/psutil/issues/1294
.. _1295: https://github.com/giampaolo/psutil/issues/1295
.. _1296: https://github.com/giampaolo/psutil/issues/1296
.. _1297: https://github.com/giampaolo/psutil/issues/1297
.. _1298: https://github.com/giampaolo/psutil/issues/1298
.. _1299: https://github.com/giampaolo/psutil/issues/1299
.. _1300: https://github.com/giampaolo/psutil/issues/1300
.. _1301: https://github.com/giampaolo/psutil/issues/1301
.. _1302: https://github.com/giampaolo/psutil/issues/1302
.. _1303: https://github.com/giampaolo/psutil/issues/1303
.. _1304: https://github.com/giampaolo/psutil/issues/1304
.. _1305: https://github.com/giampaolo/psutil/issues/1305
.. _1306: https://github.com/giampaolo/psutil/issues/1306
.. _1307: https://github.com/giampaolo/psutil/issues/1307
.. _1308: https://github.com/giampaolo/psutil/issues/1308
.. _1309: https://github.com/giampaolo/psutil/issues/1309
.. _1310: https://github.com/giampaolo/psutil/issues/1310
.. _1311: https://github.com/giampaolo/psutil/issues/1311
.. _1312: https://github.com/giampaolo/psutil/issues/1312
.. _1313: https://github.com/giampaolo/psutil/issues/1313
.. _1314: https://github.com/giampaolo/psutil/issues/1314
.. _1315: https://github.com/giampaolo/psutil/issues/1315
.. _1316: https://github.com/giampaolo/psutil/issues/1316
.. _1317: https://github.com/giampaolo/psutil/issues/1317
.. _1318: https://github.com/giampaolo/psutil/issues/1318
.. _1319: https://github.com/giampaolo/psutil/issues/1319
.. _1320: https://github.com/giampaolo/psutil/issues/1320
.. _1321: https://github.com/giampaolo/psutil/issues/1321
.. _1322: https://github.com/giampaolo/psutil/issues/1322
.. _1323: https://github.com/giampaolo/psutil/issues/1323
.. _1324: https://github.com/giampaolo/psutil/issues/1324
.. _1325: https://github.com/giampaolo/psutil/issues/1325
.. _1326: https://github.com/giampaolo/psutil/issues/1326
.. _1327: https://github.com/giampaolo/psutil/issues/1327
.. _1328: https://github.com/giampaolo/psutil/issues/1328
.. _1329: https://github.com/giampaolo/psutil/issues/1329
.. _1330: https://github.com/giampaolo/psutil/issues/1330
.. _1331: https://github.com/giampaolo/psutil/issues/1331
.. _1332: https://github.com/giampaolo/psutil/issues/1332
.. _1333: https://github.com/giampaolo/psutil/issues/1333
.. _1334: https://github.com/giampaolo/psutil/issues/1334
.. _1335: https://github.com/giampaolo/psutil/issues/1335
.. _1336: https://github.com/giampaolo/psutil/issues/1336
.. _1337: https://github.com/giampaolo/psutil/issues/1337
.. _1338: https://github.com/giampaolo/psutil/issues/1338
.. _1339: https://github.com/giampaolo/psutil/issues/1339
.. _1340: https://github.com/giampaolo/psutil/issues/1340
.. _1341: https://github.com/giampaolo/psutil/issues/1341
.. _1342: https://github.com/giampaolo/psutil/issues/1342
.. _1343: https://github.com/giampaolo/psutil/issues/1343
.. _1344: https://github.com/giampaolo/psutil/issues/1344
.. _1345: https://github.com/giampaolo/psutil/issues/1345
.. _1346: https://github.com/giampaolo/psutil/issues/1346
.. _1347: https://github.com/giampaolo/psutil/issues/1347
.. _1348: https://github.com/giampaolo/psutil/issues/1348
.. _1349: https://github.com/giampaolo/psutil/issues/1349
.. _1350: https://github.com/giampaolo/psutil/issues/1350
.. _1351: https://github.com/giampaolo/psutil/issues/1351
.. _1352: https://github.com/giampaolo/psutil/issues/1352
.. _1353: https://github.com/giampaolo/psutil/issues/1353
.. _1354: https://github.com/giampaolo/psutil/issues/1354
.. _1355: https://github.com/giampaolo/psutil/issues/1355
.. _1356: https://github.com/giampaolo/psutil/issues/1356
.. _1357: https://github.com/giampaolo/psutil/issues/1357
.. _1358: https://github.com/giampaolo/psutil/issues/1358
.. _1359: https://github.com/giampaolo/psutil/issues/1359
.. _1360: https://github.com/giampaolo/psutil/issues/1360
.. _1361: https://github.com/giampaolo/psutil/issues/1361
.. _1362: https://github.com/giampaolo/psutil/issues/1362
.. _1363: https://github.com/giampaolo/psutil/issues/1363
.. _1364: https://github.com/giampaolo/psutil/issues/1364
.. _1365: https://github.com/giampaolo/psutil/issues/1365
.. _1366: https://github.com/giampaolo/psutil/issues/1366
.. _1367: https://github.com/giampaolo/psutil/issues/1367
.. _1368: https://github.com/giampaolo/psutil/issues/1368
.. _1369: https://github.com/giampaolo/psutil/issues/1369
.. _1370: https://github.com/giampaolo/psutil/issues/1370
.. _1371: https://github.com/giampaolo/psutil/issues/1371
.. _1372: https://github.com/giampaolo/psutil/issues/1372
.. _1373: https://github.com/giampaolo/psutil/issues/1373
.. _1374: https://github.com/giampaolo/psutil/issues/1374
.. _1375: https://github.com/giampaolo/psutil/issues/1375
.. _1376: https://github.com/giampaolo/psutil/issues/1376
.. _1377: https://github.com/giampaolo/psutil/issues/1377
.. _1378: https://github.com/giampaolo/psutil/issues/1378
.. _1379: https://github.com/giampaolo/psutil/issues/1379
.. _1380: https://github.com/giampaolo/psutil/issues/1380
.. _1381: https://github.com/giampaolo/psutil/issues/1381
.. _1382: https://github.com/giampaolo/psutil/issues/1382
.. _1383: https://github.com/giampaolo/psutil/issues/1383
.. _1384: https://github.com/giampaolo/psutil/issues/1384
.. _1385: https://github.com/giampaolo/psutil/issues/1385
.. _1386: https://github.com/giampaolo/psutil/issues/1386
.. _1387: https://github.com/giampaolo/psutil/issues/1387
.. _1388: https://github.com/giampaolo/psutil/issues/1388
.. _1389: https://github.com/giampaolo/psutil/issues/1389
.. _1390: https://github.com/giampaolo/psutil/issues/1390
.. _1391: https://github.com/giampaolo/psutil/issues/1391
.. _1392: https://github.com/giampaolo/psutil/issues/1392
.. _1393: https://github.com/giampaolo/psutil/issues/1393
.. _1394: https://github.com/giampaolo/psutil/issues/1394
.. _1395: https://github.com/giampaolo/psutil/issues/1395
.. _1396: https://github.com/giampaolo/psutil/issues/1396
.. _1397: https://github.com/giampaolo/psutil/issues/1397
.. _1398: https://github.com/giampaolo/psutil/issues/1398
.. _1399: https://github.com/giampaolo/psutil/issues/1399
.. _1400: https://github.com/giampaolo/psutil/issues/1400
.. _1401: https://github.com/giampaolo/psutil/issues/1401
.. _1402: https://github.com/giampaolo/psutil/issues/1402
.. _1403: https://github.com/giampaolo/psutil/issues/1403
.. _1404: https://github.com/giampaolo/psutil/issues/1404
.. _1405: https://github.com/giampaolo/psutil/issues/1405
.. _1406: https://github.com/giampaolo/psutil/issues/1406
.. _1407: https://github.com/giampaolo/psutil/issues/1407
.. _1408: https://github.com/giampaolo/psutil/issues/1408
.. _1409: https://github.com/giampaolo/psutil/issues/1409
.. _1410: https://github.com/giampaolo/psutil/issues/1410
.. _1411: https://github.com/giampaolo/psutil/issues/1411
.. _1412: https://github.com/giampaolo/psutil/issues/1412
.. _1413: https://github.com/giampaolo/psutil/issues/1413
.. _1414: https://github.com/giampaolo/psutil/issues/1414
.. _1415: https://github.com/giampaolo/psutil/issues/1415
.. _1416: https://github.com/giampaolo/psutil/issues/1416
.. _1417: https://github.com/giampaolo/psutil/issues/1417
.. _1418: https://github.com/giampaolo/psutil/issues/1418
.. _1419: https://github.com/giampaolo/psutil/issues/1419
.. _1420: https://github.com/giampaolo/psutil/issues/1420
.. _1421: https://github.com/giampaolo/psutil/issues/1421
.. _1422: https://github.com/giampaolo/psutil/issues/1422
.. _1423: https://github.com/giampaolo/psutil/issues/1423
.. _1424: https://github.com/giampaolo/psutil/issues/1424
.. _1425: https://github.com/giampaolo/psutil/issues/1425
.. _1426: https://github.com/giampaolo/psutil/issues/1426
.. _1427: https://github.com/giampaolo/psutil/issues/1427
.. _1428: https://github.com/giampaolo/psutil/issues/1428
.. _1429: https://github.com/giampaolo/psutil/issues/1429
.. _1430: https://github.com/giampaolo/psutil/issues/1430
.. _1431: https://github.com/giampaolo/psutil/issues/1431
.. _1432: https://github.com/giampaolo/psutil/issues/1432
.. _1433: https://github.com/giampaolo/psutil/issues/1433
.. _1434: https://github.com/giampaolo/psutil/issues/1434
.. _1435: https://github.com/giampaolo/psutil/issues/1435
.. _1436: https://github.com/giampaolo/psutil/issues/1436
.. _1437: https://github.com/giampaolo/psutil/issues/1437
.. _1438: https://github.com/giampaolo/psutil/issues/1438
.. _1439: https://github.com/giampaolo/psutil/issues/1439
.. _1440: https://github.com/giampaolo/psutil/issues/1440
.. _1441: https://github.com/giampaolo/psutil/issues/1441
.. _1442: https://github.com/giampaolo/psutil/issues/1442
.. _1443: https://github.com/giampaolo/psutil/issues/1443
.. _1444: https://github.com/giampaolo/psutil/issues/1444
.. _1445: https://github.com/giampaolo/psutil/issues/1445
.. _1446: https://github.com/giampaolo/psutil/issues/1446
.. _1447: https://github.com/giampaolo/psutil/issues/1447
.. _1448: https://github.com/giampaolo/psutil/issues/1448
.. _1449: https://github.com/giampaolo/psutil/issues/1449
.. _1450: https://github.com/giampaolo/psutil/issues/1450
.. _1451: https://github.com/giampaolo/psutil/issues/1451
.. _1452: https://github.com/giampaolo/psutil/issues/1452
.. _1453: https://github.com/giampaolo/psutil/issues/1453
.. _1454: https://github.com/giampaolo/psutil/issues/1454
.. _1455: https://github.com/giampaolo/psutil/issues/1455
.. _1456: https://github.com/giampaolo/psutil/issues/1456
.. _1457: https://github.com/giampaolo/psutil/issues/1457
.. _1458: https://github.com/giampaolo/psutil/issues/1458
.. _1459: https://github.com/giampaolo/psutil/issues/1459
.. _1460: https://github.com/giampaolo/psutil/issues/1460
.. _1461: https://github.com/giampaolo/psutil/issues/1461
.. _1462: https://github.com/giampaolo/psutil/issues/1462
.. _1463: https://github.com/giampaolo/psutil/issues/1463
.. _1464: https://github.com/giampaolo/psutil/issues/1464
.. _1465: https://github.com/giampaolo/psutil/issues/1465
.. _1466: https://github.com/giampaolo/psutil/issues/1466
.. _1467: https://github.com/giampaolo/psutil/issues/1467
.. _1468: https://github.com/giampaolo/psutil/issues/1468
.. _1469: https://github.com/giampaolo/psutil/issues/1469
.. _1470: https://github.com/giampaolo/psutil/issues/1470
.. _1471: https://github.com/giampaolo/psutil/issues/1471
.. _1472: https://github.com/giampaolo/psutil/issues/1472
.. _1473: https://github.com/giampaolo/psutil/issues/1473
.. _1474: https://github.com/giampaolo/psutil/issues/1474
.. _1475: https://github.com/giampaolo/psutil/issues/1475
.. _1476: https://github.com/giampaolo/psutil/issues/1476
.. _1477: https://github.com/giampaolo/psutil/issues/1477
.. _1478: https://github.com/giampaolo/psutil/issues/1478
.. _1479: https://github.com/giampaolo/psutil/issues/1479
.. _1480: https://github.com/giampaolo/psutil/issues/1480
.. _1481: https://github.com/giampaolo/psutil/issues/1481
.. _1482: https://github.com/giampaolo/psutil/issues/1482
.. _1483: https://github.com/giampaolo/psutil/issues/1483
.. _1484: https://github.com/giampaolo/psutil/issues/1484
.. _1485: https://github.com/giampaolo/psutil/issues/1485
.. _1486: https://github.com/giampaolo/psutil/issues/1486
.. _1487: https://github.com/giampaolo/psutil/issues/1487
.. _1488: https://github.com/giampaolo/psutil/issues/1488
.. _1489: https://github.com/giampaolo/psutil/issues/1489
.. _1490: https://github.com/giampaolo/psutil/issues/1490
.. _1491: https://github.com/giampaolo/psutil/issues/1491
.. _1492: https://github.com/giampaolo/psutil/issues/1492
.. _1493: https://github.com/giampaolo/psutil/issues/1493
.. _1494: https://github.com/giampaolo/psutil/issues/1494
.. _1495: https://github.com/giampaolo/psutil/issues/1495
.. _1496: https://github.com/giampaolo/psutil/issues/1496
.. _1497: https://github.com/giampaolo/psutil/issues/1497
.. _1498: https://github.com/giampaolo/psutil/issues/1498
.. _1499: https://github.com/giampaolo/psutil/issues/1499
.. _1500: https://github.com/giampaolo/psutil/issues/1500
.. _1501: https://github.com/giampaolo/psutil/issues/1501
.. _1502: https://github.com/giampaolo/psutil/issues/1502
.. _1503: https://github.com/giampaolo/psutil/issues/1503
.. _1504: https://github.com/giampaolo/psutil/issues/1504
.. _1505: https://github.com/giampaolo/psutil/issues/1505
.. _1506: https://github.com/giampaolo/psutil/issues/1506
.. _1507: https://github.com/giampaolo/psutil/issues/1507
.. _1508: https://github.com/giampaolo/psutil/issues/1508
.. _1509: https://github.com/giampaolo/psutil/issues/1509
.. _1510: https://github.com/giampaolo/psutil/issues/1510
.. _1511: https://github.com/giampaolo/psutil/issues/1511
.. _1512: https://github.com/giampaolo/psutil/issues/1512
.. _1513: https://github.com/giampaolo/psutil/issues/1513
.. _1514: https://github.com/giampaolo/psutil/issues/1514
.. _1515: https://github.com/giampaolo/psutil/issues/1515
.. _1516: https://github.com/giampaolo/psutil/issues/1516
.. _1517: https://github.com/giampaolo/psutil/issues/1517
.. _1518: https://github.com/giampaolo/psutil/issues/1518
.. _1519: https://github.com/giampaolo/psutil/issues/1519
.. _1520: https://github.com/giampaolo/psutil/issues/1520
.. _1521: https://github.com/giampaolo/psutil/issues/1521
.. _1522: https://github.com/giampaolo/psutil/issues/1522
.. _1523: https://github.com/giampaolo/psutil/issues/1523
.. _1524: https://github.com/giampaolo/psutil/issues/1524
.. _1525: https://github.com/giampaolo/psutil/issues/1525
.. _1526: https://github.com/giampaolo/psutil/issues/1526
.. _1527: https://github.com/giampaolo/psutil/issues/1527
.. _1528: https://github.com/giampaolo/psutil/issues/1528
.. _1529: https://github.com/giampaolo/psutil/issues/1529
.. _1530: https://github.com/giampaolo/psutil/issues/1530
.. _1531: https://github.com/giampaolo/psutil/issues/1531
.. _1532: https://github.com/giampaolo/psutil/issues/1532
.. _1533: https://github.com/giampaolo/psutil/issues/1533
.. _1534: https://github.com/giampaolo/psutil/issues/1534
.. _1535: https://github.com/giampaolo/psutil/issues/1535
.. _1536: https://github.com/giampaolo/psutil/issues/1536
.. _1537: https://github.com/giampaolo/psutil/issues/1537
.. _1538: https://github.com/giampaolo/psutil/issues/1538
.. _1539: https://github.com/giampaolo/psutil/issues/1539
.. _1540: https://github.com/giampaolo/psutil/issues/1540
.. _1541: https://github.com/giampaolo/psutil/issues/1541
.. _1542: https://github.com/giampaolo/psutil/issues/1542
.. _1543: https://github.com/giampaolo/psutil/issues/1543
.. _1544: https://github.com/giampaolo/psutil/issues/1544
.. _1545: https://github.com/giampaolo/psutil/issues/1545
.. _1546: https://github.com/giampaolo/psutil/issues/1546
.. _1547: https://github.com/giampaolo/psutil/issues/1547
.. _1548: https://github.com/giampaolo/psutil/issues/1548
.. _1549: https://github.com/giampaolo/psutil/issues/1549
.. _1550: https://github.com/giampaolo/psutil/issues/1550
.. _1551: https://github.com/giampaolo/psutil/issues/1551
.. _1552: https://github.com/giampaolo/psutil/issues/1552
.. _1553: https://github.com/giampaolo/psutil/issues/1553
.. _1554: https://github.com/giampaolo/psutil/issues/1554
.. _1555: https://github.com/giampaolo/psutil/issues/1555
.. _1556: https://github.com/giampaolo/psutil/issues/1556
.. _1557: https://github.com/giampaolo/psutil/issues/1557
.. _1558: https://github.com/giampaolo/psutil/issues/1558
.. _1559: https://github.com/giampaolo/psutil/issues/1559
.. _1560: https://github.com/giampaolo/psutil/issues/1560
.. _1561: https://github.com/giampaolo/psutil/issues/1561
.. _1562: https://github.com/giampaolo/psutil/issues/1562
.. _1563: https://github.com/giampaolo/psutil/issues/1563
.. _1564: https://github.com/giampaolo/psutil/issues/1564
.. _1565: https://github.com/giampaolo/psutil/issues/1565
.. _1566: https://github.com/giampaolo/psutil/issues/1566
.. _1567: https://github.com/giampaolo/psutil/issues/1567
.. _1568: https://github.com/giampaolo/psutil/issues/1568
.. _1569: https://github.com/giampaolo/psutil/issues/1569
.. _1570: https://github.com/giampaolo/psutil/issues/1570
.. _1571: https://github.com/giampaolo/psutil/issues/1571
.. _1572: https://github.com/giampaolo/psutil/issues/1572
.. _1573: https://github.com/giampaolo/psutil/issues/1573
.. _1574: https://github.com/giampaolo/psutil/issues/1574
.. _1575: https://github.com/giampaolo/psutil/issues/1575
.. _1576: https://github.com/giampaolo/psutil/issues/1576
.. _1577: https://github.com/giampaolo/psutil/issues/1577
.. _1578: https://github.com/giampaolo/psutil/issues/1578
.. _1579: https://github.com/giampaolo/psutil/issues/1579
.. _1580: https://github.com/giampaolo/psutil/issues/1580
.. _1581: https://github.com/giampaolo/psutil/issues/1581
.. _1582: https://github.com/giampaolo/psutil/issues/1582
.. _1583: https://github.com/giampaolo/psutil/issues/1583
.. _1584: https://github.com/giampaolo/psutil/issues/1584
.. _1585: https://github.com/giampaolo/psutil/issues/1585
.. _1586: https://github.com/giampaolo/psutil/issues/1586
.. _1587: https://github.com/giampaolo/psutil/issues/1587
.. _1588: https://github.com/giampaolo/psutil/issues/1588
.. _1589: https://github.com/giampaolo/psutil/issues/1589
.. _1590: https://github.com/giampaolo/psutil/issues/1590
.. _1591: https://github.com/giampaolo/psutil/issues/1591
.. _1592: https://github.com/giampaolo/psutil/issues/1592
.. _1593: https://github.com/giampaolo/psutil/issues/1593
.. _1594: https://github.com/giampaolo/psutil/issues/1594
.. _1595: https://github.com/giampaolo/psutil/issues/1595
.. _1596: https://github.com/giampaolo/psutil/issues/1596
.. _1597: https://github.com/giampaolo/psutil/issues/1597
.. _1598: https://github.com/giampaolo/psutil/issues/1598
.. _1599: https://github.com/giampaolo/psutil/issues/1599
.. _1600: https://github.com/giampaolo/psutil/issues/1600
.. _1601: https://github.com/giampaolo/psutil/issues/1601
.. _1602: https://github.com/giampaolo/psutil/issues/1602
.. _1603: https://github.com/giampaolo/psutil/issues/1603
.. _1604: https://github.com/giampaolo/psutil/issues/1604
.. _1605: https://github.com/giampaolo/psutil/issues/1605
.. _1606: https://github.com/giampaolo/psutil/issues/1606
.. _1607: https://github.com/giampaolo/psutil/issues/1607
.. _1608: https://github.com/giampaolo/psutil/issues/1608
.. _1609: https://github.com/giampaolo/psutil/issues/1609
.. _1610: https://github.com/giampaolo/psutil/issues/1610
.. _1611: https://github.com/giampaolo/psutil/issues/1611
.. _1612: https://github.com/giampaolo/psutil/issues/1612
.. _1613: https://github.com/giampaolo/psutil/issues/1613
.. _1614: https://github.com/giampaolo/psutil/issues/1614
.. _1615: https://github.com/giampaolo/psutil/issues/1615
.. _1616: https://github.com/giampaolo/psutil/issues/1616
.. _1617: https://github.com/giampaolo/psutil/issues/1617
.. _1618: https://github.com/giampaolo/psutil/issues/1618
.. _1619: https://github.com/giampaolo/psutil/issues/1619
.. _1620: https://github.com/giampaolo/psutil/issues/1620
.. _1621: https://github.com/giampaolo/psutil/issues/1621
.. _1622: https://github.com/giampaolo/psutil/issues/1622
.. _1623: https://github.com/giampaolo/psutil/issues/1623
.. _1624: https://github.com/giampaolo/psutil/issues/1624
.. _1625: https://github.com/giampaolo/psutil/issues/1625
.. _1626: https://github.com/giampaolo/psutil/issues/1626
.. _1627: https://github.com/giampaolo/psutil/issues/1627
.. _1628: https://github.com/giampaolo/psutil/issues/1628
.. _1629: https://github.com/giampaolo/psutil/issues/1629
.. _1630: https://github.com/giampaolo/psutil/issues/1630
.. _1631: https://github.com/giampaolo/psutil/issues/1631
.. _1632: https://github.com/giampaolo/psutil/issues/1632
.. _1633: https://github.com/giampaolo/psutil/issues/1633
.. _1634: https://github.com/giampaolo/psutil/issues/1634
.. _1635: https://github.com/giampaolo/psutil/issues/1635
.. _1636: https://github.com/giampaolo/psutil/issues/1636
.. _1637: https://github.com/giampaolo/psutil/issues/1637
.. _1638: https://github.com/giampaolo/psutil/issues/1638
.. _1639: https://github.com/giampaolo/psutil/issues/1639
.. _1640: https://github.com/giampaolo/psutil/issues/1640
.. _1641: https://github.com/giampaolo/psutil/issues/1641
.. _1642: https://github.com/giampaolo/psutil/issues/1642
.. _1643: https://github.com/giampaolo/psutil/issues/1643
.. _1644: https://github.com/giampaolo/psutil/issues/1644
.. _1645: https://github.com/giampaolo/psutil/issues/1645
.. _1646: https://github.com/giampaolo/psutil/issues/1646
.. _1647: https://github.com/giampaolo/psutil/issues/1647
.. _1648: https://github.com/giampaolo/psutil/issues/1648
.. _1649: https://github.com/giampaolo/psutil/issues/1649
.. _1650: https://github.com/giampaolo/psutil/issues/1650
.. _1651: https://github.com/giampaolo/psutil/issues/1651
.. _1652: https://github.com/giampaolo/psutil/issues/1652
.. _1653: https://github.com/giampaolo/psutil/issues/1653
.. _1654: https://github.com/giampaolo/psutil/issues/1654
.. _1655: https://github.com/giampaolo/psutil/issues/1655
.. _1656: https://github.com/giampaolo/psutil/issues/1656
.. _1657: https://github.com/giampaolo/psutil/issues/1657
.. _1658: https://github.com/giampaolo/psutil/issues/1658
.. _1659: https://github.com/giampaolo/psutil/issues/1659
.. _1660: https://github.com/giampaolo/psutil/issues/1660
.. _1661: https://github.com/giampaolo/psutil/issues/1661
.. _1662: https://github.com/giampaolo/psutil/issues/1662
.. _1663: https://github.com/giampaolo/psutil/issues/1663
.. _1664: https://github.com/giampaolo/psutil/issues/1664
.. _1665: https://github.com/giampaolo/psutil/issues/1665
.. _1666: https://github.com/giampaolo/psutil/issues/1666
.. _1667: https://github.com/giampaolo/psutil/issues/1667
.. _1668: https://github.com/giampaolo/psutil/issues/1668
.. _1669: https://github.com/giampaolo/psutil/issues/1669
.. _1670: https://github.com/giampaolo/psutil/issues/1670
.. _1671: https://github.com/giampaolo/psutil/issues/1671
.. _1672: https://github.com/giampaolo/psutil/issues/1672
.. _1673: https://github.com/giampaolo/psutil/issues/1673
.. _1674: https://github.com/giampaolo/psutil/issues/1674
.. _1675: https://github.com/giampaolo/psutil/issues/1675
.. _1676: https://github.com/giampaolo/psutil/issues/1676
.. _1677: https://github.com/giampaolo/psutil/issues/1677
.. _1678: https://github.com/giampaolo/psutil/issues/1678
.. _1679: https://github.com/giampaolo/psutil/issues/1679
.. _1680: https://github.com/giampaolo/psutil/issues/1680
.. _1681: https://github.com/giampaolo/psutil/issues/1681
.. _1682: https://github.com/giampaolo/psutil/issues/1682
.. _1683: https://github.com/giampaolo/psutil/issues/1683
.. _1684: https://github.com/giampaolo/psutil/issues/1684
.. _1685: https://github.com/giampaolo/psutil/issues/1685
.. _1686: https://github.com/giampaolo/psutil/issues/1686
.. _1687: https://github.com/giampaolo/psutil/issues/1687
.. _1688: https://github.com/giampaolo/psutil/issues/1688
.. _1689: https://github.com/giampaolo/psutil/issues/1689
.. _1690: https://github.com/giampaolo/psutil/issues/1690
.. _1691: https://github.com/giampaolo/psutil/issues/1691
.. _1692: https://github.com/giampaolo/psutil/issues/1692
.. _1693: https://github.com/giampaolo/psutil/issues/1693
.. _1694: https://github.com/giampaolo/psutil/issues/1694
.. _1695: https://github.com/giampaolo/psutil/issues/1695
.. _1696: https://github.com/giampaolo/psutil/issues/1696
.. _1697: https://github.com/giampaolo/psutil/issues/1697
.. _1698: https://github.com/giampaolo/psutil/issues/1698
.. _1699: https://github.com/giampaolo/psutil/issues/1699
.. _1700: https://github.com/giampaolo/psutil/issues/1700
.. _1701: https://github.com/giampaolo/psutil/issues/1701
.. _1702: https://github.com/giampaolo/psutil/issues/1702
.. _1703: https://github.com/giampaolo/psutil/issues/1703
.. _1704: https://github.com/giampaolo/psutil/issues/1704
.. _1705: https://github.com/giampaolo/psutil/issues/1705
.. _1706: https://github.com/giampaolo/psutil/issues/1706
.. _1707: https://github.com/giampaolo/psutil/issues/1707
.. _1708: https://github.com/giampaolo/psutil/issues/1708
.. _1709: https://github.com/giampaolo/psutil/issues/1709
.. _1710: https://github.com/giampaolo/psutil/issues/1710
.. _1711: https://github.com/giampaolo/psutil/issues/1711
.. _1712: https://github.com/giampaolo/psutil/issues/1712
.. _1713: https://github.com/giampaolo/psutil/issues/1713
.. _1714: https://github.com/giampaolo/psutil/issues/1714
.. _1715: https://github.com/giampaolo/psutil/issues/1715
.. _1716: https://github.com/giampaolo/psutil/issues/1716
.. _1717: https://github.com/giampaolo/psutil/issues/1717
.. _1718: https://github.com/giampaolo/psutil/issues/1718
.. _1719: https://github.com/giampaolo/psutil/issues/1719
.. _1720: https://github.com/giampaolo/psutil/issues/1720
.. _1721: https://github.com/giampaolo/psutil/issues/1721
.. _1722: https://github.com/giampaolo/psutil/issues/1722
.. _1723: https://github.com/giampaolo/psutil/issues/1723
.. _1724: https://github.com/giampaolo/psutil/issues/1724
.. _1725: https://github.com/giampaolo/psutil/issues/1725
.. _1726: https://github.com/giampaolo/psutil/issues/1726
.. _1727: https://github.com/giampaolo/psutil/issues/1727
.. _1728: https://github.com/giampaolo/psutil/issues/1728
.. _1729: https://github.com/giampaolo/psutil/issues/1729
.. _1730: https://github.com/giampaolo/psutil/issues/1730
.. _1731: https://github.com/giampaolo/psutil/issues/1731
.. _1732: https://github.com/giampaolo/psutil/issues/1732
.. _1733: https://github.com/giampaolo/psutil/issues/1733
.. _1734: https://github.com/giampaolo/psutil/issues/1734
.. _1735: https://github.com/giampaolo/psutil/issues/1735
.. _1736: https://github.com/giampaolo/psutil/issues/1736
.. _1737: https://github.com/giampaolo/psutil/issues/1737
.. _1738: https://github.com/giampaolo/psutil/issues/1738
.. _1739: https://github.com/giampaolo/psutil/issues/1739
.. _1740: https://github.com/giampaolo/psutil/issues/1740
.. _1741: https://github.com/giampaolo/psutil/issues/1741
.. _1742: https://github.com/giampaolo/psutil/issues/1742
.. _1743: https://github.com/giampaolo/psutil/issues/1743
.. _1744: https://github.com/giampaolo/psutil/issues/1744
.. _1745: https://github.com/giampaolo/psutil/issues/1745
.. _1746: https://github.com/giampaolo/psutil/issues/1746
.. _1747: https://github.com/giampaolo/psutil/issues/1747
.. _1748: https://github.com/giampaolo/psutil/issues/1748
.. _1749: https://github.com/giampaolo/psutil/issues/1749
.. _1750: https://github.com/giampaolo/psutil/issues/1750
.. _1751: https://github.com/giampaolo/psutil/issues/1751
.. _1752: https://github.com/giampaolo/psutil/issues/1752
.. _1753: https://github.com/giampaolo/psutil/issues/1753
.. _1754: https://github.com/giampaolo/psutil/issues/1754
.. _1755: https://github.com/giampaolo/psutil/issues/1755
.. _1756: https://github.com/giampaolo/psutil/issues/1756
.. _1757: https://github.com/giampaolo/psutil/issues/1757
.. _1758: https://github.com/giampaolo/psutil/issues/1758
.. _1759: https://github.com/giampaolo/psutil/issues/1759
.. _1760: https://github.com/giampaolo/psutil/issues/1760
.. _1761: https://github.com/giampaolo/psutil/issues/1761
.. _1762: https://github.com/giampaolo/psutil/issues/1762
.. _1763: https://github.com/giampaolo/psutil/issues/1763
.. _1764: https://github.com/giampaolo/psutil/issues/1764
.. _1765: https://github.com/giampaolo/psutil/issues/1765
.. _1766: https://github.com/giampaolo/psutil/issues/1766
.. _1767: https://github.com/giampaolo/psutil/issues/1767
.. _1768: https://github.com/giampaolo/psutil/issues/1768
.. _1769: https://github.com/giampaolo/psutil/issues/1769
.. _1770: https://github.com/giampaolo/psutil/issues/1770
.. _1771: https://github.com/giampaolo/psutil/issues/1771
.. _1772: https://github.com/giampaolo/psutil/issues/1772
.. _1773: https://github.com/giampaolo/psutil/issues/1773
.. _1774: https://github.com/giampaolo/psutil/issues/1774
.. _1775: https://github.com/giampaolo/psutil/issues/1775
.. _1776: https://github.com/giampaolo/psutil/issues/1776
.. _1777: https://github.com/giampaolo/psutil/issues/1777
.. _1778: https://github.com/giampaolo/psutil/issues/1778
.. _1779: https://github.com/giampaolo/psutil/issues/1779
.. _1780: https://github.com/giampaolo/psutil/issues/1780
.. _1781: https://github.com/giampaolo/psutil/issues/1781
.. _1782: https://github.com/giampaolo/psutil/issues/1782
.. _1783: https://github.com/giampaolo/psutil/issues/1783
.. _1784: https://github.com/giampaolo/psutil/issues/1784
.. _1785: https://github.com/giampaolo/psutil/issues/1785
.. _1786: https://github.com/giampaolo/psutil/issues/1786
.. _1787: https://github.com/giampaolo/psutil/issues/1787
.. _1788: https://github.com/giampaolo/psutil/issues/1788
.. _1789: https://github.com/giampaolo/psutil/issues/1789
.. _1790: https://github.com/giampaolo/psutil/issues/1790
.. _1791: https://github.com/giampaolo/psutil/issues/1791
.. _1792: https://github.com/giampaolo/psutil/issues/1792
.. _1793: https://github.com/giampaolo/psutil/issues/1793
.. _1794: https://github.com/giampaolo/psutil/issues/1794
.. _1795: https://github.com/giampaolo/psutil/issues/1795
.. _1796: https://github.com/giampaolo/psutil/issues/1796
.. _1797: https://github.com/giampaolo/psutil/issues/1797
.. _1798: https://github.com/giampaolo/psutil/issues/1798
.. _1799: https://github.com/giampaolo/psutil/issues/1799
.. _1800: https://github.com/giampaolo/psutil/issues/1800
.. _1801: https://github.com/giampaolo/psutil/issues/1801
.. _1802: https://github.com/giampaolo/psutil/issues/1802
.. _1803: https://github.com/giampaolo/psutil/issues/1803
.. _1804: https://github.com/giampaolo/psutil/issues/1804
.. _1805: https://github.com/giampaolo/psutil/issues/1805
.. _1806: https://github.com/giampaolo/psutil/issues/1806
.. _1807: https://github.com/giampaolo/psutil/issues/1807
.. _1808: https://github.com/giampaolo/psutil/issues/1808
.. _1809: https://github.com/giampaolo/psutil/issues/1809
.. _1810: https://github.com/giampaolo/psutil/issues/1810
.. _1811: https://github.com/giampaolo/psutil/issues/1811
.. _1812: https://github.com/giampaolo/psutil/issues/1812
.. _1813: https://github.com/giampaolo/psutil/issues/1813
.. _1814: https://github.com/giampaolo/psutil/issues/1814
.. _1815: https://github.com/giampaolo/psutil/issues/1815
.. _1816: https://github.com/giampaolo/psutil/issues/1816
.. _1817: https://github.com/giampaolo/psutil/issues/1817
.. _1818: https://github.com/giampaolo/psutil/issues/1818
.. _1819: https://github.com/giampaolo/psutil/issues/1819
.. _1820: https://github.com/giampaolo/psutil/issues/1820
.. _1821: https://github.com/giampaolo/psutil/issues/1821
.. _1822: https://github.com/giampaolo/psutil/issues/1822
.. _1823: https://github.com/giampaolo/psutil/issues/1823
.. _1824: https://github.com/giampaolo/psutil/issues/1824
.. _1825: https://github.com/giampaolo/psutil/issues/1825
.. _1826: https://github.com/giampaolo/psutil/issues/1826
.. _1827: https://github.com/giampaolo/psutil/issues/1827
.. _1828: https://github.com/giampaolo/psutil/issues/1828
.. _1829: https://github.com/giampaolo/psutil/issues/1829
.. _1830: https://github.com/giampaolo/psutil/issues/1830
.. _1831: https://github.com/giampaolo/psutil/issues/1831
.. _1832: https://github.com/giampaolo/psutil/issues/1832
.. _1833: https://github.com/giampaolo/psutil/issues/1833
.. _1834: https://github.com/giampaolo/psutil/issues/1834
.. _1835: https://github.com/giampaolo/psutil/issues/1835
.. _1836: https://github.com/giampaolo/psutil/issues/1836
.. _1837: https://github.com/giampaolo/psutil/issues/1837
.. _1838: https://github.com/giampaolo/psutil/issues/1838
.. _1839: https://github.com/giampaolo/psutil/issues/1839
.. _1840: https://github.com/giampaolo/psutil/issues/1840
.. _1841: https://github.com/giampaolo/psutil/issues/1841
.. _1842: https://github.com/giampaolo/psutil/issues/1842
.. _1843: https://github.com/giampaolo/psutil/issues/1843
.. _1844: https://github.com/giampaolo/psutil/issues/1844
.. _1845: https://github.com/giampaolo/psutil/issues/1845
.. _1846: https://github.com/giampaolo/psutil/issues/1846
.. _1847: https://github.com/giampaolo/psutil/issues/1847
.. _1848: https://github.com/giampaolo/psutil/issues/1848
.. _1849: https://github.com/giampaolo/psutil/issues/1849
.. _1850: https://github.com/giampaolo/psutil/issues/1850
.. _1851: https://github.com/giampaolo/psutil/issues/1851
.. _1852: https://github.com/giampaolo/psutil/issues/1852
.. _1853: https://github.com/giampaolo/psutil/issues/1853
.. _1854: https://github.com/giampaolo/psutil/issues/1854
.. _1855: https://github.com/giampaolo/psutil/issues/1855
.. _1856: https://github.com/giampaolo/psutil/issues/1856
.. _1857: https://github.com/giampaolo/psutil/issues/1857
.. _1858: https://github.com/giampaolo/psutil/issues/1858
.. _1859: https://github.com/giampaolo/psutil/issues/1859
.. _1860: https://github.com/giampaolo/psutil/issues/1860
.. _1861: https://github.com/giampaolo/psutil/issues/1861
.. _1862: https://github.com/giampaolo/psutil/issues/1862
.. _1863: https://github.com/giampaolo/psutil/issues/1863
.. _1864: https://github.com/giampaolo/psutil/issues/1864
.. _1865: https://github.com/giampaolo/psutil/issues/1865
.. _1866: https://github.com/giampaolo/psutil/issues/1866
.. _1867: https://github.com/giampaolo/psutil/issues/1867
.. _1868: https://github.com/giampaolo/psutil/issues/1868
.. _1869: https://github.com/giampaolo/psutil/issues/1869
.. _1870: https://github.com/giampaolo/psutil/issues/1870
.. _1871: https://github.com/giampaolo/psutil/issues/1871
.. _1872: https://github.com/giampaolo/psutil/issues/1872
.. _1873: https://github.com/giampaolo/psutil/issues/1873
.. _1874: https://github.com/giampaolo/psutil/issues/1874
.. _1875: https://github.com/giampaolo/psutil/issues/1875
.. _1876: https://github.com/giampaolo/psutil/issues/1876
.. _1877: https://github.com/giampaolo/psutil/issues/1877
.. _1878: https://github.com/giampaolo/psutil/issues/1878
.. _1879: https://github.com/giampaolo/psutil/issues/1879
.. _1880: https://github.com/giampaolo/psutil/issues/1880
.. _1881: https://github.com/giampaolo/psutil/issues/1881
.. _1882: https://github.com/giampaolo/psutil/issues/1882
.. _1883: https://github.com/giampaolo/psutil/issues/1883
.. _1884: https://github.com/giampaolo/psutil/issues/1884
.. _1885: https://github.com/giampaolo/psutil/issues/1885
.. _1886: https://github.com/giampaolo/psutil/issues/1886
.. _1887: https://github.com/giampaolo/psutil/issues/1887
.. _1888: https://github.com/giampaolo/psutil/issues/1888
.. _1889: https://github.com/giampaolo/psutil/issues/1889
.. _1890: https://github.com/giampaolo/psutil/issues/1890
.. _1891: https://github.com/giampaolo/psutil/issues/1891
.. _1892: https://github.com/giampaolo/psutil/issues/1892
.. _1893: https://github.com/giampaolo/psutil/issues/1893
.. _1894: https://github.com/giampaolo/psutil/issues/1894
.. _1895: https://github.com/giampaolo/psutil/issues/1895
.. _1896: https://github.com/giampaolo/psutil/issues/1896
.. _1897: https://github.com/giampaolo/psutil/issues/1897
.. _1898: https://github.com/giampaolo/psutil/issues/1898
.. _1899: https://github.com/giampaolo/psutil/issues/1899
.. _1900: https://github.com/giampaolo/psutil/issues/1900
.. _1901: https://github.com/giampaolo/psutil/issues/1901
.. _1902: https://github.com/giampaolo/psutil/issues/1902
.. _1903: https://github.com/giampaolo/psutil/issues/1903
.. _1904: https://github.com/giampaolo/psutil/issues/1904
.. _1905: https://github.com/giampaolo/psutil/issues/1905
.. _1906: https://github.com/giampaolo/psutil/issues/1906
.. _1907: https://github.com/giampaolo/psutil/issues/1907
.. _1908: https://github.com/giampaolo/psutil/issues/1908
.. _1909: https://github.com/giampaolo/psutil/issues/1909
.. _1910: https://github.com/giampaolo/psutil/issues/1910
.. _1911: https://github.com/giampaolo/psutil/issues/1911
.. _1912: https://github.com/giampaolo/psutil/issues/1912
.. _1913: https://github.com/giampaolo/psutil/issues/1913
.. _1914: https://github.com/giampaolo/psutil/issues/1914
.. _1915: https://github.com/giampaolo/psutil/issues/1915
.. _1916: https://github.com/giampaolo/psutil/issues/1916
.. _1917: https://github.com/giampaolo/psutil/issues/1917
.. _1918: https://github.com/giampaolo/psutil/issues/1918
.. _1919: https://github.com/giampaolo/psutil/issues/1919
.. _1920: https://github.com/giampaolo/psutil/issues/1920
.. _1921: https://github.com/giampaolo/psutil/issues/1921
.. _1922: https://github.com/giampaolo/psutil/issues/1922
.. _1923: https://github.com/giampaolo/psutil/issues/1923
.. _1924: https://github.com/giampaolo/psutil/issues/1924
.. _1925: https://github.com/giampaolo/psutil/issues/1925
.. _1926: https://github.com/giampaolo/psutil/issues/1926
.. _1927: https://github.com/giampaolo/psutil/issues/1927
.. _1928: https://github.com/giampaolo/psutil/issues/1928
.. _1929: https://github.com/giampaolo/psutil/issues/1929
.. _1930: https://github.com/giampaolo/psutil/issues/1930
.. _1931: https://github.com/giampaolo/psutil/issues/1931
.. _1932: https://github.com/giampaolo/psutil/issues/1932
.. _1933: https://github.com/giampaolo/psutil/issues/1933
.. _1934: https://github.com/giampaolo/psutil/issues/1934
.. _1935: https://github.com/giampaolo/psutil/issues/1935
.. _1936: https://github.com/giampaolo/psutil/issues/1936
.. _1937: https://github.com/giampaolo/psutil/issues/1937
.. _1938: https://github.com/giampaolo/psutil/issues/1938
.. _1939: https://github.com/giampaolo/psutil/issues/1939
.. _1940: https://github.com/giampaolo/psutil/issues/1940
.. _1941: https://github.com/giampaolo/psutil/issues/1941
.. _1942: https://github.com/giampaolo/psutil/issues/1942
.. _1943: https://github.com/giampaolo/psutil/issues/1943
.. _1944: https://github.com/giampaolo/psutil/issues/1944
.. _1945: https://github.com/giampaolo/psutil/issues/1945
.. _1946: https://github.com/giampaolo/psutil/issues/1946
.. _1947: https://github.com/giampaolo/psutil/issues/1947
.. _1948: https://github.com/giampaolo/psutil/issues/1948
.. _1949: https://github.com/giampaolo/psutil/issues/1949
.. _1950: https://github.com/giampaolo/psutil/issues/1950
.. _1951: https://github.com/giampaolo/psutil/issues/1951
.. _1952: https://github.com/giampaolo/psutil/issues/1952
.. _1953: https://github.com/giampaolo/psutil/issues/1953
.. _1954: https://github.com/giampaolo/psutil/issues/1954
.. _1955: https://github.com/giampaolo/psutil/issues/1955
.. _1956: https://github.com/giampaolo/psutil/issues/1956
.. _1957: https://github.com/giampaolo/psutil/issues/1957
.. _1958: https://github.com/giampaolo/psutil/issues/1958
.. _1959: https://github.com/giampaolo/psutil/issues/1959
.. _1960: https://github.com/giampaolo/psutil/issues/1960
.. _1961: https://github.com/giampaolo/psutil/issues/1961
.. _1962: https://github.com/giampaolo/psutil/issues/1962
.. _1963: https://github.com/giampaolo/psutil/issues/1963
.. _1964: https://github.com/giampaolo/psutil/issues/1964
.. _1965: https://github.com/giampaolo/psutil/issues/1965
.. _1966: https://github.com/giampaolo/psutil/issues/1966
.. _1967: https://github.com/giampaolo/psutil/issues/1967
.. _1968: https://github.com/giampaolo/psutil/issues/1968
.. _1969: https://github.com/giampaolo/psutil/issues/1969
.. _1970: https://github.com/giampaolo/psutil/issues/1970
.. _1971: https://github.com/giampaolo/psutil/issues/1971
.. _1972: https://github.com/giampaolo/psutil/issues/1972
.. _1973: https://github.com/giampaolo/psutil/issues/1973
.. _1974: https://github.com/giampaolo/psutil/issues/1974
.. _1975: https://github.com/giampaolo/psutil/issues/1975
.. _1976: https://github.com/giampaolo/psutil/issues/1976
.. _1977: https://github.com/giampaolo/psutil/issues/1977
.. _1978: https://github.com/giampaolo/psutil/issues/1978
.. _1979: https://github.com/giampaolo/psutil/issues/1979
.. _1980: https://github.com/giampaolo/psutil/issues/1980
.. _1981: https://github.com/giampaolo/psutil/issues/1981
.. _1982: https://github.com/giampaolo/psutil/issues/1982
.. _1983: https://github.com/giampaolo/psutil/issues/1983
.. _1984: https://github.com/giampaolo/psutil/issues/1984
.. _1985: https://github.com/giampaolo/psutil/issues/1985
.. _1986: https://github.com/giampaolo/psutil/issues/1986
.. _1987: https://github.com/giampaolo/psutil/issues/1987
.. _1988: https://github.com/giampaolo/psutil/issues/1988
.. _1989: https://github.com/giampaolo/psutil/issues/1989
.. _1990: https://github.com/giampaolo/psutil/issues/1990
.. _1991: https://github.com/giampaolo/psutil/issues/1991
.. _1992: https://github.com/giampaolo/psutil/issues/1992
.. _1993: https://github.com/giampaolo/psutil/issues/1993
.. _1994: https://github.com/giampaolo/psutil/issues/1994
.. _1995: https://github.com/giampaolo/psutil/issues/1995
.. _1996: https://github.com/giampaolo/psutil/issues/1996
.. _1997: https://github.com/giampaolo/psutil/issues/1997
.. _1998: https://github.com/giampaolo/psutil/issues/1998
.. _1999: https://github.com/giampaolo/psutil/issues/1999
.. _2000: https://github.com/giampaolo/psutil/issues/2000
PK�(�\�ty�N�N"doc/alt-python37-psutil/README.rstnu�[���|  |downloads| |stars| |forks| |contributors| |coverage| |quality|
|  |version| |py-versions| |packages| |license|
|  |github-actions| |appveyor| |doc| |twitter| |tidelift|

.. |downloads| image:: https://img.shields.io/pypi/dm/psutil.svg
    :target: https://pepy.tech/project/psutil
    :alt: Downloads

.. |stars| image:: https://img.shields.io/github/stars/giampaolo/psutil.svg
    :target: https://github.com/giampaolo/psutil/stargazers
    :alt: Github stars

.. |forks| image:: https://img.shields.io/github/forks/giampaolo/psutil.svg
    :target: https://github.com/giampaolo/psutil/network/members
    :alt: Github forks

.. |contributors| image:: https://img.shields.io/github/contributors/giampaolo/psutil.svg
    :target: https://github.com/giampaolo/psutil/graphs/contributors
    :alt: Contributors

.. |quality| image:: https://img.shields.io/codacy/grade/ce63e7f7f69d44b5b59682196e6fbfca.svg
    :target: https://www.codacy.com/app/g-rodola/psutil?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=giampaolo/psutil&amp;utm_campaign=Badge_Grade
    :alt: Code quality

.. |github-actions| image:: https://img.shields.io/github/workflow/status/giampaolo/psutil/CI?label=Linux%2C%20macOS%2C%20FreeBSD
    :target: https://github.com/giampaolo/psutil/actions?query=workflow%3ACI
    :alt: Linux, macOS, Windows tests

.. |appveyor| image:: https://img.shields.io/appveyor/ci/giampaolo/psutil/master.svg?maxAge=3600&label=Windows
    :target: https://ci.appveyor.com/project/giampaolo/psutil
    :alt: Windows tests (Appveyor)

.. |coverage| image:: https://coveralls.io/repos/github/giampaolo/psutil/badge.svg?branch=master
    :target: https://coveralls.io/github/giampaolo/psutil?branch=master
    :alt: Test coverage (coverall.io)

.. |doc| image:: https://readthedocs.org/projects/psutil/badge/?version=latest
    :target: http://psutil.readthedocs.io/en/latest/?badge=latest
    :alt: Documentation Status

.. |version| image:: https://img.shields.io/pypi/v/psutil.svg?label=pypi
    :target: https://pypi.org/project/psutil
    :alt: Latest version

.. |py-versions| image:: https://img.shields.io/pypi/pyversions/psutil.svg
    :target: https://pypi.org/project/psutil
    :alt: Supported Python versions

.. |packages| image:: https://repology.org/badge/tiny-repos/python:psutil.svg
    :target: https://repology.org/metapackage/python:psutil/versions
    :alt: Binary packages

.. |license| image:: https://img.shields.io/pypi/l/psutil.svg
    :target: https://github.com/giampaolo/psutil/blob/master/LICENSE
    :alt: License

.. |twitter| image:: https://img.shields.io/twitter/follow/grodola.svg?label=follow&style=flat&logo=twitter&logoColor=4FADFF
    :target: https://twitter.com/grodola
    :alt: Twitter Follow

.. |tidelift| image:: https://tidelift.com/badges/github/giampaolo/psutil?style=flat
    :target: https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme
    :alt: Tidelift

-----

.. raw:: html

    <div align="center">
        <a href="https://github.com/giampaolo/psutil"><img src="https://github.com/giampaolo/psutil/raw/master/docs/_static/psutil-logo.png" /></a>
        <br />
        <br />
        <a href="https://github.com/giampaolo/psutil"><b>Home</b></a>&nbsp;&nbsp;&nbsp;
        <a href="https://github.com/giampaolo/psutil/blob/master/INSTALL.rst"><b>Install</b></a>&nbsp;&nbsp;&nbsp;
        <a href="https://psutil.readthedocs.io/"><b>Documentation</b></a>&nbsp;&nbsp;&nbsp;
        <a href="https://pypi.org/project/psutil/#files"><b>Download</b></a>&nbsp;&nbsp;&nbsp;
        <a href="https://groups.google.com/g/psutil"><b>Forum</b></a>&nbsp;&nbsp;&nbsp;
        <a href="https://gmpy.dev/tags/psutil"><b>Blog</b></a>&nbsp;&nbsp;&nbsp;
        <a href="#funding"><b>Funding</b></a>&nbsp;&nbsp;&nbsp;
        <a href="https://github.com/giampaolo/psutil/blob/master/HISTORY.rst"><b>What's new</b></a>&nbsp;&nbsp;&nbsp;
    </div>

Summary
=======

psutil (process and system utilities) is a cross-platform library for
retrieving information on **running processes** and **system utilization**
(CPU, memory, disks, network, sensors) in Python.
It is useful mainly for **system monitoring**, **profiling and limiting process
resources** and **management of running processes**.
It implements many functionalities offered by classic UNIX command line tools
such as *ps, top, iotop, lsof, netstat, ifconfig, free* and others.
psutil currently supports the following platforms:

- **Linux**
- **Windows**
- **macOS**
- **FreeBSD, OpenBSD**, **NetBSD**
- **Sun Solaris**
- **AIX**

Supported Python versions are **2.6**, **2.7**, **3.4+** and
`PyPy <http://pypy.org/>`__.

Funding
=======

While psutil is free software and will always be, the project would benefit
immensely from some funding.
Keeping up with bug reports and maintenance has become hardly sustainable for
me alone in terms of time.
If you're a company that's making significant use of psutil you can consider
becoming a sponsor via `GitHub <https://github.com/sponsors/giampaolo>`__,
`Open Collective <https://opencollective.com/psutil>`__ or
`PayPal <https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A9ZS7PKKRM3S8>`__
and have your logo displayed in here and psutil `doc <https://psutil.readthedocs.io>`__.

Sponsors
========

.. raw:: html

    <div>
        <a href="https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme">
            <img src="https://github.com/giampaolo/psutil/raw/master/docs/_static/tidelift-logo.png" />
        </a>
    </div>
    <sup><a href="https://github.com/sponsors/giampaolo">add your logo</a></sup>

Supporters
==========

None yet.

.. raw:: html

    <sup><a href="https://github.com/sponsors/giampaolo">add your avatar</a></sup>

Contributing
============

See `CONTRIBUTING.md <https://github.com/giampaolo/psutil/blob/master/CONTRIBUTING.md>`__ guidelines.

Example usages
==============

This represents pretty much the whole psutil API.

CPU
---

.. code-block:: python

    >>> import psutil
    >>>
    >>> psutil.cpu_times()
    scputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540, iowait=629.59, irq=0.0, softirq=19.42, steal=0.0, guest=0, nice=0.0)
    >>>
    >>> for x in range(3):
    ...     psutil.cpu_percent(interval=1)
    ...
    4.0
    5.9
    3.8
    >>>
    >>> for x in range(3):
    ...     psutil.cpu_percent(interval=1, percpu=True)
    ...
    [4.0, 6.9, 3.7, 9.2]
    [7.0, 8.5, 2.4, 2.1]
    [1.2, 9.0, 9.9, 7.2]
    >>>
    >>> for x in range(3):
    ...     psutil.cpu_times_percent(interval=1, percpu=False)
    ...
    scputimes(user=1.5, nice=0.0, system=0.5, idle=96.5, iowait=1.5, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
    scputimes(user=1.0, nice=0.0, system=0.0, idle=99.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
    scputimes(user=2.0, nice=0.0, system=0.0, idle=98.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
    >>>
    >>> psutil.cpu_count()
    4
    >>> psutil.cpu_count(logical=False)
    2
    >>>
    >>> psutil.cpu_stats()
    scpustats(ctx_switches=20455687, interrupts=6598984, soft_interrupts=2134212, syscalls=0)
    >>>
    >>> psutil.cpu_freq()
    scpufreq(current=931.42925, min=800.0, max=3500.0)
    >>>
    >>> psutil.getloadavg()  # also on Windows (emulated)
    (3.14, 3.89, 4.67)

Memory
------

.. code-block:: python

    >>> psutil.virtual_memory()
    svmem(total=10367352832, available=6472179712, percent=37.6, used=8186245120, free=2181107712, active=4748992512, inactive=2758115328, buffers=790724608, cached=3500347392, shared=787554304)
    >>> psutil.swap_memory()
    sswap(total=2097147904, used=296128512, free=1801019392, percent=14.1, sin=304193536, sout=677842944)
    >>>

Disks
-----

.. code-block:: python

    >>> psutil.disk_partitions()
    [sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid', maxfile=255, maxpath=4096),
     sdiskpart(device='/dev/sda2', mountpoint='/home', fstype='ext, opts='rw', maxfile=255, maxpath=4096)]
    >>>
    >>> psutil.disk_usage('/')
    sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)
    >>>
    >>> psutil.disk_io_counters(perdisk=False)
    sdiskio(read_count=719566, write_count=1082197, read_bytes=18626220032, write_bytes=24081764352, read_time=5023392, write_time=63199568, read_merged_count=619166, write_merged_count=812396, busy_time=4523412)
    >>>

Network
-------

.. code-block:: python

    >>> psutil.net_io_counters(pernic=True)
    {'eth0': netio(bytes_sent=485291293, bytes_recv=6004858642, packets_sent=3251564, packets_recv=4787798, errin=0, errout=0, dropin=0, dropout=0),
     'lo': netio(bytes_sent=2838627, bytes_recv=2838627, packets_sent=30567, packets_recv=30567, errin=0, errout=0, dropin=0, dropout=0)}
    >>>
    >>> psutil.net_connections(kind='tcp')
    [sconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED', pid=1254),
     sconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING', pid=2987),
     ...]
    >>>
    >>> psutil.net_if_addrs()
    {'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast='127.0.0.1', ptp=None),
            snicaddr(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),
            snicaddr(family=<AddressFamily.AF_LINK: 17>, address='00:00:00:00:00:00', netmask=None, broadcast='00:00:00:00:00:00', ptp=None)],
     'wlan0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.1.3', netmask='255.255.255.0', broadcast='192.168.1.255', ptp=None),
               snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::c685:8ff:fe45:641%wlan0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None),
               snicaddr(family=<AddressFamily.AF_LINK: 17>, address='c4:85:08:45:06:41', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}
    >>>
    >>> psutil.net_if_stats()
    {'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536),
     'wlan0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=100, mtu=1500)}
    >>>

Sensors
-------

.. code-block:: python

    >>> import psutil
    >>> psutil.sensors_temperatures()
    {'acpitz': [shwtemp(label='', current=47.0, high=103.0, critical=103.0)],
     'asus': [shwtemp(label='', current=47.0, high=None, critical=None)],
     'coretemp': [shwtemp(label='Physical id 0', current=52.0, high=100.0, critical=100.0),
                  shwtemp(label='Core 0', current=45.0, high=100.0, critical=100.0)]}
    >>>
    >>> psutil.sensors_fans()
    {'asus': [sfan(label='cpu_fan', current=3200)]}
    >>>
    >>> psutil.sensors_battery()
    sbattery(percent=93, secsleft=16628, power_plugged=False)
    >>>

Other system info
-----------------

.. code-block:: python

    >>> import psutil
    >>> psutil.users()
    [suser(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0, pid=1352),
     suser(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0, pid=1788)]
    >>>
    >>> psutil.boot_time()
    1365519115.0
    >>>

Process management
------------------

.. code-block:: python

    >>> import psutil
    >>> psutil.pids()
    [1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224, 268, 1215,
     1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355, 2637, 2774, 3932,
     4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 4263, 4282, 4306, 4311,
     4312, 4313, 4314, 4337, 4339, 4357, 4358, 4363, 4383, 4395, 4408, 4433,
     4443, 4445, 4446, 5167, 5234, 5235, 5252, 5318, 5424, 5644, 6987, 7054,
     7055, 7071]
    >>>
    >>> p = psutil.Process(7055)
    >>> p
    psutil.Process(pid=7055, name='python3', status='running', started='09:04:44')
    >>> p.name()
    'python'
    >>> p.exe()
    '/usr/bin/python'
    >>> p.cwd()
    '/home/giampaolo'
    >>> p.cmdline()
    ['/usr/bin/python', 'main.py']
    >>>
    >>> p.pid
    7055
    >>> p.ppid()
    7054
    >>> p.children(recursive=True)
    [psutil.Process(pid=29835, name='python3', status='sleeping', started='11:45:38'),
     psutil.Process(pid=29836, name='python3', status='waking', started='11:43:39')]
    >>>
    >>> p.parent()
    psutil.Process(pid=4699, name='bash', status='sleeping', started='09:06:44')
    >>> p.parents()
    [psutil.Process(pid=4699, name='bash', started='09:06:44'),
     psutil.Process(pid=4689, name='gnome-terminal-server', status='sleeping', started='0:06:44'),
     psutil.Process(pid=1, name='systemd', status='sleeping', started='05:56:55')]
    >>>
    >>> p.status()
    'running'
    >>> p.username()
    'giampaolo'
    >>> p.create_time()
    1267551141.5019531
    >>> p.terminal()
    '/dev/pts/0'
    >>>
    >>> p.uids()
    puids(real=1000, effective=1000, saved=1000)
    >>> p.gids()
    pgids(real=1000, effective=1000, saved=1000)
    >>>
    >>> p.cpu_times()
    pcputimes(user=1.02, system=0.31, children_user=0.32, children_system=0.1, iowait=0.0)
    >>> p.cpu_percent(interval=1.0)
    12.1
    >>> p.cpu_affinity()
    [0, 1, 2, 3]
    >>> p.cpu_affinity([0, 1])  # set
    >>> p.cpu_num()
    1
    >>>
    >>> p.memory_info()
    pmem(rss=10915840, vms=67608576, shared=3313664, text=2310144, lib=0, data=7262208, dirty=0)
    >>> p.memory_full_info()  # "real" USS memory usage (Linux, macOS, Win only)
    pfullmem(rss=10199040, vms=52133888, shared=3887104, text=2867200, lib=0, data=5967872, dirty=0, uss=6545408, pss=6872064, swap=0)
    >>> p.memory_percent()
    0.7823
    >>> p.memory_maps()
    [pmmap_grouped(path='/lib/x8664-linux-gnu/libutil-2.15.so', rss=32768, size=2125824, pss=32768, shared_clean=0, shared_dirty=0, private_clean=20480, private_dirty=12288, referenced=32768, anonymous=12288, swap=0),
     pmmap_grouped(path='/lib/x8664-linux-gnu/libc-2.15.so', rss=3821568, size=3842048, pss=3821568, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=3821568, referenced=3575808, anonymous=3821568, swap=0),
     pmmap_grouped(path='[heap]',  rss=32768, size=139264, pss=32768, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=32768, referenced=32768, anonymous=32768, swap=0),
     pmmap_grouped(path='[stack]', rss=2465792, size=2494464, pss=2465792, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=2465792, referenced=2277376, anonymous=2465792, swap=0),
     ...]
    >>>
    >>> p.io_counters()
    pio(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632, read_chars=456232, write_chars=517543)
    >>>
    >>> p.open_files()
    [popenfile(path='/home/giampaolo/monit.py', fd=3, position=0, mode='r', flags=32768),
     popenfile(path='/var/log/monit.log', fd=4, position=235542, mode='a', flags=33793)]
    >>>
    >>> p.connections(kind='tcp')
    [pconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED'),
     pconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING')]
    >>>
    >>> p.num_threads()
    4
    >>> p.num_fds()
    8
    >>> p.threads()
    [pthread(id=5234, user_time=22.5, system_time=9.2891),
     pthread(id=5237, user_time=0.0707, system_time=1.1)]
    >>>
    >>> p.num_ctx_switches()
    pctxsw(voluntary=78, involuntary=19)
    >>>
    >>> p.nice()
    0
    >>> p.nice(10)  # set
    >>>
    >>> p.ionice(psutil.IOPRIO_CLASS_IDLE)  # IO priority (Win and Linux only)
    >>> p.ionice()
    pionice(ioclass=<IOPriority.IOPRIO_CLASS_IDLE: 3>, value=0)
    >>>
    >>> p.rlimit(psutil.RLIMIT_NOFILE, (5, 5))  # set resource limits (Linux only)
    >>> p.rlimit(psutil.RLIMIT_NOFILE)
    (5, 5)
    >>>
    >>> p.environ()
    {'LC_PAPER': 'it_IT.UTF-8', 'SHELL': '/bin/bash', 'GREP_OPTIONS': '--color=auto',
    'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg',
     ...}
    >>>
    >>> p.as_dict()
    {'status': 'running', 'num_ctx_switches': pctxsw(voluntary=63, involuntary=1), 'pid': 5457, ...}
    >>> p.is_running()
    True
    >>> p.suspend()
    >>> p.resume()
    >>>
    >>> p.terminate()
    >>> p.kill()
    >>> p.wait(timeout=3)
    <Exitcode.EX_OK: 0>
    >>>
    >>> psutil.test()
    USER         PID %CPU %MEM     VSZ     RSS TTY        START    TIME  COMMAND
    root           1  0.0  0.0   24584    2240            Jun17   00:00  init
    root           2  0.0  0.0       0       0            Jun17   00:00  kthreadd
    ...
    giampaolo  31475  0.0  0.0   20760    3024 /dev/pts/0 Jun19   00:00  python2.4
    giampaolo  31721  0.0  2.2  773060  181896            00:04   10:30  chrome
    root       31763  0.0  0.0       0       0            00:05   00:00  kworker/0:1
    >>>

Further process APIs
--------------------

.. code-block:: python

    >>> import psutil
    >>> for proc in psutil.process_iter(['pid', 'name']):
    ...     print(proc.info)
    ...
    {'pid': 1, 'name': 'systemd'}
    {'pid': 2, 'name': 'kthreadd'}
    {'pid': 3, 'name': 'ksoftirqd/0'}
    ...
    >>>
    >>> psutil.pid_exists(3)
    True
    >>>
    >>> def on_terminate(proc):
    ...     print("process {} terminated".format(proc))
    ...
    >>> # waits for multiple processes to terminate
    >>> gone, alive = psutil.wait_procs(procs_list, timeout=3, callback=on_terminate)
    >>>

Popen wrapper:

.. code-block:: python

    >>> import psutil
    >>> from subprocess import PIPE
    >>> p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"], stdout=PIPE)
    >>> p.name()
    'python'
    >>> p.username()
    'giampaolo'
    >>> p.communicate()
    ('hello\n', None)
    >>> p.wait(timeout=2)
    0
    >>>

Windows services
----------------

.. code-block:: python

    >>> list(psutil.win_service_iter())
    [<WindowsService(name='AeLookupSvc', display_name='Application Experience') at 38850096>,
     <WindowsService(name='ALG', display_name='Application Layer Gateway Service') at 38850128>,
     <WindowsService(name='APNMCP', display_name='Ask Update Service') at 38850160>,
     <WindowsService(name='AppIDSvc', display_name='Application Identity') at 38850192>,
     ...]
    >>> s = psutil.win_service_get('alg')
    >>> s.as_dict()
    {'binpath': 'C:\\Windows\\System32\\alg.exe',
     'description': 'Provides support for 3rd party protocol plug-ins for Internet Connection Sharing',
     'display_name': 'Application Layer Gateway Service',
     'name': 'alg',
     'pid': None,
     'start_type': 'manual',
     'status': 'stopped',
     'username': 'NT AUTHORITY\\LocalService'}

Projects using psutil
=====================

Here's some I find particularly interesting:

- https://github.com/google/grr
- https://github.com/facebook/osquery/
- https://github.com/nicolargo/glances
- https://github.com/Jahaja/psdash
- https://github.com/ajenti/ajenti
- https://github.com/home-assistant/home-assistant/

Portings
========

- Go: https://github.com/shirou/gopsutil
- C: https://github.com/hamon-in/cpslib
- Rust: https://github.com/rust-psutil/rust-psutil
- Nim: https://github.com/johnscillieri/psutil-nim

Security
========

To report a security vulnerability, please use the `Tidelift security
contact`_.  Tidelift will coordinate the fix and disclosure.

.. _`Giampaolo Rodola`: https://gmpy.dev/about
.. _`donation`: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A9ZS7PKKRM3S8
.. _Tidelift security contact: https://tidelift.com/security
.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme
PK�(�\�Yďdoc/alt-python37-zipp/LICENSEnu�[���Copyright 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.
PK�(�\OF�X!doc/alt-python37-zipp/CHANGES.rstnu�[���v3.7.0
======

Require Python 3.7 or later.

v3.6.0
======

#78: Only ``Path`` is exposed in the public API.

v3.5.1
======

#77: Remove news file intended only for CPython.

v3.5.0
======

#74 and bpo-44095: Added ``.suffix``, ``.suffixes``,
and ``.stem`` properties.

v3.4.2
======

Refresh package metadata.

v3.4.1
======

Refresh packaging.

v3.4.0
======

#68 and bpo-42090: ``Path.joinpath`` now takes arbitrary
positional arguments and no longer accepts ``add`` as a
keyword argument.

v3.3.2
======

Updated project metadata including badges.

v3.3.1
======

bpo-42043: Add tests capturing subclassing requirements.

v3.3.0
======

#9: ``Path`` objects now expose a ``.filename`` attribute
and rely on that to resolve ``.name`` and ``.parent`` when
the ``Path`` object is at the root of the zipfile.

v3.2.0
======

#57 and bpo-40564: Mutate the passed ZipFile object
type instead of making a copy. Prevents issues when
both the local copy and the caller's copy attempt to
close the same file handle.

#56 and bpo-41035: ``Path._next`` now honors
subclasses.

#55: ``Path.is_file()`` now returns False for non-existent names.

v3.1.0
======

#47: ``.open`` now raises ``FileNotFoundError`` and
``IsADirectoryError`` when appropriate.

v3.0.0
======

#44: Merge with v1.2.0.

v1.2.0
======

#44: ``zipp.Path.open()`` now supports a compatible signature
as ``pathlib.Path.open()``, accepting text (default) or binary
modes and soliciting keyword parameters passed through to
``io.TextIOWrapper`` (encoding, newline, etc). The stream is
opened in text-mode by default now. ``open`` no
longer accepts ``pwd`` as a positional argument and does not
accept the ``force_zip64`` parameter at all. This change is
a backward-incompatible change for that single function.

v2.2.1
======

#43: Merge with v1.1.1.

v1.1.1
======

#43: Restored performance of implicit dir computation.

v2.2.0
======

#36: Rebuild package with minimum Python version declared both
in package metadata and in the python tag.

v2.1.0
======

#32: Merge with v1.1.0.

v1.1.0
======

#32: For read-only zip files, complexity of ``.exists`` and
``joinpath`` is now constant time instead of ``O(n)``, preventing
quadratic time in common use-cases and rendering large
zip files unusable for Path. Big thanks to Benjy Weinberger
for the bug report and contributed fix (#33).

v2.0.1
======

#30: Corrected version inference (from jaraco/skeleton#12).

v2.0.0
======

Require Python 3.6 or later.

v1.0.0
======

Re-release of 0.6 to correspond with release as found in
Python 3.8.

v0.6.0
======

#12: When adding implicit dirs, ensure that ancestral directories
are added and that duplicates are excluded.

The library now relies on
`more_itertools <https://pypi.org/project/more_itertools>`_.

v0.5.2
======

#7: Parent of a directory now actually returns the parent.

v0.5.1
======

Declared package as backport.

v0.5.0
======

Add ``.joinpath()`` method and ``.parent`` property.

Now a backport release of the ``zipfile.Path`` class.

v0.4.0
======

#4: Add support for zip files with implied directories.

v0.3.3
======

#3: Fix issue where ``.name`` on a directory was empty.

v0.3.2
======

#2: Fix TypeError on Python 2.7 when classic division is used.

v0.3.1
======

#1: Fix TypeError on Python 3.5 when joining to a path-like object.

v0.3.0
======

Add support for constructing a ``zipp.Path`` from any path-like
object.

``zipp.Path`` is now a new-style class on Python 2.7.

v0.2.1
======

Fix issue with ``__str__``.

v0.2.0
======

Drop reliance on future-fstrings.

v0.1.0
======

Initial release with basic functionality.
PK�(�\��k��� doc/alt-python37-zipp/README.rstnu�[���.. image:: https://img.shields.io/pypi/v/zipp.svg
   :target: `PyPI link`_

.. image:: https://img.shields.io/pypi/pyversions/zipp.svg
   :target: `PyPI link`_

.. _PyPI link: https://pypi.org/project/zipp

.. image:: https://github.com/jaraco/zipp/workflows/tests/badge.svg
   :target: https://github.com/jaraco/zipp/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://readthedocs.org/projects/skeleton/badge/?version=latest
..    :target: https://skeleton.readthedocs.io/en/latest/?badge=latest

.. image:: https://img.shields.io/badge/skeleton-2021-informational
   :target: https://blog.jaraco.com/skeleton


A pathlib-compatible Zipfile object wrapper. Official backport of the standard library
`Path object <https://docs.python.org/3.8/library/zipfile.html#path-objects>`_.
PK�(�\kr�e
e
"doc/alt-python-virtualenv/PKG-INFOnu�[���Metadata-Version: 2.1
Name: virtualenv
Version: 20.13.0
Summary: Virtual Python Environment builder
Home-page: https://virtualenv.pypa.io/
Author: Bernat Gabor
Author-email: gaborjbernat@gmail.com
Maintainer: Bernat Gabor
Maintainer-email: gaborjbernat@gmail.com
License: MIT
Project-URL: Source, https://github.com/pypa/virtualenv
Project-URL: Tracker, https://github.com/pypa/virtualenv/issues
Keywords: virtual,environments,isolated
Platform: any
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: MacOS :: MacOS X
Classifier: Operating System :: Microsoft :: Windows
Classifier: Operating System :: POSIX
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Software Development :: Testing
Classifier: Topic :: Utilities
Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7
Description-Content-Type: text/markdown
Provides-Extra: docs
Provides-Extra: testing
License-File: LICENSE

# virtualenv

[![PyPI](https://img.shields.io/pypi/v/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
[![PyPI - Implementation](https://img.shields.io/pypi/implementation/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
[![Documentation](https://readthedocs.org/projects/virtualenv/badge/?version=latest&style=flat-square)](http://virtualenv.pypa.io)
[![Discord](https://img.shields.io/discord/803025117553754132)](https://discord.gg/pypa)
[![PyPI - Downloads](https://img.shields.io/pypi/dm/virtualenv?style=flat-square)](https://pypistats.org/packages/virtualenv)
[![PyPI - License](https://img.shields.io/pypi/l/virtualenv?style=flat-square)](https://opensource.org/licenses/MIT)
[![Build Status](https://github.com/pypa/virtualenv/workflows/check/badge.svg?branch=main&event=push)](https://github.com/pypa/virtualenv/actions?query=workflow%3Acheck)
[![Code style:
black](https://img.shields.io/badge/code%20style-black-000000.svg?style=flat-square)](https://github.com/psf/black)

A tool for creating isolated `virtual` python environments.

- [Installation](https://virtualenv.pypa.io/en/latest/installation.html)
- [Documentation](https://virtualenv.pypa.io)
- [Changelog](https://virtualenv.pypa.io/en/latest/changelog.html)
- [Issues](https://github.com/pypa/virtualenv/issues)
- [PyPI](https://pypi.org/project/virtualenv)
- [Github](https://github.com/pypa/virtualenv)

## Code of Conduct

Everyone interacting in the virtualenv 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).


PK�(�\�=,22!doc/alt-python-virtualenv/LICENSEnu�[���Copyright (c) 2020-202x The virtualenv developers

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.
PK�(�\�ˈ���#doc/alt-python-virtualenv/README.mdnu�[���# virtualenv

[![PyPI](https://img.shields.io/pypi/v/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
[![PyPI - Implementation](https://img.shields.io/pypi/implementation/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
[![Documentation](https://readthedocs.org/projects/virtualenv/badge/?version=latest&style=flat-square)](http://virtualenv.pypa.io)
[![Discord](https://img.shields.io/discord/803025117553754132)](https://discord.gg/pypa)
[![PyPI - Downloads](https://img.shields.io/pypi/dm/virtualenv?style=flat-square)](https://pypistats.org/packages/virtualenv)
[![PyPI - License](https://img.shields.io/pypi/l/virtualenv?style=flat-square)](https://opensource.org/licenses/MIT)
[![Build Status](https://github.com/pypa/virtualenv/workflows/check/badge.svg?branch=main&event=push)](https://github.com/pypa/virtualenv/actions?query=workflow%3Acheck)
[![Code style:
black](https://img.shields.io/badge/code%20style-black-000000.svg?style=flat-square)](https://github.com/psf/black)

A tool for creating isolated `virtual` python environments.

- [Installation](https://virtualenv.pypa.io/en/latest/installation.html)
- [Documentation](https://virtualenv.pypa.io)
- [Changelog](https://virtualenv.pypa.io/en/latest/changelog.html)
- [Issues](https://github.com/pypa/virtualenv/issues)
- [PyPI](https://pypi.org/project/virtualenv)
- [Github](https://github.com/pypa/virtualenv)

## Code of Conduct

Everyone interacting in the virtualenv 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).
PK�(�\���(doc/alt-python-virtualenv/docs/index.rstnu�[���Virtualenv
==========

.. image:: https://img.shields.io/pypi/v/virtualenv?style=flat-square
  :target: https://pypi.org/project/virtualenv/#history
  :alt: Latest version on PyPI
.. image:: https://img.shields.io/pypi/implementation/virtualenv?style=flat-square
  :alt: PyPI - Implementation
.. image:: https://img.shields.io/pypi/pyversions/virtualenv?style=flat-square
  :alt: PyPI - Python Version
.. image:: https://readthedocs.org/projects/virtualenv/badge/?version=latest&style=flat-square
  :target: https://virtualenv.pypa.io
  :alt: Documentation status
.. image:: https://img.shields.io/discord/803025117553754132
  :target: https://discord.gg/pypa
  :alt: Discord
.. image:: https://img.shields.io/pypi/dm/virtualenv?style=flat-square
  :target: https://pypistats.org/packages/virtualenv
  :alt: PyPI - Downloads
.. image:: https://img.shields.io/pypi/l/virtualenv?style=flat-square
  :target: https://opensource.org/licenses/MIT
  :alt: PyPI - License
.. image:: https://img.shields.io/github/issues/pypa/virtualenv?style=flat-square
  :target: https://github.com/pypa/virtualenv/issues
  :alt: Open issues
.. image:: https://img.shields.io/github/issues-pr/pypa/virtualenv?style=flat-square
  :target: https://github.com/pypa/virtualenv/pulls
  :alt: Open pull requests
.. image:: https://img.shields.io/github/stars/pypa/virtualenv?style=flat-square
  :target: https://pypistats.org/packages/virtualenv
  :alt: Package popularity

``virtualenv`` is a tool to create isolated Python environments. Since Python ``3.3``, a subset of it has been
integrated into the standard library under the `venv module <https://docs.python.org/3/library/venv.html>`_. The
``venv`` module does not offer all features of this library, to name just a few more prominent:

- is slower (by not having the ``app-data`` seed method),
- is not as extendable,
- cannot create virtual environments for arbitrarily installed python versions (and automatically discover these),
- is not upgrade-able via `pip <https://pip.pypa.io/en/stable/installing/>`_,
- does not have as rich programmatic API (describe virtual environments without creating them).

The basic problem being addressed is one of dependencies and versions, and indirectly permissions.
Imagine you have an application that needs version ``1`` of ``LibFoo``, but another application requires version
``2``. How can you use both these libraries? If you install everything into your host python (e.g. ``python3.8``)
it's easy to end up in a situation where two packages have conflicting requirements.

Or more generally, what if you want to install an application *and leave it be*? If an application works, any change
in its libraries or the versions of those libraries can break the application. Also, what if you can't install packages
into the global ``site-packages`` directory, due to not having permissions to change the host python environment?

In all these cases, ``virtualenv`` can help you. It creates an environment that has its own installation directories,
that doesn't share libraries with other virtualenv environments (and optionally doesn't access the globally installed
libraries either).

Useful links
------------

**Related projects, that build abstractions on top of virtualenv**

* :pypi:`virtualenvwrapper` - a useful set of scripts for creating and deleting virtual environments
* :pypi:`pew` - provides a set of commands to manage multiple virtual environments
* :pypi:`tox` - a generic virtualenv management and test automation command line tool, driven by a ``tox.ini``
  configuration file
* :pypi:`nox` - a tool that automates testing in multiple Python environments, similar to tox,
  driven by a ``noxfile.py`` configuration file

**Tutorials**

* `Corey Schafer tutorial <https://www.youtube.com/watch?v=N5vscPTWKOk>`_ on how to use it
* `Using virtualenv with mod_wsgi <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_

**Presenting how the package works from within**

* `Bernat Gabor: status quo of virtual environments <https://www.youtube.com/watch?v=o1Vue9CWRxU>`_
* `Carl Meyer: Reverse-engineering Ian Bicking's brain: inside pip and virtualenv
  <http://pyvideo.org/video/568/reverse-engineering-ian-bicking--39-s-brain--insi>`_

.. comment: split here

.. toctree::
   :hidden:

   installation
   user_guide
   cli_interface
   extend
   development
   changelog
PK�(�\���cc)doc/alt-python-virtualenv/docs/extend.rstnu�[���Extend functionality
====================

``virtualenv`` allows one to extend the builtin functionality via a plugin system. To add a plugin you need to:

- write a python file containing the plugin code which follows our expected interface,
- package it as a python library,
- install it alongside the virtual environment.

.. warning::

   The public API of some of these components is still to be finalized, consider the current interface a beta one
   until we get some feedback on how well we planned ahead. We expect to do this by end of Q3 2020. Consider the class
   interface explained below as initial draft proposal. We reserve the right to change the API until then, however such
   changes will be communicated in a timely fashion, and you'll have time to migrate. Thank you for your understanding.

Python discovery
----------------

The python discovery mechanism is a component that needs to answer the following answer: based on some type of user
input give me a Python interpreter on the machine that matches that. The builtin interpreter tries to discover
an installed Python interpreter (based on PEP-515 and ``PATH`` discovery) on the users machine where the user input is a
python specification. An alternative such discovery mechanism for example would be to use the popular
`pyenv <https://github.com/pyenv/pyenv>`_ project to discover, and if not present install the requested Python
interpreter. Python discovery mechanisms must be registered under key ``virtualenv.discovery``, and the plugin must
implement :class:`virtualenv.discovery.discover.Discover`:

.. code-block:: ini

   virtualenv.discovery =
        pyenv = virtualenv_pyenv.discovery:PyEnvDiscovery


.. currentmodule:: virtualenv.discovery.discover

.. autoclass:: Discover
    :undoc-members:
    :members:


Creators
--------
Creators are what actually perform the creation of a virtual environment. The builtin virtual environment creators
all achieve this by referencing a global install; but would be just as valid for a creator to install a brand new
entire python under the target path; or one could add additional creators that can create virtual environments for other
python implementations, such as IronPython. They must be registered under and entry point with key
``virtualenv.discovery`` , and the class must implement :class:`virtualenv.create.creator.Creator`:

.. code-block:: ini

   virtualenv.create =
        cpython3-posix = virtualenv.create.via_global_ref.builtin.cpython.cpython3:CPython3Posix

.. currentmodule:: virtualenv.create.creator

.. autoclass:: Creator
    :undoc-members:
    :members:
    :exclude-members: run, set_pyenv_cfg, debug_script, debug_script, validate_dest, debug


Seed mechanism
--------------

Seeders are what given a virtual environment will install somehow some seed packages into it. They must be registered
under and entry point with key ``virtualenv.seed`` , and the class must implement
:class:`virtualenv.seed.seeder.Seeder`:

.. code-block:: ini

   virtualenv.seed =
        db = virtualenv.seed.fromDb:InstallFromDb

.. currentmodule:: virtualenv.seed.seeder

.. autoclass:: Seeder
    :undoc-members:
    :members:

Activation scripts
------------------
If you want add an activator for a new shell you can do this by implementing a new activator. They must be registered
under and entry point with key ``virtualenv.activate`` , and the class must implement
:class:`virtualenv.activation.activator.Activator`:

.. code-block:: ini

   virtualenv.activate =
        bash = virtualenv.activation.bash:BashActivator

.. currentmodule:: virtualenv.activation.activator

.. autoclass:: Activator
    :undoc-members:
    :members:
PK�(�\�΀�[[1doc/alt-python-virtualenv/docs/_static/custom.cssnu�[���.wy-nav-content {
    padding: 1em;
}

#virtualenv img {
    margin-bottom: 6px;
}

/* Allow table content to wrap around */
.wy-table-responsive table th, .wy-table-responsive table td {
    /* !important because RTD has conflicting stylesheets */
    white-space: normal !important;
    padding: 8px 6px !important;
}

.wy-table-responsive table {
    width: 100%;
    margin-left: 0 !important;
}

.rst-content table.docutils td ol {
    margin-bottom: 0;
}

.rst-content table.docutils td ul {
    margin-bottom: 0;
}

.rst-content table.docutils td p {
    margin-bottom: 0;
}

div[class*="highlight-"] {
    margin-bottom: 12px;
}

/* Tweak whitespace on the release history page */
#release-history p {
    margin-bottom: 0;
    margin-top: 0;
}

#release-history h3 {
    margin-bottom: 6px;
}

#release-history ul {
    margin-bottom: 12px;
}

#release-history ul ul {
    margin-bottom: 0;
    margin-top: 0;
}

#release-history h2 {
    margin-bottom: 12px;
}

/* Reduce whitespace on the inline-code snippets and add softer corners */
.rst-content code {
    padding: 2px 3px;
    border-radius: 3px;
}
PK�(�\e�K�{${$,doc/alt-python-virtualenv/docs/render_cli.pynu�[���from argparse import SUPPRESS
from collections import namedtuple
from contextlib import contextmanager

from docutils import nodes as n
from docutils.parsers.rst.directives import unchanged_required
from sphinx.util.docutils import SphinxDirective
from sphinxarg.parser import parse_parser

from virtualenv.run.plugin.base import ComponentBuilder

TableRow = namedtuple("TableRow", ["names", "default", "choices", "help"])

TextAsDefault = namedtuple("TextAsDefault", ["text"])

CUSTOM = {
    "discovery": ComponentBuilder.entry_points_for("virtualenv.discovery"),
    "creator": ComponentBuilder.entry_points_for("virtualenv.create"),
    "seeder": ComponentBuilder.entry_points_for("virtualenv.seed"),
    "activators": ComponentBuilder.entry_points_for("virtualenv.activate"),
}


class CliTable(SphinxDirective):
    name = "table_cli"
    option_spec = dict(module=unchanged_required, func=unchanged_required)

    def run(self):
        module_name, attr_name = self.options["module"], self.options["func"]
        parser_creator = getattr(__import__(module_name, fromlist=[attr_name]), attr_name)
        core_result = parse_parser(parser_creator())
        core_result["action_groups"] = [i for i in core_result["action_groups"] if i["title"] not in CUSTOM]

        content = []
        for i in core_result["action_groups"]:
            content.append(self._build_table(i["options"], i["title"], i["description"]))
        for key, name_to_class in CUSTOM.items():
            section = n.section("", ids=["section-{}".format(key)])
            title = n.title("", key)
            section += title
            self.state.document.note_implicit_target(title)
            content.append(section)
            results = {}

            for name, class_n in name_to_class.items():
                with self._run_parser(class_n, key, name):
                    cmd = ["--{}".format(key), name]
                    parser_result = parse_parser(parser_creator(cmd))
                    opt_group = next(i["options"] for i in parser_result["action_groups"] if i["title"] == key)
                    results[name] = opt_group
            core_names = set.intersection(*list({tuple(i["name"]) for i in v} for v in results.values()))
            if core_names:
                rows = [i for i in next(iter(results.values())) if tuple(i["name"]) in core_names]
                content.append(
                    self._build_table(rows, title="core", description="options shared across all {}".format(key)),
                )
            for name, group in results.items():
                rows = [i for i in group if tuple(i["name"]) not in core_names]
                if rows:
                    content.append(
                        self._build_table(rows, title=name, description="options specific to {} {}".format(key, name)),
                    )
        return content

    @contextmanager
    def _run_parser(self, class_n, key, name):
        test_name = {"creator": "can_create", "activators": "supports"}
        func_name = test_name.get(key)
        try:
            if func_name is not None:
                prev = getattr(class_n, func_name)

                def a(*args, **kwargs):
                    prev(*args, **kwargs)
                    if key == "activators":
                        return True
                    elif key == "creator":
                        if name == "venv":
                            from virtualenv.create.via_global_ref.venv import ViaGlobalRefMeta

                            meta = ViaGlobalRefMeta()
                            meta.symlink_error = None
                            return meta
                        from virtualenv.create.via_global_ref.builtin.via_global_self_do import BuiltinViaGlobalRefMeta

                        meta = BuiltinViaGlobalRefMeta()
                        meta.symlink_error = None
                        return meta
                    raise RuntimeError

                setattr(class_n, func_name, a)
            yield
        finally:
            if func_name is not None:
                # noinspection PyUnboundLocalVariable
                setattr(class_n, func_name, prev)

    def _build_table(self, options, title, description):
        table = n.table()
        table["classes"] += ["colwidths-auto"]

        options_group = n.tgroup(cols=3)
        table += options_group
        for _ in range(3):
            options_group += n.colspec()
        body = self._make_table_body(self.build_rows(options), title, description)
        options_group += body
        return table

    plugins = {
        "creator": "virtualenv.create",
        "seed": "virtualenv.seed",
        "activators": "virtualenv.activate",
        "discovery": "virtualenv.discovery",
    }

    @staticmethod
    def build_rows(options):
        result = []
        for option in options:
            names = option["name"]
            default = option["default"]
            if default is not None:
                if isinstance(default, str) and default and default[0] == default[-1] and default[0] == '"':
                    default = default[1:-1]
                    if default == SUPPRESS:
                        default = None
            choices = option.get("choices")
            key = names[0].strip("-")
            if key in CliTable.plugins:
                choices = list(ComponentBuilder.entry_points_for(CliTable.plugins[key]).keys())
            help_text = option["help"]
            row = TableRow(names, default, choices, help_text)
            result.append(row)
        return result

    def _make_table_body(self, rows, title, description):
        t_body = n.tbody()
        header_row = n.paragraph()
        header_row += n.strong(text=title)
        if description:
            header_row += n.Text(" ⇒ ")
            header_row += n.Text(description)
        t_body += n.row("", n.entry("", header_row, morecols=2))
        for row in rows:
            name_list = self._get_targeted_names(row)
            default = CliTable._get_default(row)
            help_text = CliTable._get_help_text(row)
            row_node = n.row("", n.entry("", name_list), n.entry("", default), n.entry("", help_text))
            t_body += row_node
        return t_body

    def _get_targeted_names(self, row):
        names = [name.lstrip("-") for name in row.names]
        target = n.target("", "", ids=names, names=names)
        self.register_target_option(target)
        first = True
        for name, orig in zip(names, row.names):
            if first:
                first = False
            else:
                target += n.Text(", ")
            self_ref = n.reference(refid=name)
            self_ref += n.literal(text=orig)
            target += self_ref
        para = n.paragraph(text="")
        para += target
        return para

    @staticmethod
    def _get_help_text(row):
        name = row.names[0]
        if name in ("--creator",):
            content = row.help[: row.help.index("(") - 1]
        else:
            content = row.help
        if name in ("--setuptools", "--pip", "--wheel"):
            text = row.help
            at = text.index(" bundle ")
            help_body = n.paragraph("")
            help_body += n.Text(text[: at + 1])
            help_body += n.literal(text="bundle")
            help_body += n.Text(text[at + 7 :])
        else:
            help_body = n.paragraph("", "", n.Text(content))
        if row.choices is not None:
            help_body += n.Text("; choice of: ")
            first = True
            for choice in row.choices:
                if first:
                    first = False
                else:
                    help_body += n.Text(", ")
                help_body += n.literal(text=choice)
        return help_body

    @staticmethod
    def _get_default(row):
        default = row.default
        name = row.names[0]
        if name == "-p":
            default_body = n.Text("the python executable virtualenv is installed into")
        elif name == "--app-data":
            default_body = n.Text("platform specific application data folder")
        elif name == "--activators":
            default_body = n.Text("comma separated list of activators supported")
        elif name == "--creator":
            default_body = n.paragraph("")
            default_body += n.literal(text="builtin")
            default_body += n.Text(" if exist, else ")
            default_body += n.literal(text="venv")
        else:
            if default is None:
                default_body = n.paragraph("", text="")
            else:
                default_body = n.literal(text=default if isinstance(default, str) else str(default))
        return default_body

    def register_target_option(self, target) -> None:
        domain = self.env.get_domain("std")
        self.state.document.note_explicit_target(target)
        for key in target["ids"]:
            domain.add_program_option(None, key, self.env.docname, key)


def literal_data(rawtext, app, type, slug, options):
    """Create a link to a BitBucket resource."""
    of_class = type.split(".")
    data = getattr(__import__(".".join(of_class[:-1]), fromlist=[of_class[-1]]), of_class[-1])
    return [n.literal("", text=",".join(data))], []


__all__ = (
    "CliTable",
    "literal_data",
)
PK�(�\���u.�.�,doc/alt-python-virtualenv/docs/changelog.rstnu�[���Release History
===============

.. include:: _draft.rst

.. towncrier release notes start

v20.13.0 (2022-01-02)
---------------------

Features - 20.13.0
~~~~~~~~~~~~~~~~~~
- Add downloaded wheel information in the relevant JSON embed file to
  prevent additional downloads of the same wheel. - by :user:`mayeut`. (`#2268 <https://github.com/pypa/virtualenv/issues/2268>`_)


v20.12.1 (2022-01-01)
---------------------

Bugfixes - 20.12.1
~~~~~~~~~~~~~~~~~~
- Try using previous updates of ``pip``, ``setuptools`` & ``wheel``
  when inside an update grace period rather than always falling back
  to embedded wheels - by :user:`mayeut`. (`#2265 <https://github.com/pypa/virtualenv/issues/2265>`_)
- New patch versions of ``pip``, ``setuptools`` & ``wheel`` are now
  returned in the expected timeframe. - by :user:`mayeut`. (`#2266 <https://github.com/pypa/virtualenv/issues/2266>`_)
- Manual upgrades of ``pip``, ``setuptools`` & ``wheel`` are
  not discarded by a periodic update - by :user:`mayeut`. (`#2267 <https://github.com/pypa/virtualenv/issues/2267>`_)


v20.12.0 (2021-12-31)
---------------------

Features - 20.12.0
~~~~~~~~~~~~~~~~~~
- Sign the python2 exe on Darwin arm64 - by :user:`tmspicer`. (`#2233 <https://github.com/pypa/virtualenv/issues/2233>`_)

Bugfixes - 20.12.0
~~~~~~~~~~~~~~~~~~
- Fix ``--download`` option - by :user:`mayeut`. (`#2120 <https://github.com/pypa/virtualenv/issues/2120>`_)
- Ugrade embedded setuptools to ``60.2.0`` from ``60.1.1`` - by :user:`gaborbernat`. (`#2263 <https://github.com/pypa/virtualenv/issues/2263>`_)


v20.11.2 (2021-12-29)
---------------------

Bugfixes - 20.11.2
~~~~~~~~~~~~~~~~~~
- Fix installation of pinned versions of ``pip``, ``setuptools`` & ``wheel`` - by :user:`mayeut`. (`#2203 <https://github.com/pypa/virtualenv/issues/2203>`_)


v20.11.1 (2021-12-29)
---------------------

Bugfixes - 20.11.1
~~~~~~~~~~~~~~~~~~
- Bump embed setuptools to ``60.1.1`` from ``60.1.0`` - by :user:`gaborbernat`. (`#2258 <https://github.com/pypa/virtualenv/issues/2258>`_)


v20.11.0 (2021-12-28)
---------------------

Features - 20.11.0
~~~~~~~~~~~~~~~~~~
- Avoid deprecation warning from py-filelock argument - by :user:`ofek`. (`#2237 <https://github.com/pypa/virtualenv/issues/2237>`_)
- Upgrade embedded setuptools to ``61.1.0`` from ``58.3.0`` - by :user:`gaborbernat`. (`#2240 <https://github.com/pypa/virtualenv/issues/2240>`_)
- Drop the runtime dependency of ``backports.entry-points-selectable`` - by :user:`hroncok`. (`#2246 <https://github.com/pypa/virtualenv/issues/2246>`_)
- Fish: PATH variables should not be quoted when being set - by :user:`hroncok`. (`#2248 <https://github.com/pypa/virtualenv/issues/2248>`_)


v20.10.0 (2021-11-01)
---------------------

Features - 20.10.0
~~~~~~~~~~~~~~~~~~
- If a ``"venv"`` install scheme exists in ``sysconfig``, virtualenv now uses it to create new virtual environments.
  This allows Python distributors, such as Fedora, to patch/replace the default install scheme without affecting
  the paths in new virtual environments.
  A similar technique `was proposed to Python, for the venv module <https://bugs.python.org/issue45413>`_ - by ``hroncok`` (`#2208 <https://github.com/pypa/virtualenv/issues/2208>`_)
- The activated virtualenv prompt is now always wrapped in parentheses. This
  affects venvs created with the ``--prompt`` attribute, and matches virtualenv's
  behaviour on par with venv. (`#2224 <https://github.com/pypa/virtualenv/issues/2224>`_)

Bugfixes - 20.10.0
~~~~~~~~~~~~~~~~~~
- Fix broken prompt set up by activate.bat - by :user:`SiggyBar`. (`#2225 <https://github.com/pypa/virtualenv/issues/2225>`_)


v20.9.0 (2021-10-23)
--------------------

Features - 20.9.0
~~~~~~~~~~~~~~~~~
- Special-case ``--prompt .`` to the name of the current directory - by :user:`rkm`. (`#2220 <https://github.com/pypa/virtualenv/issues/2220>`_)
- Add libffi-8.dll to pypy windows `#2218 <https://github.com/pypa/virtualenv/issues/2218>`_ - by :user:`mattip`

Bugfixes - 20.9.0
~~~~~~~~~~~~~~~~~
- Fixed path collision that could lead to a PermissionError or writing to system
  directories when using PyPy3.8 - by :user:`mgorny`. (`#2182 <https://github.com/pypa/virtualenv/issues/2182>`_)
- Upgrade embedded setuptools to ``58.3.0`` from ``58.1.0`` and pip to ``21.3.1`` from ``21.2.4`` - by
  :user:`gaborbernat`. (`#2205 <https://github.com/pypa/virtualenv/issues/2205>`_)
- Remove stray closing parenthesis in activate.bat - by :user:`SiggyBar`. (`#2221 <https://github.com/pypa/virtualenv/issues/2221>`_)


v20.8.1 (2021-09-24)
--------------------

Bugfixes - 20.8.1
~~~~~~~~~~~~~~~~~
- Fixed a bug where while creating a venv on top of an existing one, without cleaning, when seeded
  wheel version mismatch occurred, multiple ``.dist-info`` directories may be present, confounding entrypoint
  discovery - by :user:`arcivanov` (`#2185 <https://github.com/pypa/virtualenv/issues/2185>`_)
- Bump embed setuptools from ``58.0.4`` to ``58.1.0`` - by :user:`gaborbernat`. (`#2195 <https://github.com/pypa/virtualenv/issues/2195>`_)

Misc - 20.8.1
~~~~~~~~~~~~~
- `#2189 <https://github.com/pypa/virtualenv/issues/2189>`_


v20.8.0 (2021-09-16)
--------------------

* upgrade embedded setuptools to ``58.0.4`` from ``57.4.0`` and pip to ``21.2.4`` from ``21.2.3``
* Add nushell activation script

v20.7.2 (2021-08-10)
--------------------

Bugfixes - 20.7.2
~~~~~~~~~~~~~~~~~
- Upgrade embedded pip to ``21.2.3`` from ``21.2.2`` and wheel to ``0.37.0`` from ``0.36.2`` - by :user:`gaborbernat`. (`#2168 <https://github.com/pypa/virtualenv/issues/2168>`_)


v20.7.1 (2021-08-09)
--------------------

Bugfixes - 20.7.1
~~~~~~~~~~~~~~~~~
- Fix unpacking dictionary items in PythonInfo.install_path (`#2165 <https://github.com/pypa/virtualenv/issues/2165>`_)


v20.7.0 (2021-07-31)
--------------------

Bugfixes - 20.7.0
~~~~~~~~~~~~~~~~~
- upgrade embedded pip to ``21.2.2`` from ``21.1.3`` and setuptools to ``57.4.0`` from ``57.1.0`` - by :user:`gaborbernat` (`#2159 <https://github.com/pypa/virtualenv/issues/2159>`_)

Deprecations and Removals - 20.7.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Removed ``xonsh`` activator due to this breaking fairly often the CI and lack of support from those packages
  maintainers, upstream is encouraged to continue supporting the project as a
  `plugin <https://github.com/xonsh/xonsh/issues/3689>`_  - by :user:`gaborbernat`. (`#2160 <https://github.com/pypa/virtualenv/issues/2160>`_)


v20.6.0 (2021-07-14)
--------------------

Features - 20.6.0
~~~~~~~~~~~~~~~~~
- Support Python interpreters without ``distutils`` (fallback to ``syconfig`` in these cases) - by :user:`gaborbernat`. (`#1910 <https://github.com/pypa/virtualenv/issues/1910>`_)


v20.5.0 (2021-07-13)
--------------------

Features - 20.5.0
~~~~~~~~~~~~~~~~~
- Plugins now use 'selectable' entry points - by :user:`jaraco`. (`#2093 <https://github.com/pypa/virtualenv/issues/2093>`_)
- add libffi-7.dll to the hard-coded list of dlls for PyPy (`#2141 <https://github.com/pypa/virtualenv/issues/2141>`_)
- Use the better maintained ``platformdirs`` instead of ``appdirs`` - by :user:`gaborbernat`. (`#2142 <https://github.com/pypa/virtualenv/issues/2142>`_)

Bugfixes - 20.5.0
~~~~~~~~~~~~~~~~~
- Bump pip the embedded pip ``21.1.3`` and setuptools to ``57.1.0`` - by :user:`gaborbernat`. (`#2135 <https://github.com/pypa/virtualenv/issues/2135>`_)

Deprecations and Removals - 20.5.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Drop python ``3.4`` support as it has been over 2 years since EOL - by :user:`gaborbernat`. (`#2141 <https://github.com/pypa/virtualenv/issues/2141>`_)


v20.4.7 (2021-05-24)
--------------------

Bugfixes - 20.4.7
~~~~~~~~~~~~~~~~~
- Upgrade embedded pip to ``21.1.2`` and setuptools to ``57.0.0`` - by :user:`gaborbernat`. (`#2123 <https://github.com/pypa/virtualenv/issues/2123>`_)


v20.4.6 (2021-05-05)
--------------------

Bugfixes - 20.4.6
~~~~~~~~~~~~~~~~~
- Fix ``site.getsitepackages()`` broken on python2 on debian - by :user:`freundTech`. (`#2105 <https://github.com/pypa/virtualenv/issues/2105>`_)


v20.4.5 (2021-05-05)
--------------------

Bugfixes - 20.4.5
~~~~~~~~~~~~~~~~~
- Bump pip to ``21.1.1`` from ``21.0.1`` - by :user:`gaborbernat`. (`#2104 <https://github.com/pypa/virtualenv/issues/2104>`_)
- Fix ``site.getsitepackages()`` ignoring ``--system-site-packages`` on python2 - by :user:`freundTech`. (`#2106 <https://github.com/pypa/virtualenv/issues/2106>`_)


v20.4.4 (2021-04-20)
--------------------

Bugfixes - 20.4.4
~~~~~~~~~~~~~~~~~
- Built in discovery class is always preferred over plugin supplied classes. (`#2087 <https://github.com/pypa/virtualenv/issues/2087>`_)
- Upgrade embeded setuptools to ``56.0.0`` by :user:`gaborbernat`. (`#2094 <https://github.com/pypa/virtualenv/issues/2094>`_)


v20.4.3 (2021-03-16)
--------------------

Bugfixes - 20.4.3
~~~~~~~~~~~~~~~~~
- Bump embeded setuptools from ``52.0.0`` to ``54.1.2`` - by :user:`gaborbernat` (`#2069 <https://github.com/pypa/virtualenv/issues/2069>`_)
- Fix PyPy3 stdlib on Windows is incorrect - by :user:`gaborbernat`. (`#2071 <https://github.com/pypa/virtualenv/issues/2071>`_)


v20.4.2 (2021-02-01)
--------------------

Bugfixes - 20.4.2
~~~~~~~~~~~~~~~~~
- Running virtualenv ``--upgrade-embed-wheels`` crashes - by :user:`gaborbernat`. (`#2058 <https://github.com/pypa/virtualenv/issues/2058>`_)


v20.4.1 (2021-01-31)
--------------------

Bugfixes - 20.4.1
~~~~~~~~~~~~~~~~~
- Bump embedded pip and setuptools packages to latest upstream supported (``21.0.1`` and ``52.0.0``) - by :user:`gaborbernat`. (`#2060 <https://github.com/pypa/virtualenv/issues/2060>`_)


v20.4.0 (2021-01-19)
--------------------

Features - 20.4.0
~~~~~~~~~~~~~~~~~
- On the programmatic API allow passing in the environment variable dictionary to use, defaults to ``os.environ`` if not
  specified - by :user:`gaborbernat`. (`#2054 <https://github.com/pypa/virtualenv/issues/2054>`_)

Bugfixes - 20.4.0
~~~~~~~~~~~~~~~~~
- Upgrade embedded setuptools to ``51.3.3`` from ``51.1.2`` - by :user:`gaborbernat`. (`#2055 <https://github.com/pypa/virtualenv/issues/2055>`_)


v20.3.1 (2021-01-13)
--------------------

Bugfixes - 20.3.1
~~~~~~~~~~~~~~~~~
- Bump embed pip to ``20.3.3``, setuptools to ``51.1.1`` and wheel to ``0.36.2`` - by :user:`gaborbernat`. (`#2036 <https://github.com/pypa/virtualenv/issues/2036>`_)
- Allow unfunctioning of pydoc to fail freely so that virtualenvs can be
  activated under Zsh with set -e (since otherwise ``unset -f`` and
  ``unfunction`` exit with 1 if the function does not exist in Zsh) - by
  :user:`d125q`. (`#2049 <https://github.com/pypa/virtualenv/issues/2049>`_)
- Drop cached python information if the system executable is no longer present (for example when the executable is a
  shim and the mapped executable is replaced - such is the case with pyenv) - by :user:`gaborbernat`. (`#2050 <https://github.com/pypa/virtualenv/issues/2050>`_)


v20.3.0 (2021-01-10)
--------------------

Features - 20.3.0
~~~~~~~~~~~~~~~~~
- The builtin discovery takes now a ``--try-first-with`` argument and is first attempted as valid interpreters. One can
  use this to force discovery of a given python executable when the discovery order/mechanism raises errors -
  by :user:`gaborbernat`. (`#2046 <https://github.com/pypa/virtualenv/issues/2046>`_)

Bugfixes - 20.3.0
~~~~~~~~~~~~~~~~~
- On Windows python ``3.7+`` distributions where the exe shim is missing fallback to the old ways - by :user:`gaborbernat`. (`#1986 <https://github.com/pypa/virtualenv/issues/1986>`_)
- When discovering interpreters on Windows, via the PEP-514, prefer ``PythonCore`` releases over other ones. virtualenv
  is used via pip mostly by this distribution, so prefer it over other such as conda - by :user:`gaborbernat`. (`#2046 <https://github.com/pypa/virtualenv/issues/2046>`_)


v20.2.2 (2020-12-07)
--------------------

Bugfixes - 20.2.2
~~~~~~~~~~~~~~~~~
- Bump pip to ``20.3.1``, setuptools to ``51.0.0`` and wheel to ``0.36.1`` - by :user:`gaborbernat`. (`#2029 <https://github.com/pypa/virtualenv/issues/2029>`_)


v20.2.1 (2020-11-23)
--------------------

No significant changes.


v20.2.0 (2020-11-21)
--------------------

Features - 20.2.0
~~~~~~~~~~~~~~~~~
- Optionally skip VCS ignore directive for entire virtualenv directory, using option :option:`no-vcs-ignore`, by default ``False``. (`#2003 <https://github.com/pypa/virtualenv/issues/2003>`_)
- Add ``--read-only-app-data`` option to allow for creation based on an existing
  app data cache which is non-writable. This may be useful (for example) to
  produce a docker image where the app-data is pre-populated.

  .. code-block:: dockerfile

      ENV \
          VIRTUALENV_OVERRIDE_APP_DATA=/opt/virtualenv/cache \
          VIRTUALENV_SYMLINK_APP_DATA=1
      RUN virtualenv venv && rm -rf venv
      ENV VIRTUALENV_READ_ONLY_APP_DATA=1
      USER nobody
      # this virtualenv has symlinks into the read-only app-data cache
      RUN virtualenv /tmp/venv

  Patch by :user:`asottile`. (`#2009 <https://github.com/pypa/virtualenv/issues/2009>`_)

Bugfixes - 20.2.0
~~~~~~~~~~~~~~~~~
- Fix processing of the ``VIRTUALENV_PYTHON`` environment variable and make it
  multi-value as well (separated by comma) - by :user:`pneff`. (`#1998 <https://github.com/pypa/virtualenv/issues/1998>`_)


v20.1.0 (2020-10-25)
--------------------

Features - 20.1.0
~~~~~~~~~~~~~~~~~
- The python specification can now take one or more values, first found is used to create the virtual environment - by
  :user:`gaborbernat`. (`#1995 <https://github.com/pypa/virtualenv/issues/1995>`_)


v20.0.35 (2020-10-15)
---------------------

Bugfixes - 20.0.35
~~~~~~~~~~~~~~~~~~
- Bump embedded setuptools from ``50.3.0`` to ``50.3.1`` - by :user:`gaborbernat`. (`#1982 <https://github.com/pypa/virtualenv/issues/1982>`_)
- After importing virtualenv passing cwd to a subprocess calls breaks with ``invalid directory`` - by :user:`gaborbernat`. (`#1983 <https://github.com/pypa/virtualenv/issues/1983>`_)


v20.0.34 (2020-10-12)
---------------------

Bugfixes - 20.0.34
~~~~~~~~~~~~~~~~~~
- Align with venv module when creating virtual environments with builtin creator on Windows 3.7 and later
  - by :user:`gaborbernat`. (`#1782 <https://github.com/pypa/virtualenv/issues/1782>`_)
- Handle Cygwin path conversion in the activation script - by :user:`davidcoghlan`. (`#1969 <https://github.com/pypa/virtualenv/issues/1969>`_)


v20.0.33 (2020-10-04)
---------------------

Bugfixes - 20.0.33
~~~~~~~~~~~~~~~~~~
- Fix ``None`` type error in cygwin if POSIX path in dest - by :user:`danyeaw`. (`#1962 <https://github.com/pypa/virtualenv/issues/1962>`_)
- Fix Python 3.4 incompatibilities (added back to the CI) - by :user:`gaborbernat`. (`#1963 <https://github.com/pypa/virtualenv/issues/1963>`_)


v20.0.32 (2020-10-01)
---------------------

Bugfixes - 20.0.32
~~~~~~~~~~~~~~~~~~
- For activation scripts always use UNIX line endings (unless it's BATCH shell related) - by :user:`saytosid`. (`#1818 <https://github.com/pypa/virtualenv/issues/1818>`_)
- Upgrade embedded pip to ``20.2.1`` and setuptools to ``49.4.0`` - by :user:`gaborbernat`. (`#1918 <https://github.com/pypa/virtualenv/issues/1918>`_)
- Avoid spawning new windows when doing seed package upgrades in the background on Windows - by :user:`gaborbernat`. (`#1928 <https://github.com/pypa/virtualenv/issues/1928>`_)
- Fix a bug that reading and writing on the same file may cause race on multiple processes. (`#1938 <https://github.com/pypa/virtualenv/issues/1938>`_)
- Upgrade embedded setuptools to ``50.2.0`` and pip to ``20.2.3`` - by :user:`gaborbernat`. (`#1939 <https://github.com/pypa/virtualenv/issues/1939>`_)
- Provide correct path for bash activator in cygwin or msys2 - by :user:`danyeaw`. (`#1940 <https://github.com/pypa/virtualenv/issues/1940>`_)
- Relax importlib requirement to allow version<3 - by :user:`usamasadiq` (`#1953 <https://github.com/pypa/virtualenv/issues/1953>`_)
- pth files were not processed on CPython2 if $PYTHONPATH was pointing to site-packages/ - by :user:`navytux`. (`#1959 <https://github.com/pypa/virtualenv/issues/1959>`_) (`#1960 <https://github.com/pypa/virtualenv/issues/1960>`_)


v20.0.31 (2020-08-17)
---------------------

Bugfixes - 20.0.31
~~~~~~~~~~~~~~~~~~
- Upgrade embedded pip to ``20.2.1``, setuptools to ``49.6.0`` and wheel to ``0.35.1``  - by :user:`gaborbernat`. (`#1918 <https://github.com/pypa/virtualenv/issues/1918>`_)


v20.0.30 (2020-08-04)
---------------------

Bugfixes - 20.0.30
~~~~~~~~~~~~~~~~~~
- Upgrade pip to ``20.2.1`` and setuptools to ``49.2.1`` - by :user:`gaborbernat`. (`#1915 <https://github.com/pypa/virtualenv/issues/1915>`_)


v20.0.29 (2020-07-31)
---------------------

Bugfixes - 20.0.29
~~~~~~~~~~~~~~~~~~
- Upgrade embedded pip from version ``20.1.2`` to ``20.2`` - by :user:`gaborbernat`. (`#1909 <https://github.com/pypa/virtualenv/issues/1909>`_)


v20.0.28 (2020-07-24)
---------------------

Bugfixes - 20.0.28
~~~~~~~~~~~~~~~~~~
- Fix test suite failing if run from system Python - by :user:`gaborbernat`. (`#1882 <https://github.com/pypa/virtualenv/issues/1882>`_)
- Provide ``setup_logging`` flag to python API so that users can bypass logging handling if their application already
  performs this - by :user:`gaborbernat`. (`#1896 <https://github.com/pypa/virtualenv/issues/1896>`_)
- Use ``\n`` instead if ``\r\n`` as line separator for report (because Python already performs this transformation
  automatically upon write to the logging pipe) - by :user:`gaborbernat`. (`#1905 <https://github.com/pypa/virtualenv/issues/1905>`_)


v20.0.27 (2020-07-15)
---------------------

Bugfixes - 20.0.27
~~~~~~~~~~~~~~~~~~
- No longer preimport threading to fix support for `gpython <https://pypi.org/project/pygolang/#gpython>`_ and `gevent <https://www.gevent.org/>`_ - by :user:`navytux`. (`#1897 <https://github.com/pypa/virtualenv/issues/1897>`_)
- Upgrade setuptools from ``49.2.0`` on ``Python 3.5+`` - by :user:`gaborbernat`. (`#1898 <https://github.com/pypa/virtualenv/issues/1898>`_)


v20.0.26 (2020-07-07)
---------------------

Bugfixes - 20.0.26
~~~~~~~~~~~~~~~~~~
- Bump dependency ``distutils >= 0.3.1`` - by :user:`gaborbernat`. (`#1880 <https://github.com/pypa/virtualenv/issues/1880>`_)
- Improve periodic update handling:

  - better logging output while running and enable logging on background process call (
    ``_VIRTUALENV_PERIODIC_UPDATE_INLINE`` may be used to debug behaviour inline)
  - fallback to unverified context when querying the PyPi for release date,
  - stop downloading wheels once we reach the embedded version,

  by :user:`gaborbernat`. (`#1883 <https://github.com/pypa/virtualenv/issues/1883>`_)
- Do not print error message if the application exists with ``SystemExit(0)`` - by :user:`gaborbernat`. (`#1885 <https://github.com/pypa/virtualenv/issues/1885>`_)
- Upgrade embedded setuptools from ``47.3.1`` to ``49.1.0`` for Python ``3.5+`` - by :user:`gaborbernat`. (`#1887 <https://github.com/pypa/virtualenv/issues/1887>`_)


v20.0.25 (2020-06-23)
---------------------

Bugfixes - 20.0.25
~~~~~~~~~~~~~~~~~~
- Fix that when the ``app-data`` seeders image creation fails the exception is silently ignored. Avoid two virtual environment creations to step on each others toes by using a lock while creating the base images. By :user:`gaborbernat`. (`#1869 <https://github.com/pypa/virtualenv/issues/1869>`_)


v20.0.24 (2020-06-22)
---------------------

Features - 20.0.24
~~~~~~~~~~~~~~~~~~
- Ensure that the seeded packages do not get too much out of date:

  - add a CLI flag that triggers upgrade of embedded wheels under :option:`upgrade-embed-wheels`
  - periodically (once every 14 days) upgrade the embedded wheels in a background process, and use them if they have been
    released for more than 28 days (can be disabled via :option:`no-periodic-update`)

  More details under :ref:`wheels` - by :user:`gaborbernat`. (`#1821 <https://github.com/pypa/virtualenv/issues/1821>`_)
- Upgrade embed wheel content:

  - ship wheels for Python ``3.9`` and ``3.10``
  - upgrade setuptools for Python ``3.5+`` from ``47.1.1`` to ``47.3.1``

  by :user:`gaborbernat`. (`#1841 <https://github.com/pypa/virtualenv/issues/1841>`_)
- Display the installed seed package versions in the final summary output, for example:

  .. code-block:: console

      created virtual environment CPython3.8.3.final.0-64 in 350ms
        creator CPython3Posix(dest=/x, clear=True, global=False)
        seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/y/virtualenv)
          added seed packages: pip==20.1.1, setuptools==47.3.1, wheel==0.34.2

  by :user:`gaborbernat`. (`#1864 <https://github.com/pypa/virtualenv/issues/1864>`_)

Bugfixes - 20.0.24
~~~~~~~~~~~~~~~~~~
- Do not generate/overwrite ``.gitignore`` if it already exists at destination path - by :user:`gaborbernat`. (`#1862 <https://github.com/pypa/virtualenv/issues/1862>`_)
- Improve error message for no ``.dist-info`` inside the ``app-data`` copy seeder - by :user:`gaborbernat`. (`#1867 <https://github.com/pypa/virtualenv/issues/1867>`_)

Improved Documentation - 20.0.24
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- How seeding mechanisms discover (and automatically keep it up to date) wheels at :ref:`wheels` - by :user:`gaborbernat`. (`#1821 <https://github.com/pypa/virtualenv/issues/1821>`_)
- How distributions should handle shipping their own embedded wheels at  :ref:`distribution_wheels` - by :user:`gaborbernat`. (`#1840 <https://github.com/pypa/virtualenv/issues/1840>`_)


v20.0.23 (2020-06-12)
---------------------

Bugfixes - 20.0.23
~~~~~~~~~~~~~~~~~~
- Fix typo in ``setup.cfg`` - by :user:`RowdyHowell`. (`#1857 <https://github.com/pypa/virtualenv/issues/1857>`_)


v20.0.22 (2020-06-12)
---------------------

Bugfixes - 20.0.22
~~~~~~~~~~~~~~~~~~
- Relax ``importlib.resources`` requirement to also allow version 2 - by :user:`asottile`. (`#1846 <https://github.com/pypa/virtualenv/issues/1846>`_)
- Upgrade embedded setuptools to ``44.1.1`` for python 2 and ``47.1.1`` for python3.5+ - by :user:`gaborbernat`. (`#1855 <https://github.com/pypa/virtualenv/issues/1855>`_)


v20.0.21 (2020-05-20)
---------------------

Features - 20.0.21
~~~~~~~~~~~~~~~~~~
- Generate ignore file for version control systems to avoid tracking virtual environments by default. Users should
  remove these files if still want to track. For now we support only **git** by :user:`gaborbernat`. (`#1806 <https://github.com/pypa/virtualenv/issues/1806>`_)

Bugfixes - 20.0.21
~~~~~~~~~~~~~~~~~~
- Fix virtualenv fails sometimes when run concurrently, ``--clear-app-data`` conflicts with :option:`clear` flag when
  abbreviation is turned on. To bypass this while allowing abbreviated flags on the command line we had to move it to
  :option:`reset-app-data` - by :user:`gaborbernat`. (`#1824 <https://github.com/pypa/virtualenv/issues/1824>`_)
- Upgrade embedded ``setuptools`` to ``46.4.0`` from ``46.1.3`` on Python ``3.5+``, and ``pip`` from ``20.1`` to ``20.1.1`` - by :user:`gaborbernat`. (`#1827 <https://github.com/pypa/virtualenv/issues/1827>`_)
- Seeder pip now correctly handles ``--extra-search-dir`` - by :user:`frenzymadness`. (`#1834 <https://github.com/pypa/virtualenv/issues/1834>`_)


v20.0.20 (2020-05-04)
---------------------

Bugfixes - 20.0.20
~~~~~~~~~~~~~~~~~~
- Fix download fails with python 3.4 - by :user:`gaborbernat`. (`#1809 <https://github.com/pypa/virtualenv/issues/1809>`_)
- Fixes older CPython2 versions use ``_get_makefile_filename`` instead of ``get_makefile_filename`` on ``sysconfig`` - by :user:`ianw`. (`#1810 <https://github.com/pypa/virtualenv/issues/1810>`_)
- Fix download is ``True`` by default - by :user:`gaborbernat`. (`#1813 <https://github.com/pypa/virtualenv/issues/1813>`_)
- Fail ``app-data`` seed operation when wheel download fails and better error message - by :user:`gaborbernat`. (`#1814 <https://github.com/pypa/virtualenv/issues/1814>`_)


v20.0.19 (2020-05-03)
---------------------

Bugfixes - 20.0.19
~~~~~~~~~~~~~~~~~~
- Fix generating a Python 2 environment from Python 3 creates invalid python activator - by :user:`gaborbernat`. (`#1776 <https://github.com/pypa/virtualenv/issues/1776>`_)
- Fix pinning seed packages via ``app-data`` seeder raised ``Invalid Requirement`` - by :user:`gaborbernat`. (`#1779 <https://github.com/pypa/virtualenv/issues/1779>`_)
- Do not stop interpreter discovery if we fail to find the system interpreter for a executable during discovery
  - by :user:`gaborbernat`. (`#1781 <https://github.com/pypa/virtualenv/issues/1781>`_)
- On CPython2 POSIX platforms ensure ``syconfig.get_makefile_filename`` exists within the virtual environment (this is used by some c-extension based libraries - e.g. numpy - for building) - by :user:`gaborbernat`. (`#1783 <https://github.com/pypa/virtualenv/issues/1783>`_)
- Better handling of options :option:`copies` and :option:`symlinks`. Introduce priority of where the option is set
  to follow the order: CLI, env var, file, hardcoded. If both set at same level prefers copy over symlink. - by
  :user:`gaborbernat`. (`#1784 <https://github.com/pypa/virtualenv/issues/1784>`_)
- Upgrade pip for Python ``2.7`` and ``3.5+`` from ``20.0.2`` to ``20.1`` - by :user:`gaborbernat`. (`#1793 <https://github.com/pypa/virtualenv/issues/1793>`_)
- Fix CPython is not discovered from Windows registry, and discover pythons from Windows registry in decreasing order
  by version - by :user:`gaborbernat`. (`#1796 <https://github.com/pypa/virtualenv/issues/1796>`_)
- Fix symlink detection for creators - by :user:`asottile` (`#1803 <https://github.com/pypa/virtualenv/issues/1803>`_)


v20.0.18 (2020-04-16)
---------------------

Bugfixes - 20.0.18
~~~~~~~~~~~~~~~~~~
- Importing setuptools before cli_run could cause our python information query to fail due to setuptools patching
  ``distutils.dist.Distribution`` - by :user:`gaborbernat`. (`#1771 <https://github.com/pypa/virtualenv/issues/1771>`_)


v20.0.17 (2020-04-09)
---------------------

Features - 20.0.17
~~~~~~~~~~~~~~~~~~
- Extend environment variables checked for configuration to also check aliases (e.g. setting either
  ``VIRTUALENV_COPIES`` or ``VIRTUALENV_ALWAYS_COPY`` will work) - by :user:`gaborbernat`. (`#1763 <https://github.com/pypa/virtualenv/issues/1763>`_)


v20.0.16 (2020-04-04)
---------------------

Bugfixes - 20.0.16
~~~~~~~~~~~~~~~~~~
- Allow seed wheel files inside the :option:`extra-search-dir` folders that do not have ``Requires-Python``
  metadata specified, these are considered compatible with all python versions - by :user:`gaborbernat`. (`#1757 <https://github.com/pypa/virtualenv/issues/1757>`_)


v20.0.15 (2020-03-27)
---------------------

Features - 20.0.15
~~~~~~~~~~~~~~~~~~
- Upgrade embedded setuptools to ``46.1.3`` from ``46.1.1`` - by :user:`gaborbernat`. (`#1752 <https://github.com/pypa/virtualenv/issues/1752>`_)


v20.0.14 (2020-03-25)
---------------------

Features - 20.0.14
~~~~~~~~~~~~~~~~~~
- Remove ``__PYVENV_LAUNCHER__`` on macOs for Python ``3.7.(<8)`` and ``3.8.(<3)`` on interpreter startup via ``pth``
  file, this pulls in the `upstream patch <https://github.com/python/cpython/pull/9516>`_ - by :user:`gaborbernat`. (`#1704 <https://github.com/pypa/virtualenv/issues/1704>`_)
- Upgrade embedded setuptools for Python ``3.5+`` to ``46.1.1``, for Python ``2.7`` to ``44.1.0`` - by :user:`gaborbernat`. (`#1745 <https://github.com/pypa/virtualenv/issues/1745>`_)

Bugfixes - 20.0.14
~~~~~~~~~~~~~~~~~~
- Fix discovery of interpreter by name from ``PATH`` that does not match a spec format - by :user:`gaborbernat`. (`#1746 <https://github.com/pypa/virtualenv/issues/1746>`_)


v20.0.13 (2020-03-19)
---------------------

Bugfixes - 20.0.13
~~~~~~~~~~~~~~~~~~
- Do not fail when the pyc files is missing for the host Python 2 - by :user:`gaborbernat`. (`#1738 <https://github.com/pypa/virtualenv/issues/1738>`_)
- Support broken Packaging pythons that put the include headers under distutils pattern rather than sysconfig one
  - by :user:`gaborbernat`. (`#1739 <https://github.com/pypa/virtualenv/issues/1739>`_)


v20.0.12 (2020-03-19)
---------------------

Bugfixes - 20.0.12
~~~~~~~~~~~~~~~~~~
- Fix relative path discovery of interpreters - by :user:`gaborbernat`. (`#1734 <https://github.com/pypa/virtualenv/issues/1734>`_)


v20.0.11 (2020-03-18)
---------------------

Features - 20.0.11
~~~~~~~~~~~~~~~~~~
- Improve error message when the host python does not satisfy invariants needed to create virtual environments (now we
  print which host files are incompatible/missing and for which creators when no supported creator can be matched, however
  we found creators that can describe the given Python interpreter - will still print no supported creator for Jython,
  however print exactly what host files do not allow creation of virtual environments in case of CPython/PyPy)
  - by :user:`gaborbernat`. (`#1716 <https://github.com/pypa/virtualenv/issues/1716>`_)

Bugfixes - 20.0.11
~~~~~~~~~~~~~~~~~~
- Support Python 3 Framework distributed via XCode in macOs Catalina and before - by :user:`gaborbernat`. (`#1663 <https://github.com/pypa/virtualenv/issues/1663>`_)
- Fix Windows Store Python support, do not allow creation via symlink as that's not going to work by design
  - by :user:`gaborbernat`. (`#1709 <https://github.com/pypa/virtualenv/issues/1709>`_)
- Fix ``activate_this.py`` throws ``AttributeError`` on Windows when virtual environment was created via cross python
  mechanism - by :user:`gaborbernat`. (`#1710 <https://github.com/pypa/virtualenv/issues/1710>`_)
- Fix ``--no-pip``, ``--no-setuptools``, ``--no-wheel`` not being respected - by :user:`gaborbernat`. (`#1712 <https://github.com/pypa/virtualenv/issues/1712>`_)
- Allow missing ``.py`` files if a compiled ``.pyc`` version is available - by :user:`tucked`. (`#1714 <https://github.com/pypa/virtualenv/issues/1714>`_)
- Do not fail if the distutils/setuptools patch happens on a C-extension loader (such as ``zipimporter`` on Python 3.7 or
  earlier) - by :user:`gaborbernat`. (`#1715 <https://github.com/pypa/virtualenv/issues/1715>`_)
- Support Python 2 implementations that require the landmark files and ``site.py`` to be in platform standard library
  instead of the standard library path of the virtual environment (notably some RHEL ones, such as the Docker
  image ``amazonlinux:1``) - by :user:`gaborbernat`. (`#1719 <https://github.com/pypa/virtualenv/issues/1719>`_)
- Allow the test suite to pass even when called with the system Python - to help repackaging of the tool for Linux
  distributions -  by :user:`gaborbernat`. (`#1721 <https://github.com/pypa/virtualenv/issues/1721>`_)
- Also generate ``pipx.y`` console script beside ``pip-x.y`` to be compatible with how pip installs itself -
  by :user:`gaborbernat`. (`#1723 <https://github.com/pypa/virtualenv/issues/1723>`_)
- Automatically create the application data folder if it does not exists - by :user:`gaborbernat`. (`#1728 <https://github.com/pypa/virtualenv/issues/1728>`_)

Improved Documentation - 20.0.11
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- :ref:`supports <compatibility-requirements>` details now explicitly what Python installations we support
  - by :user:`gaborbernat`. (`#1714 <https://github.com/pypa/virtualenv/issues/1714>`_)


v20.0.10 (2020-03-10)
---------------------

Bugfixes - 20.0.10
~~~~~~~~~~~~~~~~~~
- Fix acquiring python information might be altered by distutils configuration files generating incorrect layout virtual
  environments - by :user:`gaborbernat`. (`#1663 <https://github.com/pypa/virtualenv/issues/1663>`_)
- Upgrade embedded setuptools to ``46.0.0`` from ``45.3.0`` on Python ``3.5+`` - by :user:`gaborbernat`. (`#1702 <https://github.com/pypa/virtualenv/issues/1702>`_)

Improved Documentation - 20.0.10
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Document requirements (pip + index server) when installing via pip under the installation section - by
  :user:`gaborbernat`. (`#1618 <https://github.com/pypa/virtualenv/issues/1618>`_)
- Document installing from non PEP-518 systems - :user:`gaborbernat`. (`#1619 <https://github.com/pypa/virtualenv/issues/1619>`_)
- Document installing latest unreleased version from Github - :user:`gaborbernat`. (`#1620 <https://github.com/pypa/virtualenv/issues/1620>`_)


v20.0.9 (2020-03-08)
--------------------

Bugfixes - 20.0.9
~~~~~~~~~~~~~~~~~
- ``pythonw.exe`` works as ``python.exe`` on Windows - by :user:`gaborbernat`. (`#1686 <https://github.com/pypa/virtualenv/issues/1686>`_)
- Handle legacy loaders for virtualenv import hooks used to patch distutils configuration load - by :user:`gaborbernat`. (`#1690 <https://github.com/pypa/virtualenv/issues/1690>`_)
- Support for python 2 platforms that store landmark files in ``platstdlib`` over ``stdlib`` (e.g. RHEL) - by
  :user:`gaborbernat`. (`#1694 <https://github.com/pypa/virtualenv/issues/1694>`_)
- Upgrade embedded setuptools to ``45.3.0`` from ``45.2.0`` for Python ``3.5+``  - by :user:`gaborbernat`. (`#1699 <https://github.com/pypa/virtualenv/issues/1699>`_)


v20.0.8 (2020-03-04)
--------------------

Bugfixes - 20.0.8
~~~~~~~~~~~~~~~~~
- Having `distutils configuration <https://docs.python.org/3/install/index.html#distutils-configuration-files>`_
  files that set ``prefix`` and ``install_scripts`` cause installation of packages in the wrong location -
  by :user:`gaborbernat`. (`#1663 <https://github.com/pypa/virtualenv/issues/1663>`_)
- Fix ``PYTHONPATH`` being overridden on Python 2 — by :user:`jd`. (`#1673 <https://github.com/pypa/virtualenv/issues/1673>`_)
- Fix list configuration value parsing from config file or environment variable - by :user:`gaborbernat`. (`#1674 <https://github.com/pypa/virtualenv/issues/1674>`_)
- Fix Batch activation script shell prompt to display environment name by default - by :user:`spetafree`. (`#1679 <https://github.com/pypa/virtualenv/issues/1679>`_)
- Fix startup on Python 2 is slower for virtualenv - this was due to setuptools calculating it's working set distribution
  - by :user:`gaborbernat`. (`#1682 <https://github.com/pypa/virtualenv/issues/1682>`_)
- Fix entry points are not populated for editable installs on Python 2 due to setuptools working set being calculated
  before ``easy_install.pth`` runs - by :user:`gaborbernat`. (`#1684 <https://github.com/pypa/virtualenv/issues/1684>`_)
- Fix ``attr:`` import fails for setuptools - by :user:`gaborbernat`. (`#1685 <https://github.com/pypa/virtualenv/issues/1685>`_)


v20.0.7 (2020-02-26)
--------------------

Bugfixes - 20.0.7
~~~~~~~~~~~~~~~~~
- Disable distutils fixup for python 3 until `pypa/pip #7778 <https://github.com/pypa/pip/issues/7778>`_ is fixed and
  released - by :user:`gaborbernat`. (`#1669 <https://github.com/pypa/virtualenv/issues/1669>`_)


v20.0.6 (2020-02-26)
--------------------

Bugfixes - 20.0.6
~~~~~~~~~~~~~~~~~
- Fix global site package always being added with bundled macOs python framework builds - by :user:`gaborbernat`. (`#1561 <https://github.com/pypa/virtualenv/issues/1561>`_)
- Fix generated scripts use host version info rather than target - by :user:`gaborbernat`. (`#1600 <https://github.com/pypa/virtualenv/issues/1600>`_)
- Fix circular prefix reference with single elements (accept these as if they were system executables, print a info about
  them referencing themselves) - by :user:`gaborbernat`. (`#1632 <https://github.com/pypa/virtualenv/issues/1632>`_)
- Handle the case when the application data folder is read-only:

  - the application data folder is now controllable via :option:`app-data`,
  - ``clear-app-data`` now cleans the entire application data folder, not just the ``app-data`` seeder path,
  - check if the application data path passed in does not exist or is read-only, and fallback to a temporary directory,
  - temporary directory application data is automatically cleaned up at the end of execution,
  - :option:`symlink-app-data` is always ``False`` when the application data is temporary

  by :user:`gaborbernat`. (`#1640 <https://github.com/pypa/virtualenv/issues/1640>`_)
- Fix PyPy 2 builtin modules are imported from standard library, rather than from builtin  - by :user:`gaborbernat`. (`#1652 <https://github.com/pypa/virtualenv/issues/1652>`_)
- Fix creation of entry points when path contains spaces - by :user:`nsoranzo`. (`#1660 <https://github.com/pypa/virtualenv/issues/1660>`_)
- Fix relative paths for the zipapp (for python ``3.7+``) - by :user:`gaborbernat`. (`#1666 <https://github.com/pypa/virtualenv/issues/1666>`_)

v20.0.5 (2020-02-21)
--------------------

Features - 20.0.5
~~~~~~~~~~~~~~~~~
- Also create ``pythonX.X`` executables when creating pypy virtualenvs - by :user:`asottile` (`#1612 <https://github.com/pypa/virtualenv/issues/1612>`_)
- Fail with better error message if trying to install source with unsupported ``setuptools``, allow ``setuptools-scm >= 2``
  and move to legacy ``setuptools-scm`` format to support better older platforms (``CentOS 7`` and such) - by :user:`gaborbernat`. (`#1621 <https://github.com/pypa/virtualenv/issues/1621>`_)
- Report of the created virtual environment is now split across four short lines rather than one long - by :user:`gaborbernat` (`#1641 <https://github.com/pypa/virtualenv/issues/1641>`_)

Bugfixes - 20.0.5
~~~~~~~~~~~~~~~~~
- Add macOs Python 2 Framework support (now we test it with the CI via brew) - by :user:`gaborbernat` (`#1561 <https://github.com/pypa/virtualenv/issues/1561>`_)
- Fix losing of libpypy-c.so when the pypy executable is a symlink - by :user:`asottile` (`#1614 <https://github.com/pypa/virtualenv/issues/1614>`_)
- Discover python interpreter in a case insensitive manner - by :user:`PrajwalM2212` (`#1624 <https://github.com/pypa/virtualenv/issues/1624>`_)
- Fix cross interpreter support when the host python sets ``sys.base_executable`` based on ``__PYVENV_LAUNCHER__`` -
  by :user:`cjolowicz` (`#1643 <https://github.com/pypa/virtualenv/issues/1643>`_)


v20.0.4 (2020-02-14)
--------------------

Features - 20.0.4
~~~~~~~~~~~~~~~~~
- When aliasing interpreters, use relative symlinks - by :user:`asottile`. (`#1596 <https://github.com/pypa/virtualenv/issues/1596>`_)

Bugfixes - 20.0.4
~~~~~~~~~~~~~~~~~
- Allow the use of ``/`` as pathname component separator on Windows - by ``vphilippon`` (`#1582 <https://github.com/pypa/virtualenv/issues/1582>`_)
- Lower minimal version of six required to 1.9 - by ``ssbarnea`` (`#1606 <https://github.com/pypa/virtualenv/issues/1606>`_)


v20.0.3 (2020-02-12)
--------------------

Bugfixes - 20.0.3
~~~~~~~~~~~~~~~~~
- On Python 2 with Apple Framework builds the global site package is no longer added when the
  :option:`system-site-packages` is not specified - by :user:`gaborbernat`. (`#1561 <https://github.com/pypa/virtualenv/issues/1561>`_)
- Fix system python discovery mechanism when prefixes contain relative parts (e.g. ``..``) by resolving paths within the
  python information query - by :user:`gaborbernat`. (`#1583 <https://github.com/pypa/virtualenv/issues/1583>`_)
- Expose a programmatic API as ``from virtualenv import cli_run`` - by :user:`gaborbernat`. (`#1585 <https://github.com/pypa/virtualenv/issues/1585>`_)
- Fix ``app-data`` :option:`seeder` injects a extra ``.dist-info.virtualenv`` path that breaks ``importlib.metadata``,
  now we inject an extra ``.virtualenv`` - by :user:`gaborbernat`. (`#1589 <https://github.com/pypa/virtualenv/issues/1589>`_)

Improved Documentation - 20.0.3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Document a programmatic API as ``from virtualenv import cli_run`` under :ref:`programmatic_api` -
  by :user:`gaborbernat`. (`#1585 <https://github.com/pypa/virtualenv/issues/1585>`_)


v20.0.2 (2020-02-11)
--------------------

Features - 20.0.2
~~~~~~~~~~~~~~~~~
- Print out a one line message about the created virtual environment when no :option:`verbose` is set, this can now be
  silenced to get back the original behaviour via the :option:`quiet` flag - by :user:`pradyunsg`. (`#1557 <https://github.com/pypa/virtualenv/issues/1557>`_)
- Allow virtualenv's app data cache to be overridden by ``VIRTUALENV_OVERRIDE_APP_DATA`` - by :user:`asottile`. (`#1559 <https://github.com/pypa/virtualenv/issues/1559>`_)
- Passing in the virtual environment name/path is now required (no longer defaults to ``venv``) - by :user:`gaborbernat`. (`#1568 <https://github.com/pypa/virtualenv/issues/1568>`_)
- Add a CLI flag :option:`with-traceback` that allows displaying the stacktrace of the virtualenv when a failure occurs
  - by :user:`gaborbernat`. (`#1572 <https://github.com/pypa/virtualenv/issues/1572>`_)

Bugfixes - 20.0.2
~~~~~~~~~~~~~~~~~
- Support long path names for generated virtual environment console entry points (such as ``pip``) when using the
  ``app-data`` :option:`seeder` - by :user:`gaborbernat`. (`#997 <https://github.com/pypa/virtualenv/issues/997>`_)
- Improve python discovery mechanism:

  - do not fail if there are executables that fail to query (e.g. for not having execute access to it) on the ``PATH``,
  - beside the prefix folder also try with the platform dependent binary folder within that,

  by :user:`gaborbernat`. (`#1545 <https://github.com/pypa/virtualenv/issues/1545>`_)
- When copying (either files or trees) do not copy the permission bits, last access time, last modification time, and
  flags as access to these might be forbidden (for example in case of the macOs Framework Python) and these are not needed
  for the user to use the virtual environment - by :user:`gaborbernat`. (`#1561 <https://github.com/pypa/virtualenv/issues/1561>`_)
- While discovering a python executables interpreters that cannot be queried are now displayed with info level rather
  than warning, so now they're no longer shown by default (these can be just executables to which we don't have access
  or that are broken, don't warn if it's not the target Python we want) - by :user:`gaborbernat`. (`#1574 <https://github.com/pypa/virtualenv/issues/1574>`_)
- The ``app-data`` :option:`seeder` no longer symlinks the packages on UNIX and copies on Windows. Instead by default
  always copies, however now has the :option:`symlink-app-data` flag allowing users to request this less robust but faster
  method - by :user:`gaborbernat`. (`#1575 <https://github.com/pypa/virtualenv/issues/1575>`_)

Improved Documentation - 20.0.2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Add link to the `legacy documentation <https://virtualenv.pypa.io/en/legacy>`_ for the changelog by :user:`jezdez`. (`#1547 <https://github.com/pypa/virtualenv/issues/1547>`_)
- Fine tune the documentation layout: default width of theme, allow tables to wrap around, soft corners for code snippets
  - by :user:`pradyunsg`. (`#1548 <https://github.com/pypa/virtualenv/issues/1548>`_)


v20.0.1 (2020-02-10)
--------------------

Features - 20.0.1
~~~~~~~~~~~~~~~~~
- upgrade embedded setuptools to ``45.2.0`` from ``45.1.0`` for Python ``3.4+`` - by :user:`gaborbernat`. (`#1554 <https://github.com/pypa/virtualenv/issues/1554>`_)

Bugfixes - 20.0.1
~~~~~~~~~~~~~~~~~
- Virtual environments created via relative path on Windows creates bad console executables - by :user:`gaborbernat`. (`#1552 <https://github.com/pypa/virtualenv/issues/1552>`_)
- Seems sometimes venvs created set their base executable to themselves; we accept these without question, so we handle
  virtual environments as system pythons causing issues - by :user:`gaborbernat`. (`#1553 <https://github.com/pypa/virtualenv/issues/1553>`_)


v20.0.0. (2020-02-10)
---------------------

Improved Documentation - 20.0.0.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Fixes typos, repeated words and inconsistent heading spacing. Rephrase parts of the development documentation and CLI
  documentation. Expands shorthands like ``env var`` and ``config`` to their full forms. Uses descriptions from respective
  documentation, for projects listed in ``related links`` - by :user:`pradyunsg`. (`#1540 <https://github.com/pypa/virtualenv/issues/1540>`_)

v20.0.0b2 (2020-02-04)
----------------------

Features - 20.0.0b2
~~~~~~~~~~~~~~~~~~~
- Improve base executable discovery mechanism:

  - print at debug level why we refuse some candidates,
  - when no candidates match exactly, instead of hard failing fallback to the closest match where the priority of
    matching attributes is: python implementation, major version, minor version, architecture, patch version,
    release level and serial (this is to facilitate things to still work when the OS upgrade replace/upgrades the system
    python with a never version, than what the virtualenv host python was created with),
  - always resolve system_executable information during the interpreter discovery, and the discovered environment is the
    system interpreter instead of the venv/virtualenv (this happened before lazily the first time we accessed, and caused
    reporting that the created virtual environment is of type of the virtualenv host python version, instead of the
    system pythons version - these two can differ if the OS upgraded the system python underneath and the virtualenv
    host was created via copy),

  by :user:`gaborbernat`. (`#1515 <https://github.com/pypa/virtualenv/issues/1515>`_)
- Generate ``bash`` and ``fish`` activators on Windows too (as these can be available with git bash, cygwin or mysys2)
  - by :user:`gaborbernat`. (`#1527 <https://github.com/pypa/virtualenv/issues/1527>`_)
- Upgrade the bundled ``wheel`` package from ``0.34.0`` to ``0.34.2`` - by :user:`gaborbernat`. (`#1531 <https://github.com/pypa/virtualenv/issues/1531>`_)

Bugfixes - 20.0.0b2
~~~~~~~~~~~~~~~~~~~
- Bash activation script should have no extensions instead of ``.sh`` (this fixes the :pypi:`virtualenvwrapper`
  integration) - by :user:`gaborbernat`. (`#1508 <https://github.com/pypa/virtualenv/issues/1508>`_)
- Show less information when we run with a single verbosity (``-v``):

  - no longer shows accepted interpreters information (as the last proposed one is always the accepted one),
  - do not display the ``str_spec`` attribute for ``PythonSpec`` as these can be deduced from the other attributes,
  - for the ``app-data`` seeder do not show the type of lock, only the path to the app data directory,

  By :user:`gaborbernat`. (`#1510 <https://github.com/pypa/virtualenv/issues/1510>`_)
- Fixed cannot discover a python interpreter that has already been discovered under a different path (such is the case
  when we have multiple symlinks to the same interpreter) - by :user:`gaborbernat`. (`#1512 <https://github.com/pypa/virtualenv/issues/1512>`_)
- Support relative paths for ``-p`` - by :user:`gaborbernat`. (`#1514 <https://github.com/pypa/virtualenv/issues/1514>`_)
- Creating virtual environments in parallel fail with cannot acquire lock within app data - by :user:`gaborbernat`. (`#1516 <https://github.com/pypa/virtualenv/issues/1516>`_)
- pth files were not processed under Debian CPython2 interpreters - by :user:`gaborbernat`. (`#1517 <https://github.com/pypa/virtualenv/issues/1517>`_)
- Fix prompt not displayed correctly with upcoming fish 3.10 due to us not preserving ``$pipestatus`` - by
  :user:`krobelus`. (`#1530 <https://github.com/pypa/virtualenv/issues/1530>`_)
- Stable order within ``pyenv.cfg`` and add ``include-system-site-packages`` only for creators that reference a global
  Python - by user:`gaborbernat`. (`#1535 <https://github.com/pypa/virtualenv/issues/1535>`_)

Improved Documentation - 20.0.0b2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Create the first iteration of the new documentation - by :user:`gaborbernat`. (`#1465 <https://github.com/pypa/virtualenv/issues/1465>`_)
- Project readme is now of type MarkDown instead of reStructuredText - by :user:`gaborbernat`. (`#1531 <https://github.com/pypa/virtualenv/issues/1531>`_)


v20.0.0b1 (2020-01-28)
----------------------

* First public release of the rewrite. Everything is brand new and just added.
* ``--download`` defaults to ``False``

.. warning::

   The current virtualenv is the second iteration of implementation. From version ``0.8`` all the way to ``16.7.9``
   we numbered the first iteration. Version ``20.0.0b1`` is a complete rewrite of the package, and as such this release
   history starts from there. The old changelog is still available in the
   `legacy branch documentation <https://virtualenv.pypa.io/en/legacy/changes.html>`_.
PK�(�\�t0��/doc/alt-python-virtualenv/docs/installation.rstnu�[���Installation
============

via pipx
--------

:pypi:`virtualenv` is a CLI tool that needs a Python interpreter to run. If you already have a ``Python 3.5+``
interpreter the best is to use :pypi:`pipx` to install virtualenv into an isolated environment. This has the added
benefit that later you'll be able to upgrade virtualenv without affecting other parts of the system.

.. code-block:: console

    pipx install virtualenv
    virtualenv --help

via pip
-------

Alternatively you can install it within the global Python interpreter itself (perhaps as a user package via the
``--user`` flag). Be cautious if you are using a python install that is managed by your operating system or
another package manager. ``pip`` might not coordinate with those tools, and may leave your system in an
inconsistent state. Note, if you go down this path you need to ensure pip is new enough per the subsections below:

.. code-block:: console

    python -m pip install --user virtualenv
    python -m virtualenv --help

wheel
~~~~~
Installing virtualenv via a wheel (default with pip) requires an installer that can understand the ``python-requires``
tag (see `PEP-503 <https://www.python.org/dev/peps/pep-0503/>`_), with pip this is version ``9.0.0`` (released 2016
November). Furthermore, in case you're not installing it via the PyPi you need to be using a mirror that correctly
forwards the ``python-requires`` tag (notably the OpenStack mirrors don't do this, or older
`devpi <https://github.com/devpi/devpi>`_ versions - added with version ``4.7.0``).

.. _sdist:

sdist
~~~~~
When installing via a source distribution you need an installer that handles the
`PEP-517 <https://www.python.org/dev/peps/pep-0517/>`_ specification. In case of ``pip`` this is version ``18.0.0`` or
later (released on 2018 July). If you cannot upgrade your pip to support this you need to ensure that the build
requirements from `pyproject.toml <https://github.com/pypa/virtualenv/blob/main/pyproject.toml#L2>`_ are satisfied
before triggering the install.

via zipapp
----------

You can use virtualenv without installing it too. We publish a Python
`zipapp <https://docs.python.org/3/library/zipapp.html>`_, you can just download this from
`https://bootstrap.pypa.io/virtualenv.pyz <https://bootstrap.pypa.io/virtualenv.pyz>`_ and invoke this package
with a python interpreter:

.. code-block:: console

    python virtualenv.pyz --help

The root level zipapp is always the current latest release. To get the last supported zipapp against a given python
minor release use the link ``https://bootstrap.pypa.io/virtualenv/x.y/virtualenv.pyz``, e.g. for the last virtualenv
supporting Python 2.7 use
`https://bootstrap.pypa.io/virtualenv/2.7/virtualenv.pyz <https://bootstrap.pypa.io/virtualenv/2.7/virtualenv.pyz>`_.

If you are looking for past version of virtualenv.pyz they are available here:
https://github.com/pypa/get-virtualenv/blob/<virtualenv version>/public/<python version>/virtualenv.pyz?raw=true

via ``setup.py``
----------------
We don't recommend and officially support this method. One should prefer using an installer that supports
`PEP-517 <https://www.python.org/dev/peps/pep-0517/>`_ interface, such as pip ``19.0.0`` or later. That being said you
might be able to still install a package via this method if you satisfy build dependencies before calling the install
command (as described under :ref:`sdist`).

latest unreleased
-----------------
Installing an unreleased version is discouraged and should be only done for testing purposes. If you do so you'll need
a pip version of at least ``18.0.0`` and use the following command:


.. code-block:: console

    pip install git+https://github.com/pypa/virtualenv.git@main

.. _compatibility-requirements:

Python and OS Compatibility
---------------------------

virtualenv works with the following Python interpreter implementations:

- `CPython <https://www.python.org/>`_ versions 2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10
- `PyPy <https://pypy.org/>`_ 2.7 and 3.5+.

This means virtualenv works on the latest patch version of each of these minor versions. Previous patch versions are
supported on a best effort approach.

CPython is shipped in multiple forms, and each OS repackages it, often applying some customization along the way.
Therefore we cannot say universally that we support all platforms, but rather specify some we test against. In case
of ones not specified here the support is unknown, though likely will work. If you find some cases please open a feature
request on our issue tracker.

Linux
~~~~~
- installations from `python.org <https://www.python.org/downloads/>`_
- Ubuntu 16.04+ (both upstream and `deadsnakes <https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa>`_ builds)
- Fedora
- RHEL and CentOS
- OpenSuse
- Arch Linux

macOS
~~~~~
In case of macOS we support:

- installations from `python.org <https://www.python.org/downloads/>`_
- python versions installed via `brew <https://docs.brew.sh/Homebrew-and-Python>`_ (both older python2.7 and python3)
- Python 3 part of XCode (Python framework - ``/Library/Frameworks/Python3.framework/``)
- Python 2 part of the OS (``/System/Library/Frameworks/Python.framework/Versions/``)

Windows
~~~~~~~
- Installations from `python.org <https://www.python.org/downloads/>`_
- Windows Store Python - note only `version 3.7+ <https://www.microsoft.com/en-us/p/python-38/9mssztt1n39l>`_

Packaging variants
~~~~~~~~~~~~~~~~~~
- Normal variant (file structure as comes from `python.org <https://www.python.org/downloads/>`_).
- We support CPython 2 system installations that do not contain the python files for the standard library if the
  respective compiled files are present (e.g. only ``os.pyc``, not ``os.py``). This can be used by custom systems may
  want to maximize available storage or obfuscate source code by removing ``.py`` files.
PK�(�\s�$=
=
0doc/alt-python-virtualenv/docs/cli_interface.rstnu�[���CLI interface
=============

.. _cli_flags:

CLI flags
~~~~~~~~~

``virtualenv`` is primarily a command line application.

It modifies the environment variables in a shell to create an isolated Python environment, so you'll need to have a
shell to run it. You can type in ``virtualenv`` (name of the application) followed by flags that control its
behaviour. All options have sensible defaults, and there's one required argument: then name/path of the virtual
environment to create. The default values for the command line options can be overridden via the
:ref:`conf_file` or :ref:`env_vars`. Environment variables takes priority over the configuration file values
(``--help`` will show if a default comes from the environment variable as the help message will end in this case
with environment variables or the configuration file).

The options that can be passed to virtualenv, along with their default values and a short description are listed below.

:command:`virtualenv [OPTIONS]`

.. table_cli::
   :module: virtualenv.run
   :func: build_parser_only

Defaults
~~~~~~~~

.. _conf_file:

Configuration file
^^^^^^^^^^^^^^^^^^

virtualenv looks for a standard ini configuration file. The exact location depends on the operating system you're using,
as determined by :pypi:`platformdirs` application configuration definition. The configuration file location is printed as at
the end of the output when ``--help`` is passed.

The keys of the settings are derived from the command line option (left strip the ``-`` characters, and replace ``-``
with ``_``). Where multiple flags are available first found wins (where order is as it shows up under the ``--help``).

For example, :option:`--python <python>` would be specified as:

.. code-block:: ini

  [virtualenv]
  python = /opt/python-3.8/bin/python

Options that take multiple values, like :option:`extra-search-dir` can be specified as:

.. code-block:: ini

  [virtualenv]
  extra_search_dir =
      /path/to/dists
      /path/to/other/dists

.. _env_vars:

Environment Variables
^^^^^^^^^^^^^^^^^^^^^

Default values may be also specified via environment variables. The keys of the settings are derived from the
command line option (left strip the ``-`` characters, and replace ``-`` with ``_``, finally capitalize the name). Where
multiple flags are available first found wins (where order is as it shows up under the ``--help``).

For example, to use a custom Python binary, instead of the one virtualenv is run with, you can set the environment
variable ``VIRTUALENV_PYTHON`` like:

.. code-block:: console

   env VIRTUALENV_PYTHON=/opt/python-3.8/bin/python virtualenv

Where the option accepts multiple values, for example for :option:`python` or
:option:`extra-search-dir`, the values can be separated either by literal
newlines or commas. Newlines and commas can not be mixed and if both are
present only the newline is used for separating values. Examples for multiple
values:


.. code-block:: console

   env VIRTUALENV_PYTHON=/opt/python-3.8/bin/python,python3.8 virtualenv
   env VIRTUALENV_EXTRA_SEARCH_DIR=/path/to/dists\n/path/to/other/dists virtualenv

The equivalent CLI-flags based invocation for the above examples would be:

.. code-block:: console

   virtualenv --python=/opt/python-3.8/bin/python --python=python3.8
   virtualenv --extra-search-dir=/path/to/dists --extra-search-dir=/path/to/other/dists
PK�(�\6Cn�8doc/alt-python-virtualenv/docs/changelog/bugfix.2269.rstnu�[���Fix ``AttributeError: 'bool' object has no attribute 'error'`` when creating a
Python 2.x virtualenv on macOS - by ``moreati``
PK�(�\?�-�PP5doc/alt-python-virtualenv/docs/changelog/examples.rstnu�[���.. examples for changelog entries adding to your Pull Requests

file ``544.doc.rst``::

    explain everything much better - by ``passionate_technicalwriter``

file ``544.feature.rst``::

    ``tox --version`` now shows information about all registered plugins - by ``obestwalter``


file ``571.bugfix.rst``::

    ``skip_install`` overrides ``usedevelop`` (``usedevelop`` is an option to choose the
    installation type if the package is installed and ``skip_install`` determines if it should be
    installed at all) - by ``ferdonline``

.. see pyproject.toml for all available categories
PK�(�\�,�;;8doc/alt-python-virtualenv/docs/changelog/template.jinja2nu�[���{% set top_underline = underlines[0] %}
{% if versiondata.name %}
v{{ versiondata.version }} ({{ versiondata.date }})
{{ top_underline * ((versiondata.version + versiondata.date)|length + 4)}}
{% else %}
{{ versiondata.version }} ({{ versiondata.date }})
{{ top_underline * ((versiondata.version + versiondata.date)|length + 3)}}
{% endif %}

{% for section, _ in sections.items() %}
{% set underline = underlines[1] %}
{% if sections[section] %}
{% for category, val in definitions.items() if category in sections[section]%}
{{ definitions[category]['name'] }} - {{ versiondata.version }}
{{ underline * ((definitions[category]['name']  + versiondata.version)|length + 3)}}
{% if definitions[category]['showcontent'] %}
{% for text, values in sections[section][category].items() %}
- {{ text }} ({{ values|join(', ') }})
{% endfor %}

{% else %}
- {{ sections[section][category]['']|join(', ') }}

{% endif %}
{% if sections[section][category]|length == 0 %}
No significant changes.

{% else %}
{% endif %}
{% endfor %}
{% else %}
No significant changes.


{% endif %}
{% endfor %}
PK�(�\�E�8doc/alt-python-virtualenv/docs/changelog/bugfix.2271.rstnu�[���Fix ``PermissionError: [Errno 1] Operation not permitted`` when creating a
Python 2.x virtualenv on macOS/arm64 - by ``moreati``
PK�(�\ȓ�`==-doc/alt-python-virtualenv/docs/user_guide.rstnu�[���User Guide
==========

Introduction
------------

Virtualenv has one basic command:

.. code-block:: console

    virtualenv venv

This will create a python virtual environment of the same version as virtualenv, installed into the subdirectory
``venv``. The command line tool has quite a few of flags that modify the tool's behaviour, for a
full list make sure to check out :ref:`cli_flags`.

The tool works in two phases:

- **Phase 1** discovers a python interpreter to create a virtual environment from (by default this is the same python
  as the one ``virtualenv`` is running from, however we can change this via the :option:`p` option).
- **Phase 2** creates a virtual environment at the specified destination (:option:`dest`), this can be broken down into
  four further sub-steps:

  - create a python that matches the target python interpreter from phase 1,
  - install (bootstrap) seed packages (one or more of :pypi:`pip`, :pypi:`setuptools`, :pypi:`wheel`) in the created
    virtual environment,
  - install activation scripts into the binary directory of the virtual environment (these will allow end users to
    *activate* the virtual environment from various shells).
  - create files that mark the virtual environment as to be ignored by version control systems (currently we support
    Git only, as Mercurial, Bazaar or SVN do not support ignore files in subdirectories). This step can be skipped
    with the :option:`no-vcs-ignore` option.


The python in your new virtualenv is effectively isolated from the python that was used to create it.

Python discovery
----------------

The first thing we need to be able to create a virtual environment is a python interpreter. This will describe to the
tool what type of virtual environment you would like to create, think of it as: version, architecture, implementation.

``virtualenv`` being a python application has always at least one such available, the one ``virtualenv`` itself is
using, and as such this is the default discovered element. This means that if you install ``virtualenv`` under
python ``3.8``, virtualenv will by default create virtual environments that are also of version ``3.8``.

Created python virtual environments are usually not self-contained. A complete python packaging is usually made up of
thousands of files, so it's not efficient to install the entire python again into a new folder. Instead virtual
environments are mere shells, that contain little within themselves, and borrow most from the system python (this is what
you installed, when you installed python itself). This does mean that if you upgrade your system python your virtual
environments *might* break, so watch out. The upside of this, referring to the system python, is that creating virtual
environments can be fast.

Here we'll describe the built-in mechanism (note this can be extended though by plugins). The CLI flag :option:`p` or
:option:`python` allows you to specify a python specifier for what type of virtual environment you would like, the
format is either:

- a relative/absolute path to a Python interpreter,

- a specifier identifying the Python implementation, version, architecture in the following format:

    .. code-block::

       {python implementation name}{version}{architecture}

    We have the following restrictions:

    - the python implementation is all alphabetic characters (``python`` means any implementation, and if is missing it
      defaults to ``python``),
    - the version is a dot separated version number,
    - the architecture is either ``-64`` or ``-32`` (missing means ``any``).

    For example:

    - ``python3.8.1`` means any python implementation having the version ``3.8.1``,
    - ``3`` means any python implementation having the major version ``3``,
    - ``cpython3`` means a ``CPython`` implementation having the version ``3``,
    - ``pypy2`` means a python interpreter with the ``PyPy`` implementation and major version ``2``.

  Given the specifier ``virtualenv`` will apply the following strategy to discover/find the system executable:

   - If we're on Windows look into the Windows registry, and check if we see any registered Python implementations that
     match the specification. This is in line with expectation laid out inside
     `PEP-514 <https://www.python.org/dev/peps/pep-0514/>`_
   - Try to discover a matching python executable within the folders enumerated on the ``PATH`` environment variable.
     In this case we'll try to find an executable that has a name roughly similar to the specification (for exact logic,
     please see the implementation code).

.. warning::

   As detailed above, virtual environments usually just borrow things from the system Python, they don't actually contain
   all the data from the system Python. The version of the python executable is hardcoded within the python exe itself.
   Therefore, if you upgrade your system Python, your virtual environment will still report the version before the
   upgrade, even though now other than the executable all additional content (standard library, binary libs, etc) are
   of the new version.

   Barring any major incompatibilities (rarely the case) the virtual environment will continue working, but other than
   the content embedded within the python executable it will behave like the upgraded version. If such a virtual
   environment python is specified as the target python interpreter, we will create virtual environments that match the
   new system Python version, not the version reported by the virtual environment.

Creators
--------

These are what actually setup the virtual environment, usually as a reference against the system python. virtualenv
at the moment has two types of virtual environments:

- ``venv`` - this delegates the creation process towards the ``venv`` module, as described in
  `PEP 405 <https://www.python.org/dev/peps/pep-0405>`_. This is only available on Python interpreters having version
  ``3.5`` or later, and also has the downside that virtualenv **must** create a process to invoke that module (unless
  virtualenv is installed in the system python), which can be an expensive operation (especially true on Windows).

- ``builtin`` - this means ``virtualenv`` is able to do the creation operation itself (by knowing exactly what files to
  create and what system files need to be referenced). The creator with name ``builtin`` is an alias on the first
  creator that's of this type (we provide creators for various target environments, that all differ in actual create
  operations, such as CPython 2 on Windows, PyPy2 on Windows, CPython3 on Posix, PyPy3 on Posix, and so on; for a full
  list see :option:`creator`).

Seeders
-------
These will install for you some seed packages (one or more of: :pypi:`pip`, :pypi:`setuptools`, :pypi:`wheel`) that
enables you to install additional python packages into the created virtual environment (by invoking pip). There are two
main seed mechanism available:

- ``pip`` - this method uses the bundled pip with virtualenv to install the seed packages (note, a new child process
  needs to be created to do this, which can be expensive especially on Windows).
- ``app-data`` - this method uses the user application data directory to create install images. These images are needed
  to be created only once, and subsequent virtual environments can just link/copy those images into their pure python
  library path (the ``site-packages`` folder). This allows all but the first virtual environment creation to be blazing
  fast (a ``pip`` mechanism takes usually 98% of the virtualenv creation time, so by creating this install image that
  we can just link into the virtual environments install directory we can achieve speedups of shaving the initial
  1 minute and 10 seconds down to just 8 seconds in case of a copy, or ``0.8`` seconds in case symlinks are available -
  this is on Windows, Linux/macOS with symlinks this can be as low as ``100ms`` from 3+ seconds).
  To override the filesystem location of the seed cache, one can use the
  ``VIRTUALENV_OVERRIDE_APP_DATA`` environment variable.

.. _wheels:

Wheels
~~~~~~

To install a seed package via either ``pip`` or ``app-data`` method virtualenv needs to acquire a wheel of the target
package. These wheels may be acquired from multiple locations as follows:

- ``virtualenv`` ships out of box with a set of embed ``wheels`` for all three seed packages (:pypi:`pip`,
  :pypi:`setuptools`, :pypi:`wheel`). These are packaged together with the virtualenv source files, and only change upon
  upgrading virtualenv. Different Python versions require different versions of these, and because virtualenv supports a
  wide range of Python versions, the number of embedded wheels out of box is greater than 3. Whenever newer versions of
  these embedded packages are released upstream ``virtualenv`` project upgrades them, and does a new release. Therefore,
  upgrading virtualenv periodically will also upgrade the version of the seed packages.
- However, end users might not be able to upgrade virtualenv at the same speed as we do new releases. Therefore, a user
  might request to upgrade the list of embedded wheels by invoking virtualenv with the :option:`upgrade-embed-wheels`
  flag. If the operation is triggered in such a manual way subsequent runs of virtualenv will always use the upgraded
  embed wheels.

  The operation can trigger automatically too, as a background process upon invocation of virtualenv, if no such upgrade
  has been performed in the last 14 days. It will only start using automatically upgraded wheel if they have been
  released for more than 28 days, and the automatic upgrade finished at least an hour ago:

  - the 28 days period should guarantee end users are not pulling in automatically releases that have known bugs within,
  - the one hour period after the automatic upgrade finished is implemented so that continuous integration services do
    not start using a new embedded versions half way through.


  The automatic behaviour might be disabled via the :option:`no-periodic-update` configuration flag/option. To acquire
  the release date of a package virtualenv will perform the following:

  - lookup ``https://pypi.org/pypi/<distribution>/json`` (primary truth source),
  - save the date the version was first discovered, and wait until 28 days passed.
- Users can specify a set of local paths containing additional wheels by using the :option:`extra-search-dir` command
  line argument flag.

When searching for a wheel to use virtualenv performs lookup in the following order:

- embedded wheels,
- upgraded embedded wheels,
- extra search dir.

Bundled wheels are all three above together. If neither of the locations contain the requested wheel version or
:option:`download` option is set will use ``pip`` download to load the latest version available from the index server.

.. _distribution_wheels:

Embed wheels for distributions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Custom distributions often want to use their own set of wheel versions to distribute instead of the one virtualenv
releases on PyPi. The reason for this is trying to keep the system versions of those packages in sync with what
virtualenv uses. In such cases they should patch the module `virtualenv.seed.wheels.embed
<https://github.com/pypa/virtualenv/tree/main/src/virtualenv/seed/wheels/embed>`_, making sure to provide the function
``get_embed_wheel`` (which returns the wheel to use given a distribution/python version). The ``BUNDLE_FOLDER``,
``BUNDLE_SUPPORT`` and ``MAX`` variables are needed if they want to use virtualenv's test suite to validate.

Furthermore, they might want to disable the periodic update by patching the
`virtualenv.seed.embed.base_embed.PERIODIC_UPDATE_ON_BY_DEFAULT
<https://github.com/pypa/virtualenv/tree/main/src/virtualenv/seed/embed/base_embed.py>`_
to ``False``, and letting the system update mechanism to handle this. Note in this case the user might still request an
upgrade of the embedded wheels by invoking virtualenv via :option:`upgrade-embed-wheels`, but no longer happens
automatically, and will not alter the OS provided wheels.

Activators
----------
These are activation scripts that will mangle with your shell's settings to ensure that commands from within the python
virtual environment take priority over your system paths. For example, if invoking ``pip`` from your shell returned the
system python's pip before activation, once you do the activation this should refer to the virtual environments ``pip``.
Note, though that all we do is change priority; so, if your virtual environments ``bin``/``Scripts`` folder does not
contain some executable, this will still resolve to the same executable it would have resolved before the activation.

For a list of shells we provide activators see :option:`activators`. The location of these is right alongside the python
executables ( usually ``Scripts`` folder on Windows, ``bin`` on POSIX), and are named as ``activate`` (and some
extension that's specific per activator; no extension is bash). You can invoke them, usually by source-ing (the source
command might vary by shell - e.g. bash is ``.``):

.. code-block:: console

   source bin/activate

This is all it does; it's purely a convenience of prepending the virtual environment's binary folder onto the ``PATH``
environment variable. Note you don't have to activate a virtual environment to use it. In this case though you would
need to type out the path to the executables, rather than relying on your shell to resolve them to your virtual
environment.

The ``activate`` script will also modify your shell prompt to indicate which environment is currently active. The script
also provisions a ``deactivate`` command that will allow you to undo the operation:

.. code-block:: console

   deactivate


.. note::

    If using Powershell, the ``activate`` script is subject to the
    `execution policies <http://technet.microsoft.com/en-us/library/dd347641.aspx>`_ on the system. By default, Windows
    7 and later, the system's execution policy is set to ``Restricted``, meaning no scripts like the ``activate`` script
    are allowed to be executed.

    However, that can't stop us from changing that slightly to allow it to be executed. You may relax the system
    execution policy to allow running of local scripts without verifying the code signature using the following:

    .. code-block:: powershell

       Set-ExecutionPolicy RemoteSigned

    Since the ``activate.ps1`` script is generated locally for each virtualenv, it is not considered a remote script and
    can then be executed.

A longer explanation of this can be found within Allison Kaptur's 2013 blog post: `There's no magic: virtualenv
edition <https://www.recurse.com/blog/14-there-is-no-magic-virtualenv-edition>`_ explains how virtualenv uses bash and
Python and ``PATH`` and ``PYTHONHOME`` to isolate virtual environments' paths.

.. _programmatic_api:

Programmatic API
----------------

At the moment ``virtualenv`` offers only CLI level interface. If you want to trigger invocation of Python environments
from within Python you should be using the ``virtualenv.cli_run`` method; this takes an ``args`` argument where you can
pass the options the same way you would from the command line. The run will return a session object containing data
about the created virtual environment.

.. code-block:: python

   from virtualenv import cli_run

   cli_run(["venv"])

.. automodule:: virtualenv
   :members:

.. currentmodule:: virtualenv.run.session

.. autoclass:: Session
    :members:
PK�(�\-����	�	&doc/alt-python-virtualenv/docs/conf.pynu�[���import subprocess
import sys
from datetime import date, datetime
from pathlib import Path

import sphinx_rtd_theme

from virtualenv.version import __version__

company = "PyPA"
name = "virtualenv"
version = ".".join(__version__.split(".")[:2])
release = __version__
copyright = f"2007-{date.today().year}, {company}, PyPA"

extensions = [
    "sphinx.ext.autodoc",
    "sphinx.ext.autosectionlabel",
    "sphinx.ext.extlinks",
]

templates_path = []
unused_docs = []
source_suffix = ".rst"
exclude_patterns = ["_build", "changelog/*", "_draft.rst"]

main_doc = "index"
pygments_style = "default"
always_document_param_types = True
project = name
today_fmt = "%B %d, %Y"

html_theme = "sphinx_rtd_theme"
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
html_theme_options = {
    "canonical_url": "https://virtualenv.pypa.io/",
    "logo_only": False,
    "display_version": True,
    "prev_next_buttons_location": "bottom",
    "collapse_navigation": False,
    "sticky_navigation": True,
    "navigation_depth": 6,
    "includehidden": True,
}
html_static_path = ["_static"]
html_last_updated_fmt = datetime.now().isoformat()
htmlhelp_basename = "Pastedoc"
autoclass_content = "both"  # Include __init__ in class documentation
autodoc_member_order = "bysource"
autosectionlabel_prefix_document = True

extlinks = {
    "issue": ("https://github.com/pypa/virtualenv/issues/%s", "#"),
    "pull": ("https://github.com/pypa/virtualenv/pull/%s", "PR #"),
    "user": ("https://github.com/%s", "@"),
    "pypi": ("https://pypi.org/project/%s", ""),
}


def generate_draft_news():
    root = Path(__file__).parents[1]
    new = subprocess.check_output(
        [sys.executable, "-m", "towncrier", "--draft", "--version", "NEXT"],
        cwd=root,
        universal_newlines=True,
    )
    dest = root / "docs" / "_draft.rst"
    dest.write_text("" if "No significant changes" in new else new)


generate_draft_news()


def setup(app):
    # the CLI arguments are dynamically generated
    doc_tree = Path(app.doctreedir)
    cli_interface_doctree = doc_tree / "cli_interface.doctree"
    if cli_interface_doctree.exists():
        cli_interface_doctree.unlink()

    HERE = Path(__file__).parent
    if str(HERE) not in sys.path:
        sys.path.append(str(HERE))

    # noinspection PyUnresolvedReferences
    from render_cli import CliTable, literal_data

    app.add_css_file("custom.css")
    app.add_directive(CliTable.name, CliTable)
    app.add_role("literal_data", literal_data)
PK�(�\�
�`&`&.doc/alt-python-virtualenv/docs/development.rstnu�[���Development
===========

Getting started
---------------


``virtualenv`` is a volunteer maintained open source project and we welcome contributions of all forms. The sections
below will help you get started with development, testing, and documentation. We’re pleased that you are interested in
working on virtualenv. This document is meant to get you setup to work on virtualenv and to act as a guide and reference
to the development setup. If you face any issues during this process, please
`open an issue <https://github.com/pypa/virtualenv/issues/new?title=Trouble+with+development+environment>`_ about it on
the issue tracker.

Setup
~~~~~

virtualenv is a command line application written in Python. To work on it, you'll need:

- **Source code**: available on `GitHub <https://github.com/pypa/virtualenv>`_. You can use ``git`` to clone the
    repository:

  .. code-block:: console

      git clone https://github.com/pypa/virtualenv
      cd virtualenv

- **Python interpreter**: We recommend using ``CPython``. You can use
  `this guide <https://realpython.com/installing-python/>`_ to set it up.

- :pypi:`tox`: to automatically get the projects development dependencies and run the test suite. We recommend
  installing it using `pipx <https://pipxproject.github.io/pipx/>`_.

Running from source tree
~~~~~~~~~~~~~~~~~~~~~~~~

The easiest way to do this is to generate the development tox environment, and then invoke virtualenv from under the
``.tox/dev`` folder

.. code-block:: console

    tox -e dev
    .tox/dev/bin/virtualenv  # on Linux
    .tox/dev/Scripts/virtualenv  # on Windows

Running tests
~~~~~~~~~~~~~

virtualenv's tests are written using the :pypi:`pytest` test framework. :pypi:`tox` is used to automate the setup
and execution of virtualenv's tests.

To run tests locally execute:

.. code-block:: console

    tox -e py

This will run the test suite for the same Python version as under which ``tox`` is installed. Alternatively you can
specify a specific version of python by using the ``pyNN`` format, such as: ``py38``, ``pypy3``, etc.

``tox`` has been configured to forward any additional arguments it is given to ``pytest``.
This enables the use of pytest's
`rich CLI <https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests>`_. As an example, you can
select tests using the various ways that pytest provides:

.. code-block:: console

    # Using markers
    tox -e py -- -m "not slow"
    # Using keywords
    tox -e py -- -k "test_extra"

Some tests require additional dependencies to be run, such is the various shell activators (``bash``, ``fish``,
``powershell``, etc). These tests will automatically be skipped if these are not present, note however that in CI
all tests are run; so even if all tests succeed locally for you, they may still fail in the CI.

Running linters
~~~~~~~~~~~~~~~

virtualenv uses :pypi:`pre-commit` for managing linting of the codebase. ``pre-commit`` performs various checks on all
files in virtualenv and uses tools that help follow a consistent code style within the codebase. To use linters locally,
run:

.. code-block:: console

    tox -e fix_lint

.. note::

    Avoid using ``# noqa`` comments to suppress linter warnings - wherever possible, warnings should be fixed instead.
    ``# noqa`` comments are reserved for rare cases where the recommended style causes severe readability problems.

Building documentation
~~~~~~~~~~~~~~~~~~~~~~

virtualenv's documentation is built using :pypi:`Sphinx`. The documentation is written in reStructuredText. To build it
locally, run:

.. code-block:: console

    tox -e docs

The built documentation can be found in the ``.tox/docs_out`` folder and may be viewed by opening ``index.html`` within
that folder.

Release
~~~~~~~

virtualenv's release schedule is tied to ``pip``, ``setuptools`` and ``wheel``. We bundle the latest version of these
libraries so each time there's a new version of any of these, there will be a new virtualenv release shortly afterwards
(we usually wait just a few days to avoid pulling in any broken releases).

Contributing
-------------

Submitting pull requests
~~~~~~~~~~~~~~~~~~~~~~~~

Submit pull requests against the ``main`` branch, providing a good description of what you're doing and why. You must
have legal permission to distribute any code you contribute to virtualenv and it must be available under the MIT
License. Provide tests that cover your changes and run the tests locally first. virtualenv
:ref:`supports <compatibility-requirements>` multiple Python versions and operating systems. Any pull request must
consider and work on all these platforms.

Pull Requests should be small to facilitate review. Keep them self-contained, and limited in scope. `Studies have shown
<https://www.kessler.de/prd/smartbear/BestPracticesForPeerCodeReview.pdf>`_ that review quality falls off as patch size
grows. Sometimes this will result in many small PRs to land a single large feature. In particular, pull requests must
not be treated as "feature branches", with ongoing development work happening within the PR. Instead, the feature should
be broken up into smaller, independent parts which can be reviewed and merged individually.

Additionally, avoid including "cosmetic" changes to code that is unrelated to your change, as these make reviewing the
PR more difficult. Examples include re-flowing text in comments or documentation, or addition or removal of blank lines
or whitespace within lines. Such changes can be made separately, as a "formatting cleanup" PR, if needed.

Automated testing
~~~~~~~~~~~~~~~~~

All pull requests and merges to 'main' branch are tested using
`Azure Pipelines <https://azure.microsoft.com/en-gb/services/devops/pipelines/>`_ (configured by
``azure-pipelines.yml`` file at the root of the repository). You can find the status and results to the CI runs for your
PR on GitHub's Web UI for the pull request. You can also find links to the CI services' pages for the specific builds in
the form of "Details" links, in case the CI run fails and you wish to view the output.

To trigger CI to run again for a pull request, you can close and open the pull request or submit another change to the
pull request. If needed, project maintainers can manually trigger a restart of a job/build.

NEWS entries
~~~~~~~~~~~~

The ``changelog.rst`` file is managed using :pypi:`towncrier` and all non trivial changes must be accompanied by a news
entry. To add an entry to the news file, first you need to have created an issue describing the change you want to
make. A Pull Request itself *may* function as such, but it is preferred to have a dedicated issue (for example, in case
the PR ends up rejected due to code quality reasons).

Once you have an issue or pull request, you take the number and you create a file inside of the ``docs/changelog``
directory named after that issue number with an extension of:

- ``feature.rst``,
- ``bugfix.rst``,
- ``doc.rst``,
- ``removal.rst``,
- ``misc.rst``.

Thus if your issue or PR number is ``1234`` and this change is fixing a bug, then you would create a file
``docs/changelog/1234.bugfix.rst``. PRs can span multiple categories by creating multiple files (for instance, if you
added a feature and deprecated/removed the old feature at the same time, you would create
``docs/changelog/1234.bugfix.rst`` and ``docs/changelog/1234.remove.rst``). Likewise if a PR touches multiple issues/PRs
you may create a file for each of them with the same contents and :pypi:`towncrier` will deduplicate them.

Contents of a NEWS entry
^^^^^^^^^^^^^^^^^^^^^^^^

The contents of this file are reStructuredText formatted text that will be used as the content of the news file entry.
You do not need to reference the issue or PR numbers here as towncrier will automatically add a reference to all of
the affected issues when rendering the news file.

In order to maintain a consistent style in the ``changelog.rst`` file, it is preferred to keep the news entry to the
point, in sentence case, shorter than 120 characters and in an imperative tone -- an entry should complete the sentence
``This change will …``. In rare cases, where one line is not enough, use a summary line in an imperative tone followed
by a blank line separating it from a description of the feature/change in one or more paragraphs, each wrapped
at 120 characters. Remember that a news entry is meant for end users and should only contain details relevant to an end
user.

Choosing the type of NEWS entry
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

A trivial change is anything that does not warrant an entry in the news file. Some examples are: code refactors that
don't change anything as far as the public is concerned, typo fixes, white space modification, etc. To mark a PR
as trivial a contributor simply needs to add a randomly named, empty file to the ``news/`` directory with the extension
of ``.trivial``.

Becoming a maintainer
~~~~~~~~~~~~~~~~~~~~~

If you want to become an official maintainer, start by helping out. As a first step, we welcome you to triage issues on
virtualenv's issue tracker. virtualenv maintainers provide triage abilities to contributors once they have been around
for some time and contributed positively to the project. This is optional and highly recommended for becoming a
virtualenv maintainer. Later, when you think you're ready, get in touch with one of the maintainers and they will
initiate a vote among the existing maintainers.

.. note::

    Upon becoming a maintainer, a person should be given access to various virtualenv-related tooling across
    multiple platforms. These are noted here for future reference by the maintainers:

    - GitHub Push Access
    - PyPI Publishing Access
    - CI Administration capabilities
    - ReadTheDocs Administration capabilities
PK�(�\�+""&doc/alt-python37-platformdirs/PKG-INFOnu�[���Metadata-Version: 2.1
Name: platformdirs
Version: 2.4.1
Summary: A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
Home-page: https://github.com/platformdirs/platformdirs
Maintainer: Bernát Gábor, Julian Berman, Ofek Lev, Ronny Pfannschmidt
Maintainer-email: gaborjbernat@gmail.com, Julian@GrayVines.com, oss@ofek.dev, opensource@ronnypfannschmidt.de
License: MIT
Project-URL: Source, https://github.com/platformdirs/platformdirs
Project-URL: Tracker, https://github.com/platformdirs/platformdirs/issues
Project-URL: Documentation, https://platformdirs.readthedocs.io/
Keywords: application directory log cache user
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.7
Description-Content-Type: text/x-rst
Provides-Extra: docs
Provides-Extra: test
License-File: LICENSE.txt

The problem
===========

.. image:: https://github.com/platformdirs/platformdirs/workflows/Test/badge.svg
   :target: https://github.com/platformdirs/platformdirs/actions?query=workflow%3ATest

When writing desktop application, finding the right location to store user data
and configuration varies per platform. Even for single-platform apps, there
may by plenty of nuances in figuring out the right location.

For example, if running on macOS, you should use::

    ~/Library/Application Support/<AppName>

If on Windows (at least English Win XP) that should be::

    C:\Documents and Settings\<User>\Application Data\Local Settings\<AppAuthor>\<AppName>

or possibly::

    C:\Documents and Settings\<User>\Application Data\<AppAuthor>\<AppName>

for `roaming profiles <https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-vista/cc766489(v=ws.10)>`_ but that is another story.

On Linux (and other Unices), according to the `XDG Basedir Spec`_, it should be::

    ~/.local/share/<AppName>

.. _XDG Basedir Spec: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html

``platformdirs`` to the rescue
==============================

This kind of thing is what the ``platformdirs`` module is for.
``platformdirs`` will help you choose an appropriate:

- user data dir (``user_data_dir``)
- user config dir (``user_config_dir``)
- user cache dir (``user_cache_dir``)
- site data dir (``site_data_dir``)
- site config dir (``site_config_dir``)
- user log dir (``user_log_dir``)
- user documents dir (``user_documents_dir``)
- user runtime dir (``user_runtime_dir``)

And also:

- Is a single module so other Python packages can vendor their own private copy.
- Is slightly opinionated on the directory names used. Look for "OPINION" in
  documentation and code for when an opinion is being applied.

Example output
==============

On macOS:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/Users/trentm/Library/Application Support/SuperApp'
    >>> site_data_dir(appname, appauthor)
    '/Library/Application Support/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/Users/trentm/Library/Caches/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/Users/trentm/Library/Logs/SuperApp'
    >>> user_documents_dir()
    '/Users/trentm/Documents'
    >>> user_runtime_dir(appname, appauthor)
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp'

On Windows 7:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp'
    >>> user_data_dir(appname, appauthor, roaming=True)
    'C:\\Users\\trentm\\AppData\\Roaming\\Acme\\SuperApp'
    >>> user_cache_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Cache'
    >>> user_log_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Logs'
    >>> user_documents_dir()
    'C:\\Users\\trentm\\Documents'
    >>> user_runtime_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Temp\\Acme\\SuperApp'

On Linux:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/home/trentm/.local/share/SuperApp
    >>> site_data_dir(appname, appauthor)
    '/usr/local/share/SuperApp'
    >>> site_data_dir(appname, appauthor, multipath=True)
    '/usr/local/share/SuperApp:/usr/share/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/home/trentm/.cache/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/home/trentm/.cache/SuperApp/log'
    >>> user_config_dir(appname)
    '/home/trentm/.config/SuperApp'
    >>> user_documents_dir()
    '/home/trentm/Documents'
    >>> user_runtime_dir(appname, appauthor)
    '/run/user/{os.getuid()}/SuperApp'
    >>> site_config_dir(appname)
    '/etc/xdg/SuperApp'
    >>> os.environ["XDG_CONFIG_DIRS"] = "/etc:/usr/local/etc"
    >>> site_config_dir(appname, multipath=True)
    '/etc/SuperApp:/usr/local/etc/SuperApp'

On Android::

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/data/data/com.termux/files/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/data/data/com.termux/cache/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/data/data/com.termux/cache/SuperApp/log'
    >>> user_config_dir(appname)
    '/data/data/com.termux/shared_prefs/SuperApp'
    >>> user_documents_dir()
    '/storage/emulated/0/Documents'
    >>> user_runtime_dir(appname, appauthor)
    '/data/data/com.termux/cache/SuperApp/tmp'

``PlatformDirs`` for convenience
================================

.. code-block:: pycon

    >>> from platformdirs import PlatformDirs
    >>> dirs = PlatformDirs("SuperApp", "Acme")
    >>> dirs.user_data_dir
    '/Users/trentm/Library/Application Support/SuperApp'
    >>> dirs.site_data_dir
    '/Library/Application Support/SuperApp'
    >>> dirs.user_cache_dir
    '/Users/trentm/Library/Caches/SuperApp'
    >>> dirs.user_log_dir
    '/Users/trentm/Library/Logs/SuperApp'
    >>> dirs.user_documents_dir
    '/Users/trentm/Documents'
    >>> dirs.user_runtime_dir
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp'

Per-version isolation
=====================

If you have multiple versions of your app in use that you want to be
able to run side-by-side, then you may want version-isolation for these
dirs::

    >>> from platformdirs import PlatformDirs
    >>> dirs = PlatformDirs("SuperApp", "Acme", version="1.0")
    >>> dirs.user_data_dir
    '/Users/trentm/Library/Application Support/SuperApp/1.0'
    >>> dirs.site_data_dir
    '/Library/Application Support/SuperApp/1.0'
    >>> dirs.user_cache_dir
    '/Users/trentm/Library/Caches/SuperApp/1.0'
    >>> dirs.user_log_dir
    '/Users/trentm/Library/Logs/SuperApp/1.0'
    >>> dirs.user_documents_dir
    '/Users/trentm/Documents'
    >>> dirs.user_runtime_dir
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp/1.0'

Be wary of using this for configuration files though; you'll need to handle
migrating configuration files manually.

Why this Fork?
==============

This repository is a friendly fork of the wonderful work started by
`ActiveState <https://github.com/ActiveState/appdirs>`_ who created
``appdirs``, this package's ancestor.

Maintaining an open source project is no easy task, particularly
from within an organization, and the Python community is indebted
to ``appdirs`` (and to Trent Mick and Jeff Rouse in particular) for
creating an incredibly useful simple module, as evidenced by the wide
number of users it has attracted over the years.

Nonetheless, given the number of long-standing open issues
and pull requests, and no clear path towards `ensuring
that maintenance of the package would continue or grow
<https://github.com/ActiveState/appdirs/issues/79>`_, this fork was
created.

Contributions are most welcome.


PK�(�\�U�HH)doc/alt-python37-platformdirs/LICENSE.txtnu�[���# This is the MIT license

Copyright (c) 2010 ActiveState Software Inc.

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.
PK�(�\�����)doc/alt-python37-platformdirs/CHANGES.rstnu�[���platformdirs Changelog
======================

platformdirs 2.4.1
------------------
- Drop python 3.6 support

platformdirs 2.4.0
------------------
- Add ``user_documents_dir``

platformdirs 2.3.0
------------------
- Add ``user_runtime_dir`` and its path-returning equivalent (#37)

platformdirs 2.2.0
------------------
- Unix: Fallback to default if XDG environment variable is empty

platformdirs 2.1.0
------------------
- Add ``readthedocs.org`` documentation via Sphinx
- Modernize project layout
- Drop Python 2.7 and 3.5 support
- Android support
- Add type annotations
- Reorganize project layout to platform specific classes, see
  :class:`PlatformDirsABC <platformdirs.api.PlatformDirsABC>` and it's implementations:
  :class:`Android <platformdirs.android.Android>`, :class:`MacOS <platformdirs.macos.MacOS>`,
  :class:`Unix <platformdirs.unix.Unix>` and :class:`Windows <platformdirs.windows.Windows>`
- Add ``*_path`` API, returning :class:`pathlib.Path <pathlib.Path>` objects instead of :class:`str`
  (``user_data_path``, ``user_config_path``, ``user_cache_path``, ``user_state_path``, ``user_log_path``,
  ``site_data_path``, ``site_config_path``) - by `@papr <https://github.com/papr/>`_

platformdirs 2.0.2
------------------
- Fix ``__version__`` and ``__version_info__``

platformdirs 2.0.1
------------------
- Documentation fixes

platformdirs 2.0.0
------------------

- **BREAKING** Name change as part of the friendly fork
- **BREAKING** Remove support for end-of-life Pythons 2.6, 3.2, and 3.3
- **BREAKING** Correct the config directory on OSX/macOS
- Add Python 3.7, 3.8, and 3.9 support

appdirs 1.4.4
-------------
- [PR #92] Don't import appdirs from setup.py which resolves issue #91

Project officially classified as Stable which is important
for inclusion in other distros such as ActivePython.

appdirs 1.4.3
-------------
- [PR #76] Python 3.6 invalid escape sequence deprecation fixes
- Fix for Python 3.6 support

appdirs 1.4.2
-------------
- [PR #84] Allow installing without setuptools
- [PR #86] Fix string delimiters in setup.py description
- Add Python 3.6 support

appdirs 1.4.1
-------------
- [issue #38] Fix _winreg import on Windows Py3
- [issue #55] Make appname optional

appdirs 1.4.0
-------------
- [PR #42] AppAuthor is now optional on Windows
- [issue 41] Support Jython on Windows, Mac, and Unix-like platforms. Windows
  support requires `JNA <https://github.com/twall/jna>`_.
- [PR #44] Fix incorrect behaviour of the site_config_dir method

appdirs 1.3.0
-------------
- [Unix, issue 16] Conform to XDG standard, instead of breaking it for
  everybody
- [Unix] Removes gratuitous case mangling of the case, since \*nix-es are
  usually case sensitive, so mangling is not wise
- [Unix] Fixes the utterly wrong behaviour in ``site_data_dir``, return result
  based on XDG_DATA_DIRS and make room for respecting the standard which
  specifies XDG_DATA_DIRS is a multiple-value variable
- [Issue 6] Add ``*_config_dir`` which are distinct on nix-es, according to
  XDG specs; on Windows and Mac return the corresponding ``*_data_dir``

appdirs 1.2.0
-------------

- [Unix] Put ``user_log_dir`` under the *cache* dir on Unix. Seems to be more
  typical.
- [issue 9] Make ``unicode`` work on py3k.

appdirs 1.1.0
-------------

- [issue 4] Add ``AppDirs.user_log_dir``.
- [Unix, issue 2, issue 7] appdirs now conforms to `XDG base directory spec
  <https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html>`_.
- [Mac, issue 5] Fix ``site_data_dir()`` on Mac.
- [Mac] Drop use of 'Carbon' module in favour of hardcoded paths; supports
  Python3 now.
- [Windows] Append "Cache" to ``user_cache_dir`` on Windows by default. Use
  ``opinion=False`` option to disable this.
- Add ``appdirs.AppDirs`` convenience class. Usage:

        >>> dirs = AppDirs("SuperApp", "Acme", version="1.0")
        >>> dirs.user_data_dir
        '/Users/trentm/Library/Application Support/SuperApp/1.0'

- [Windows] Cherry-pick Komodo's change to downgrade paths to the Windows short
  paths if there are high bit chars.
- [Linux] Change default ``user_cache_dir()`` on Linux to be singular, e.g.
  "~/.superapp/cache".
- [Windows] Add ``roaming`` option to ``user_data_dir()`` (for use on Windows only)
  and change the default ``user_data_dir`` behaviour to use a *non*-roaming
  profile dir (``CSIDL_LOCAL_APPDATA`` instead of ``CSIDL_APPDATA``). Why? Because
  a large roaming profile can cause login speed issues. The "only syncs on
  logout" behaviour can cause surprises in appdata info.


appdirs 1.0.1 (never released)
------------------------------

Started this changelog 27 July 2010. Before that this module originated in the
`Komodo <https://www.activestate.com/komodo-ide>`_ product as ``applib.py`` and then
as `applib/location.py
<https://github.com/ActiveState/applib/blob/master/applib/location.py>`_ (used by
`PyPM <https://code.activestate.com/pypm/>`_ in `ActivePython
<https://www.activestate.com/activepython>`_). This is basically a fork of
applib.py 1.0.1 and applib/location.py 1.0.1.
PK�(�\<:���(doc/alt-python37-platformdirs/README.rstnu�[���The problem
===========

.. image:: https://github.com/platformdirs/platformdirs/workflows/Test/badge.svg
   :target: https://github.com/platformdirs/platformdirs/actions?query=workflow%3ATest

When writing desktop application, finding the right location to store user data
and configuration varies per platform. Even for single-platform apps, there
may by plenty of nuances in figuring out the right location.

For example, if running on macOS, you should use::

    ~/Library/Application Support/<AppName>

If on Windows (at least English Win XP) that should be::

    C:\Documents and Settings\<User>\Application Data\Local Settings\<AppAuthor>\<AppName>

or possibly::

    C:\Documents and Settings\<User>\Application Data\<AppAuthor>\<AppName>

for `roaming profiles <https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-vista/cc766489(v=ws.10)>`_ but that is another story.

On Linux (and other Unices), according to the `XDG Basedir Spec`_, it should be::

    ~/.local/share/<AppName>

.. _XDG Basedir Spec: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html

``platformdirs`` to the rescue
==============================

This kind of thing is what the ``platformdirs`` module is for.
``platformdirs`` will help you choose an appropriate:

- user data dir (``user_data_dir``)
- user config dir (``user_config_dir``)
- user cache dir (``user_cache_dir``)
- site data dir (``site_data_dir``)
- site config dir (``site_config_dir``)
- user log dir (``user_log_dir``)
- user documents dir (``user_documents_dir``)
- user runtime dir (``user_runtime_dir``)

And also:

- Is a single module so other Python packages can vendor their own private copy.
- Is slightly opinionated on the directory names used. Look for "OPINION" in
  documentation and code for when an opinion is being applied.

Example output
==============

On macOS:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/Users/trentm/Library/Application Support/SuperApp'
    >>> site_data_dir(appname, appauthor)
    '/Library/Application Support/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/Users/trentm/Library/Caches/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/Users/trentm/Library/Logs/SuperApp'
    >>> user_documents_dir()
    '/Users/trentm/Documents'
    >>> user_runtime_dir(appname, appauthor)
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp'

On Windows 7:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp'
    >>> user_data_dir(appname, appauthor, roaming=True)
    'C:\\Users\\trentm\\AppData\\Roaming\\Acme\\SuperApp'
    >>> user_cache_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Cache'
    >>> user_log_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Logs'
    >>> user_documents_dir()
    'C:\\Users\\trentm\\Documents'
    >>> user_runtime_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Temp\\Acme\\SuperApp'

On Linux:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/home/trentm/.local/share/SuperApp
    >>> site_data_dir(appname, appauthor)
    '/usr/local/share/SuperApp'
    >>> site_data_dir(appname, appauthor, multipath=True)
    '/usr/local/share/SuperApp:/usr/share/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/home/trentm/.cache/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/home/trentm/.cache/SuperApp/log'
    >>> user_config_dir(appname)
    '/home/trentm/.config/SuperApp'
    >>> user_documents_dir()
    '/home/trentm/Documents'
    >>> user_runtime_dir(appname, appauthor)
    '/run/user/{os.getuid()}/SuperApp'
    >>> site_config_dir(appname)
    '/etc/xdg/SuperApp'
    >>> os.environ["XDG_CONFIG_DIRS"] = "/etc:/usr/local/etc"
    >>> site_config_dir(appname, multipath=True)
    '/etc/SuperApp:/usr/local/etc/SuperApp'

On Android::

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/data/data/com.termux/files/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/data/data/com.termux/cache/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/data/data/com.termux/cache/SuperApp/log'
    >>> user_config_dir(appname)
    '/data/data/com.termux/shared_prefs/SuperApp'
    >>> user_documents_dir()
    '/storage/emulated/0/Documents'
    >>> user_runtime_dir(appname, appauthor)
    '/data/data/com.termux/cache/SuperApp/tmp'

``PlatformDirs`` for convenience
================================

.. code-block:: pycon

    >>> from platformdirs import PlatformDirs
    >>> dirs = PlatformDirs("SuperApp", "Acme")
    >>> dirs.user_data_dir
    '/Users/trentm/Library/Application Support/SuperApp'
    >>> dirs.site_data_dir
    '/Library/Application Support/SuperApp'
    >>> dirs.user_cache_dir
    '/Users/trentm/Library/Caches/SuperApp'
    >>> dirs.user_log_dir
    '/Users/trentm/Library/Logs/SuperApp'
    >>> dirs.user_documents_dir
    '/Users/trentm/Documents'
    >>> dirs.user_runtime_dir
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp'

Per-version isolation
=====================

If you have multiple versions of your app in use that you want to be
able to run side-by-side, then you may want version-isolation for these
dirs::

    >>> from platformdirs import PlatformDirs
    >>> dirs = PlatformDirs("SuperApp", "Acme", version="1.0")
    >>> dirs.user_data_dir
    '/Users/trentm/Library/Application Support/SuperApp/1.0'
    >>> dirs.site_data_dir
    '/Library/Application Support/SuperApp/1.0'
    >>> dirs.user_cache_dir
    '/Users/trentm/Library/Caches/SuperApp/1.0'
    >>> dirs.user_log_dir
    '/Users/trentm/Library/Logs/SuperApp/1.0'
    >>> dirs.user_documents_dir
    '/Users/trentm/Documents'
    >>> dirs.user_runtime_dir
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp/1.0'

Be wary of using this for configuration files though; you'll need to handle
migrating configuration files manually.

Why this Fork?
==============

This repository is a friendly fork of the wonderful work started by
`ActiveState <https://github.com/ActiveState/appdirs>`_ who created
``appdirs``, this package's ancestor.

Maintaining an open source project is no easy task, particularly
from within an organization, and the Python community is indebted
to ``appdirs`` (and to Trent Mick and Jeff Rouse in particular) for
creating an incredibly useful simple module, as evidenced by the wide
number of users it has attracted over the years.

Nonetheless, given the number of long-standing open issues
and pull requests, and no clear path towards `ensuring
that maintenance of the package would continue or grow
<https://github.com/ActiveState/appdirs/issues/79>`_, this fork was
created.

Contributions are most welcome.
PK�(�\X{WH doc/alt-python37-certifi/LICENSEnu�[���This 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 $
PK�(�\�8_��#doc/alt-python37-certifi/README.rstnu�[���Certifi: 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/
PK�(�\f��m;;#doc/alt-python37-future/LICENSE.txtnu�[���Copyright (c) 2013-2018 Python Charmers Pty Ltd, Australia

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.
PK�(�\x��
�&�&"doc/alt-python37-future/README.rstnu�[���.. _overview:

Overview: Easy, clean, reliable Python 2/3 compatibility
========================================================

``python-future`` is the missing compatibility layer between Python 2 and
Python 3. It allows you to use a single, clean Python 3.x-compatible
codebase to support both Python 2 and Python 3 with minimal overhead.

It provides ``future`` and ``past`` packages with backports and forward
ports of features from Python 3 and 2. It also comes with ``futurize`` and
``pasteurize``, customized 2to3-based scripts that helps you to convert
either Py2 or Py3 code easily to support both Python 2 and 3 in a single
clean Py3-style codebase, module by module.

Notable projects that use ``python-future`` for Python 2/3 compatibility
are `Mezzanine <http://mezzanine.jupo.org/>`_ and `ObsPy
<http://obspy.org>`_.

.. _features:

Features
--------

.. image:: https://travis-ci.org/PythonCharmers/python-future.svg?branch=master
       :target: https://travis-ci.org/PythonCharmers/python-future

-   ``future.builtins`` package (also available as ``builtins`` on Py2) provides
    backports and remappings for 20 builtins with different semantics on Py3
    versus Py2

-   support for directly importing 30 standard library modules under
    their Python 3 names on Py2

-   support for importing the other 14 refactored standard library modules
    under their Py3 names relatively cleanly via
    ``future.standard_library`` and ``future.moves``

-   ``past.builtins`` package provides forward-ports of 19 Python 2 types and
    builtin functions. These can aid with per-module code migrations.

-   ``past.translation`` package supports transparent translation of Python 2
    modules to Python 3 upon import. [This feature is currently in alpha.]

-   1000+ unit tests, including many from the Py3.3 source tree.

-   ``futurize`` and ``pasteurize`` scripts based on ``2to3`` and parts of
    ``3to2`` and ``python-modernize``, for automatic conversion from either Py2
    or Py3 to a clean single-source codebase compatible with Python 2.6+ and
    Python 3.3+.

-   a curated set of utility functions and decorators in ``future.utils`` and
    ``past.utils`` selected from Py2/3 compatibility interfaces from projects
    like ``six``, ``IPython``, ``Jinja2``, ``Django``, and ``Pandas``.

-   support for the ``surrogateescape`` error handler when encoding and
    decoding the backported ``str`` and ``bytes`` objects. [This feature is
    currently in alpha.]

.. _code-examples:

Code examples
-------------

Replacements for Py2's built-in functions and types are designed to be imported
at the top of each Python module together with Python's built-in ``__future__``
statements. For example, this code behaves identically on Python 2.6/2.7 after
these imports as it does on Python 3.3+:

.. code-block:: python

    from __future__ import absolute_import, division, print_function
    from builtins import (bytes, str, open, super, range,
                          zip, round, input, int, pow, object)

    # Backported Py3 bytes object
    b = bytes(b'ABCD')
    assert list(b) == [65, 66, 67, 68]
    assert repr(b) == "b'ABCD'"
    # These raise TypeErrors:
    # b + u'EFGH'
    # bytes(b',').join([u'Fred', u'Bill'])

    # Backported Py3 str object
    s = str(u'ABCD')
    assert s != bytes(b'ABCD')
    assert isinstance(s.encode('utf-8'), bytes)
    assert isinstance(b.decode('utf-8'), str)
    assert repr(s) == "'ABCD'"      # consistent repr with Py3 (no u prefix)
    # These raise TypeErrors:
    # bytes(b'B') in s
    # s.find(bytes(b'A'))

    # Extra arguments for the open() function
    f = open('japanese.txt', encoding='utf-8', errors='replace')

    # New zero-argument super() function:
    class VerboseList(list):
        def append(self, item):
            print('Adding an item')
            super().append(item)

    # New iterable range object with slicing support
    for i in range(10**15)[:10]:
        pass

    # Other iterators: map, zip, filter
    my_iter = zip(range(3), ['a', 'b', 'c'])
    assert my_iter != list(my_iter)

    # The round() function behaves as it does in Python 3, using
    # "Banker's Rounding" to the nearest even last digit:
    assert round(0.1250, 2) == 0.12

    # input() replaces Py2's raw_input() (with no eval()):
    name = input('What is your name? ')
    print('Hello ' + name)

    # pow() supports fractional exponents of negative numbers like in Py3:
    z = pow(-1, 0.5)

    # Compatible output from isinstance() across Py2/3:
    assert isinstance(2**64, int)        # long integers
    assert isinstance(u'blah', str)
    assert isinstance('blah', str)       # only if unicode_literals is in effect

    # Py3-style iterators written as new-style classes (subclasses of
    # future.types.newobject) are automatically backward compatible with Py2:
    class Upper(object):
        def __init__(self, iterable):
            self._iter = iter(iterable)
        def __next__(self):                 # note the Py3 interface
            return next(self._iter).upper()
        def __iter__(self):
            return self
    assert list(Upper('hello')) == list('HELLO')


There is also support for renamed standard library modules. The recommended
interface works like this:

.. code-block:: python

    # Many Py3 module names are supported directly on both Py2.x and 3.x:
    from http.client import HttpConnection
    import html.parser
    import queue
    import xmlrpc.client

    # Refactored modules with clashing names on Py2 and Py3 are supported
    # as follows:
    from future import standard_library
    standard_library.install_aliases()

    # Then, for example:
    from itertools import filterfalse, zip_longest
    from urllib.request import urlopen
    from collections import ChainMap
    from collections import UserDict, UserList, UserString
    from subprocess import getoutput, getstatusoutput
    from collections import Counter, OrderedDict   # backported to Py2.6


Automatic conversion to Py2/3-compatible code
---------------------------------------------

``python-future`` comes with two scripts called ``futurize`` and
``pasteurize`` to aid in making Python 2 code or Python 3 code compatible with
both platforms (Py2/3). It is based on 2to3 and uses fixers from ``lib2to3``,
``lib3to2``, and ``python-modernize``, as well as custom fixers.

``futurize`` passes Python 2 code through all the appropriate fixers to turn it
into valid Python 3 code, and then adds ``__future__`` and ``future`` package
imports so that it also runs under Python 2.

For conversions from Python 3 code to Py2/3, use the ``pasteurize`` script
instead. This converts Py3-only constructs (e.g. new metaclass syntax) to
Py2/3 compatible constructs and adds ``__future__`` and ``future`` imports to
the top of each module.

In both cases, the result should be relatively clean Py3-style code that runs
mostly unchanged on both Python 2 and Python 3.

Futurize: 2 to both
~~~~~~~~~~~~~~~~~~~

For example, running ``futurize -w mymodule.py`` turns this Python 2 code:

.. code-block:: python

    import Queue
    from urllib2 import urlopen

    def greet(name):
        print 'Hello',
        print name

    print "What's your name?",
    name = raw_input()
    greet(name)

into this code which runs on both Py2 and Py3:

.. code-block:: python

    from __future__ import print_function
    from future import standard_library
    standard_library.install_aliases()
    from builtins import input
    import queue
    from urllib.request import urlopen

    def greet(name):
        print('Hello', end=' ')
        print(name)

    print("What's your name?", end=' ')
    name = input()
    greet(name)

See :ref:`forwards-conversion` and :ref:`backwards-conversion` for more details.


Automatic translation
---------------------

The ``past`` package can automatically translate some simple Python 2
modules to Python 3 upon import. The goal is to support the "long tail" of
real-world Python 2 modules (e.g. on PyPI) that have not been ported yet. For
example, here is how to use a Python 2-only package called ``plotrique`` on
Python 3. First install it:

.. code-block:: bash

    $ pip3 install plotrique==0.2.5-7 --no-compile   # to ignore SyntaxErrors

(or use ``pip`` if this points to your Py3 environment.)

Then pass a whitelist of module name prefixes to the ``autotranslate()`` function.
Example:

.. code-block:: bash

    $ python3

    >>> from past import autotranslate
    >>> autotranslate(['plotrique'])
    >>> import plotrique

This transparently translates and runs the ``plotrique`` module and any
submodules in the ``plotrique`` package that ``plotrique`` imports.

This is intended to help you migrate to Python 3 without the need for all
your code's dependencies to support Python 3 yet. It should be used as a
last resort; ideally Python 2-only dependencies should be ported
properly to a Python 2/3 compatible codebase using a tool like
``futurize`` and the changes should be pushed to the upstream project.

Note: the auto-translation feature is still in alpha; it needs more testing and
development, and will likely never be perfect.

For more info, see :ref:`translation`.

Licensing
---------

:Author:  Ed Schofield, Jordan M. Adler, et al

:Copyright: 2013-2018 Python Charmers Pty Ltd, Australia.

:Sponsors: Python Charmers Pty Ltd, Australia, and Python Charmers Pte
           Ltd, Singapore. http://pythoncharmers.com
           
           Pinterest https://opensource.pinterest.com/

:Licence: MIT. See ``LICENSE.txt`` or `here <http://python-future.org/credits.html>`_.

:Other credits:  See `here <http://python-future.org/credits.html>`_.


Next steps
----------

If you are new to Python-Future, check out the `Quickstart Guide
<http://python-future.org/quickstart.html>`_.

For an update on changes in the latest version, see the `What's New
<http://python-future.org/whatsnew.html>`_ page.
PK�(�\�;2,2,doc/alt-python37-PyYAML/CHANGESnu�[���
For a complete changelog, see:

* https://github.com/yaml/pyyaml/commits/
* https://bitbucket.org/xi/pyyaml/commits/

5.4.1 (2021-01-20)

* https://github.com/yaml/pyyaml/pull/480 -- Fix stub compat with older pyyaml versions that may unwittingly load it

5.4 (2021-01-19)

* https://github.com/yaml/pyyaml/pull/407 -- Build modernization, remove distutils, fix metadata, build wheels, CI to GHA
* https://github.com/yaml/pyyaml/pull/472 -- Fix for CVE-2020-14343, moves arbitrary python tags to UnsafeLoader
* https://github.com/yaml/pyyaml/pull/441 -- Fix memory leak in implicit resolver setup
* https://github.com/yaml/pyyaml/pull/392 -- Fix py2 copy support for timezone objects
* https://github.com/yaml/pyyaml/pull/378 -- Fix compatibility with Jython

5.3.1 (2020-03-18)

* https://github.com/yaml/pyyaml/pull/386 -- Prevents arbitrary code execution during python/object/new constructor

5.3 (2020-01-06)

* https://github.com/yaml/pyyaml/pull/290 -- Use `is` instead of equality for comparing with `None`
* https://github.com/yaml/pyyaml/pull/270 -- Fix typos and stylistic nit
* https://github.com/yaml/pyyaml/pull/309 -- Fix up small typo
* https://github.com/yaml/pyyaml/pull/161 -- Fix handling of __slots__
* https://github.com/yaml/pyyaml/pull/358 -- Allow calling add_multi_constructor with None
* https://github.com/yaml/pyyaml/pull/285 -- Add use of safe_load() function in README
* https://github.com/yaml/pyyaml/pull/351 -- Fix reader for Unicode code points over 0xFFFF
* https://github.com/yaml/pyyaml/pull/360 -- Enable certain unicode tests when maxunicode not > 0xffff
* https://github.com/yaml/pyyaml/pull/359 -- Use full_load in yaml-highlight example
* https://github.com/yaml/pyyaml/pull/244 -- Document that PyYAML is implemented with Cython
* https://github.com/yaml/pyyaml/pull/329 -- Fix for Python 3.10
* https://github.com/yaml/pyyaml/pull/310 -- Increase size of index, line, and column fields
* https://github.com/yaml/pyyaml/pull/260 -- Remove some unused imports
* https://github.com/yaml/pyyaml/pull/163 -- Create timezone-aware datetimes when parsed as such
* https://github.com/yaml/pyyaml/pull/363 -- Add tests for timezone

5.2 (2019-12-02)
------------------

* Repair incompatibilities introduced with 5.1. The default Loader was changed,
  but several methods like add_constructor still used the old default
  https://github.com/yaml/pyyaml/pull/279 -- A more flexible fix for custom tag constructors
  https://github.com/yaml/pyyaml/pull/287 -- Change default loader for yaml.add_constructor
  https://github.com/yaml/pyyaml/pull/305 -- Change default loader for add_implicit_resolver, add_path_resolver
* Make FullLoader safer by removing python/object/apply from the default FullLoader
  https://github.com/yaml/pyyaml/pull/347 -- Move constructor for object/apply to UnsafeConstructor
* Fix bug introduced in 5.1 where quoting went wrong on systems with sys.maxunicode <= 0xffff
  https://github.com/yaml/pyyaml/pull/276 -- Fix logic for quoting special characters
* Other PRs:
  https://github.com/yaml/pyyaml/pull/280 -- Update CHANGES for 5.1

5.1.2 (2019-07-30)
------------------

* Re-release of 5.1 with regenerated Cython sources to build properly for Python 3.8b2+

5.1.1 (2019-06-05)
------------------

* Re-release of 5.1 with regenerated Cython sources to build properly for Python 3.8b1

5.1 (2019-03-13)
----------------

* https://github.com/yaml/pyyaml/pull/35 -- Some modernization of the test running
* https://github.com/yaml/pyyaml/pull/42 -- Install tox in a virtualenv
* https://github.com/yaml/pyyaml/pull/45 -- Allow colon in a plain scalar in a flow context
* https://github.com/yaml/pyyaml/pull/48 -- Fix typos
* https://github.com/yaml/pyyaml/pull/55 -- Improve RepresenterError creation
* https://github.com/yaml/pyyaml/pull/59 -- Resolves #57, update readme issues link
* https://github.com/yaml/pyyaml/pull/60 -- Document and test Python 3.6 support
* https://github.com/yaml/pyyaml/pull/61 -- Use Travis CI built in pip cache support
* https://github.com/yaml/pyyaml/pull/62 -- Remove tox workaround for Travis CI
* https://github.com/yaml/pyyaml/pull/63 -- Adding support to Unicode characters over codepoint 0xffff
* https://github.com/yaml/pyyaml/pull/75 -- add 3.12 changelog
* https://github.com/yaml/pyyaml/pull/76 -- Fallback to Pure Python if Compilation fails
* https://github.com/yaml/pyyaml/pull/84 -- Drop unsupported Python 3.3
* https://github.com/yaml/pyyaml/pull/102 -- Include license file in the generated wheel package
* https://github.com/yaml/pyyaml/pull/105 -- Removed Python 2.6 & 3.3 support
* https://github.com/yaml/pyyaml/pull/111 -- Remove commented out Psyco code
* https://github.com/yaml/pyyaml/pull/129 -- Remove call to `ord` in lib3 emitter code
* https://github.com/yaml/pyyaml/pull/149 -- Test on Python 3.7-dev
* https://github.com/yaml/pyyaml/pull/158 -- Support escaped slash in double quotes "\/"
* https://github.com/yaml/pyyaml/pull/175 -- Updated link to pypi in release announcement
* https://github.com/yaml/pyyaml/pull/181 -- Import Hashable from collections.abc
* https://github.com/yaml/pyyaml/pull/194 -- Reverting https://github.com/yaml/pyyaml/pull/74
* https://github.com/yaml/pyyaml/pull/195 -- Build libyaml on travis
* https://github.com/yaml/pyyaml/pull/196 -- Force cython when building sdist
* https://github.com/yaml/pyyaml/pull/254 -- Allow to turn off sorting keys in Dumper (2)
* https://github.com/yaml/pyyaml/pull/256 -- Make default_flow_style=False
* https://github.com/yaml/pyyaml/pull/257 -- Deprecate yaml.load and add FullLoader and UnsafeLoader classes
* https://github.com/yaml/pyyaml/pull/261 -- Skip certain unicode tests when maxunicode not > 0xffff
* https://github.com/yaml/pyyaml/pull/263 -- Windows Appveyor build

3.13 (2018-07-05)
-----------------

* Resolved issues around PyYAML working in Python 3.7.

3.12 (2016-08-28)
-----------------

* Wheel packages for Windows binaries.
* Adding an implicit resolver to a derived loader should not affect the base loader.
* Uniform representation for OrderedDict? across different versions of Python.
* Fixed comparison to None warning.

3.11 (2014-03-26)
-----------------

* Source and binary distributions are rebuilt against the latest
  versions of Cython and LibYAML.

3.10 (2011-05-30)
-----------------

* Do not try to build LibYAML bindings on platforms other than CPython
  (Thank to olt(at)bogosoft(dot)com).
* Clear cyclic references in the parser and the emitter
  (Thank to kristjan(at)ccpgames(dot)com).
* Dropped support for Python 2.3 and 2.4.

3.09 (2009-08-31)
-----------------

* Fixed an obscure scanner error not reported when there is
  no line break at the end of the stream (Thank to Ingy).
* Fixed use of uninitialized memory when emitting anchors with
  LibYAML bindings (Thank to cegner(at)yahoo-inc(dot)com).
* Fixed emitting incorrect BOM characters for UTF-16 (Thank to
  Valentin Nechayev)
* Fixed the emitter for folded scalars not respecting the preferred
  line width (Thank to Ingy).
* Fixed a subtle ordering issue with emitting '%TAG' directives
  (Thank to Andrey Somov).
* Fixed performance regression with LibYAML bindings.


3.08 (2008-12-31)
-----------------

* Python 3 support (Thank to Erick Tryzelaar).
* Use Cython instead of Pyrex to build LibYAML bindings.
* Refactored support for unicode and byte input/output streams.


3.07 (2008-12-29)
-----------------

* The emitter learned to use an optional indentation indicator
  for block scalar; thus scalars with leading whitespaces
  could now be represented in a literal or folded style.
* The test suite is now included in the source distribution.
  To run the tests, type 'python setup.py test'.
* Refactored the test suite: dropped unittest in favor of
  a custom test appliance.
* Fixed the path resolver in CDumper.
* Forced an explicit document end indicator when there is
  a possibility of parsing ambiguity.
* More setup.py improvements: the package should be usable
  when any combination of setuptools, Pyrex and LibYAML
  is installed.
* Windows binary packages are built against LibYAML-0.1.2.
* Minor typos and corrections (Thank to Ingy dot Net
  and Andrey Somov).


3.06 (2008-10-03)
-----------------

* setup.py checks whether LibYAML is installed and if so, builds
  and installs LibYAML bindings.  To force or disable installation
  of LibYAML bindings, use '--with-libyaml' or '--without-libyaml'
  respectively.
* The source distribution includes compiled Pyrex sources so
  building LibYAML bindings no longer requires Pyrex installed.
* 'yaml.load()' raises an exception if the input stream contains
  more than one YAML document.
* Fixed exceptions produced by LibYAML bindings.
* Fixed a dot '.' character being recognized as !!float.
* Fixed Python 2.3 compatibility issue in constructing !!timestamp values.
* Windows binary packages are built against the LibYAML stable branch.
* Added attributes 'yaml.__version__' and  'yaml.__with_libyaml__'.


3.05 (2007-05-13)
-----------------

* Windows binary packages were built with LibYAML trunk.
* Fixed a bug that prevent processing a live stream of YAML documents in
  timely manner (Thanks edward(at)sweetbytes(dot)net).
* Fixed a bug when the path in add_path_resolver contains boolean values
  (Thanks jstroud(at)mbi(dot)ucla(dot)edu).
* Fixed loss of microsecond precision in timestamps
  (Thanks edemaine(at)mit(dot)edu).
* Fixed loading an empty YAML stream.
* Allowed immutable subclasses of YAMLObject.
* Made the encoding of the unicode->str conversion explicit so that
  the conversion does not depend on the default Python encoding.
* Forced emitting float values in a YAML compatible form.


3.04 (2006-08-20)
-----------------

* Include experimental LibYAML bindings.
* Fully support recursive structures.
* Sort dictionary keys.  Mapping node values are now represented
  as lists of pairs instead of dictionaries.  No longer check
  for duplicate mapping keys as it didn't work correctly anyway.
* Fix invalid output of single-quoted scalars in cases when a single
  quote is not escaped when preceded by whitespaces or line breaks.
* To make porting easier, rewrite Parser not using generators.
* Fix handling of unexpected block mapping values.
* Fix a bug in Representer.represent_object: copy_reg.dispatch_table
  was not correctly handled.
* Fix a bug when a block scalar is incorrectly emitted in the simple
  key context.
* Hold references to the objects being represented.
* Make Representer not try to guess !!pairs when a list is represented.
* Fix timestamp constructing and representing.
* Fix the 'N' plain scalar being incorrectly recognized as !!bool.


3.03 (2006-06-19)
-----------------

* Fix Python 2.5 compatibility issues.
* Fix numerous bugs in the float handling.
* Fix scanning some ill-formed documents.
* Other minor fixes.


3.02 (2006-05-15)
-----------------

* Fix win32 installer.  Apparently bdist_wininst does not work well
  under Linux.
* Fix a bug in add_path_resolver.
* Add the yaml-highlight example.  Try to run on a color terminal:
  `python yaml_hl.py <any_document.yaml`.


3.01 (2006-05-07)
-----------------

* Initial release.  The version number reflects the codename
  of the project (PyYAML 3000) and differentiates it from
  the abandoned PyYaml module.

PK�(�\�2��doc/alt-python37-PyYAML/READMEnu�[���PyYAML - The next generation YAML parser and emitter for Python.

To install, type 'python setup.py install'.

By default, the setup.py script checks whether LibYAML is installed
and if so, builds and installs LibYAML bindings.  To skip the check
and force installation of LibYAML bindings, use the option '--with-libyaml':
'python setup.py --with-libyaml install'.  To disable the check and
skip building and installing LibYAML bindings, use '--without-libyaml':
'python setup.py --without-libyaml install'.

When LibYAML bindings are installed, you may use fast LibYAML-based
parser and emitter as follows:

    >>> yaml.load(stream, Loader=yaml.CLoader)
    >>> yaml.dump(data, Dumper=yaml.CDumper)

If you don't trust the input stream, you should use:

    >>> yaml.safe_load(stream)

PyYAML includes a comprehensive test suite.  To run the tests,
type 'python setup.py test'.

For more information, check the PyYAML homepage:
'https://github.com/yaml/pyyaml'.

For PyYAML tutorial and reference, see:
'http://pyyaml.org/wiki/PyYAMLDocumentation'.

Discuss PyYAML with the maintainers in IRC #pyyaml irc.freenode.net.

You may also use the YAML-Core mailing list:
'http://lists.sourceforge.net/lists/listinfo/yaml-core'.

Submit bug reports and feature requests to the PyYAML bug tracker:
'https://github.com/yaml/pyyaml/issues'.

The PyYAML module was written by Kirill Simonov <xi@resolvent.net>.
It is currently maintained by the YAML and Python communities.

PyYAML is released under the MIT license.
See the file LICENSE for more details.
PK�(�\��<doc/alt-python37-PyYAML/examples/pygments-lexer/example.yamlnu�[���
#
# Examples from the Preview section of the YAML specification
# (http://yaml.org/spec/1.2/#Preview)
#

# Sequence of scalars
---
- Mark McGwire
- Sammy Sosa
- Ken Griffey

# Mapping scalars to scalars
---
hr:  65    # Home runs
avg: 0.278 # Batting average
rbi: 147   # Runs Batted In

# Mapping scalars to sequences
---
american:
  - Boston Red Sox
  - Detroit Tigers
  - New York Yankees
national:
  - New York Mets
  - Chicago Cubs
  - Atlanta Braves

# Sequence of mappings
---
-
  name: Mark McGwire
  hr:   65
  avg:  0.278
-
  name: Sammy Sosa
  hr:   63
  avg:  0.288

# Sequence of sequences
---
- [name        , hr, avg  ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa  , 63, 0.288]

# Mapping of mappings
---
Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
    hr: 63,
    avg: 0.288
  }

# Two documents in a stream
--- # Ranking of 1998 home runs
- Mark McGwire
- Sammy Sosa
- Ken Griffey
--- # Team ranking
- Chicago Cubs
- St Louis Cardinals

# Documents with the end indicator
---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...

# Comments
---
hr: # 1998 hr ranking
  - Mark McGwire
  - Sammy Sosa
rbi:
  # 1998 rbi ranking
  - Sammy Sosa
  - Ken Griffey

# Anchors and aliases
---
hr:
  - Mark McGwire
  # Following node labeled SS
  - &SS Sammy Sosa
rbi:
  - *SS # Subsequent occurrence
  - Ken Griffey

# Mapping between sequences
---
? - Detroit Tigers
  - Chicago cubs
:
  - 2001-07-23
? [ New York Yankees,
    Atlanta Braves ]
: [ 2001-07-02, 2001-08-12,
    2001-08-14 ]

# Inline nested mapping
---
# products purchased
- item    : Super Hoop
  quantity: 1
- item    : Basketball
  quantity: 4
- item    : Big Shoes
  quantity: 1

# Literal scalars
--- | # ASCII art
  \//||\/||
  // ||  ||__

# Folded scalars
--- >
  Mark McGwire's
  year was crippled
  by a knee injury.

# Preserved indented block in a folded scalar
---
>
 Sammy Sosa completed another
 fine season with great stats.

   63 Home Runs
   0.288 Batting Average

 What a year!

# Indentation determines scope
---
name: Mark McGwire
accomplishment: >
  Mark set a major league
  home run record in 1998.
stats: |
  65 Home Runs
  0.278 Batting Average

# Quoted scalars
---
unicode: "Sosa did fine.\u263A"
control: "\b1998\t1999\t2000\n"
hex esc: "\x0d\x0a is \r\n"
single: '"Howdy!" he cried.'
quoted: ' # not a ''comment''.'
tie-fighter: '|\-*-/|'

# Multi-line flow scalars
---
plain:
  This unquoted scalar
  spans many lines.
quoted: "So does this
  quoted scalar.\n"

# Integers
---
canonical: 12345
decimal: +12_345
sexagesimal: 3:25:45
octal: 014
hexadecimal: 0xC

# Floating point
---
canonical: 1.23015e+3
exponential: 12.3015e+02
sexagesimal: 20:30.15
fixed: 1_230.15
negative infinity: -.inf
not a number: .NaN

# Miscellaneous
---
null: ~
true: boolean
false: boolean
string: '12345'

# Timestamps
---
canonical: 2001-12-15T02:59:43.1Z
iso8601: 2001-12-14t21:59:43.10-05:00
spaced: 2001-12-14 21:59:43.10 -5
date: 2002-12-14

# Various explicit tags
---
not-date: !!str 2002-04-28
picture: !!binary |
 R0lGODlhDAAMAIQAAP//9/X
 17unp5WZmZgAAAOfn515eXv
 Pz7Y6OjuDg4J+fn5OTk6enp
 56enmleECcgggoBADs=
application specific tag: !something |
 The semantics of the tag
 above may be different for
 different documents.

# Global tags
%TAG ! tag:clarkevans.com,2002:
--- !shape
  # Use the ! handle for presenting
  # tag:clarkevans.com,2002:circle
- !circle
  center: &ORIGIN {x: 73, y: 129}
  radius: 7
- !line
  start: *ORIGIN
  finish: { x: 89, y: 102 }
- !label
  start: *ORIGIN
  color: 0xFFEEBB
  text: Pretty vector drawing.

# Unordered sets
--- !!set
# sets are represented as a
# mapping where each key is
# associated with the empty string
? Mark McGwire
? Sammy Sosa
? Ken Griff

# Ordered mappings
--- !!omap
# ordered maps are represented as
# a sequence of mappings, with
# each mapping having one key
- Mark McGwire: 65
- Sammy Sosa: 63
- Ken Griffy: 58

# Full length example
--- !<tag:clarkevans.com,2002:invoice>
invoice: 34843
date   : 2001-01-23
bill-to: &id001
    given  : Chris
    family : Dumars
    address:
        lines: |
            458 Walkman Dr.
            Suite #292
        city    : Royal Oak
        state   : MI
        postal  : 48046
ship-to: *id001
product:
    - sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
    - sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52
comments:
    Late afternoon is best.
    Backup contact is Nancy
    Billsmer @ 338-4338.

# Another full-length example
---
Time: 2001-11-23 15:01:42 -5
User: ed
Warning:
  This is an error message
  for the log file
---
Time: 2001-11-23 15:02:31 -5
User: ed
Warning:
  A slightly different error
  message.
---
Date: 2001-11-23 15:03:17 -5
User: ed
Fatal:
  Unknown variable "bar"
Stack:
  - file: TopClass.py
    line: 23
    code: |
      x = MoreObject("345\n")
  - file: MoreClass.py
    line: 58
    code: |-
      foo = bar

PK�(�\x��^==7doc/alt-python37-PyYAML/examples/pygments-lexer/yaml.pynu�[���
"""
yaml.py

Lexer for YAML, a human-friendly data serialization language
(http://yaml.org/).

Written by Kirill Simonov <xi@resolvent.net>.

License: Whatever suitable for inclusion into the Pygments package.
"""

from pygments.lexer import  \
        ExtendedRegexLexer, LexerContext, include, bygroups
from pygments.token import  \
        Text, Comment, Punctuation, Name, Literal

__all__ = ['YAMLLexer']


class YAMLLexerContext(LexerContext):
    """Indentation context for the YAML lexer."""

    def __init__(self, *args, **kwds):
        super(YAMLLexerContext, self).__init__(*args, **kwds)
        self.indent_stack = []
        self.indent = -1
        self.next_indent = 0
        self.block_scalar_indent = None


def something(TokenClass):
    """Do not produce empty tokens."""
    def callback(lexer, match, context):
        text = match.group()
        if not text:
            return
        yield match.start(), TokenClass, text
        context.pos = match.end()
    return callback

def reset_indent(TokenClass):
    """Reset the indentation levels."""
    def callback(lexer, match, context):
        text = match.group()
        context.indent_stack = []
        context.indent = -1
        context.next_indent = 0
        context.block_scalar_indent = None
        yield match.start(), TokenClass, text
        context.pos = match.end()
    return callback

def save_indent(TokenClass, start=False):
    """Save a possible indentation level."""
    def callback(lexer, match, context):
        text = match.group()
        extra = ''
        if start:
            context.next_indent = len(text)
            if context.next_indent < context.indent:
                while context.next_indent < context.indent:
                    context.indent = context.indent_stack.pop()
                if context.next_indent > context.indent:
                    extra = text[context.indent:]
                    text = text[:context.indent]
        else:
            context.next_indent += len(text)
        if text:
            yield match.start(), TokenClass, text
        if extra:
            yield match.start()+len(text), TokenClass.Error, extra
        context.pos = match.end()
    return callback

def set_indent(TokenClass, implicit=False):
    """Set the previously saved indentation level."""
    def callback(lexer, match, context):
        text = match.group()
        if context.indent < context.next_indent:
            context.indent_stack.append(context.indent)
            context.indent = context.next_indent
        if not implicit:
            context.next_indent += len(text)
        yield match.start(), TokenClass, text
        context.pos = match.end()
    return callback

def set_block_scalar_indent(TokenClass):
    """Set an explicit indentation level for a block scalar."""
    def callback(lexer, match, context):
        text = match.group()
        context.block_scalar_indent = None
        if not text:
            return
        increment = match.group(1)
        if increment:
            current_indent = max(context.indent, 0)
            increment = int(increment)
            context.block_scalar_indent = current_indent + increment
        if text:
            yield match.start(), TokenClass, text
            context.pos = match.end()
    return callback

def parse_block_scalar_empty_line(IndentTokenClass, ContentTokenClass):
    """Process an empty line in a block scalar."""
    def callback(lexer, match, context):
        text = match.group()
        if (context.block_scalar_indent is None or
                len(text) <= context.block_scalar_indent):
            if text:
                yield match.start(), IndentTokenClass, text
        else:
            indentation = text[:context.block_scalar_indent]
            content = text[context.block_scalar_indent:]
            yield match.start(), IndentTokenClass, indentation
            yield (match.start()+context.block_scalar_indent,
                    ContentTokenClass, content)
        context.pos = match.end()
    return callback

def parse_block_scalar_indent(TokenClass):
    """Process indentation spaces in a block scalar."""
    def callback(lexer, match, context):
        text = match.group()
        if context.block_scalar_indent is None:
            if len(text) <= max(context.indent, 0):
                context.stack.pop()
                context.stack.pop()
                return
            context.block_scalar_indent = len(text)
        else:
            if len(text) < context.block_scalar_indent:
                context.stack.pop()
                context.stack.pop()
                return
        if text:
            yield match.start(), TokenClass, text
            context.pos = match.end()
    return callback

def parse_plain_scalar_indent(TokenClass):
    """Process indentation spaces in a plain scalar."""
    def callback(lexer, match, context):
        text = match.group()
        if len(text) <= context.indent:
            context.stack.pop()
            context.stack.pop()
            return
        if text:
            yield match.start(), TokenClass, text
            context.pos = match.end()
    return callback


class YAMLLexer(ExtendedRegexLexer):
    """Lexer for the YAML language."""

    name = 'YAML'
    aliases = ['yaml']
    filenames = ['*.yaml', '*.yml']
    mimetypes = ['text/x-yaml']

    tokens = {

        # the root rules
        'root': [
            # ignored whitespaces
            (r'[ ]+(?=#|$)', Text.Blank),
            # line breaks
            (r'\n+', Text.Break),
            # a comment
            (r'#[^\n]*', Comment.Single),
            # the '%YAML' directive
            (r'^%YAML(?=[ ]|$)', reset_indent(Name.Directive),
                'yaml-directive'),
            # the %TAG directive
            (r'^%TAG(?=[ ]|$)', reset_indent(Name.Directive),
                'tag-directive'),
            # document start and document end indicators
            (r'^(?:---|\.\.\.)(?=[ ]|$)',
                reset_indent(Punctuation.Document), 'block-line'),
            # indentation spaces
            (r'[ ]*(?![ \t\n\r\f\v]|$)',
                save_indent(Text.Indent, start=True),
                ('block-line', 'indentation')),
        ],

        # trailing whitespaces after directives or a block scalar indicator
        'ignored-line': [
            # ignored whitespaces
            (r'[ ]+(?=#|$)', Text.Blank),
            # a comment
            (r'#[^\n]*', Comment.Single),
            # line break
            (r'\n', Text.Break, '#pop:2'),
        ],

        # the %YAML directive
        'yaml-directive': [
            # the version number
            (r'([ ]+)([0-9]+\.[0-9]+)',
                bygroups(Text.Blank, Literal.Version), 'ignored-line'),
        ],

        # the %YAG directive
        'tag-directive': [
            # a tag handle and the corresponding prefix
            (r'([ ]+)(!|![0-9A-Za-z_-]*!)'
                r'([ ]+)(!|!?[0-9A-Za-z;/?:@&=+$,_.!~*\'()\[\]%-]+)',
                bygroups(Text.Blank, Name.Type, Text.Blank, Name.Type),
                'ignored-line'),
        ],

        # block scalar indicators and indentation spaces
        'indentation': [
            # trailing whitespaces are ignored
            (r'[ ]*$', something(Text.Blank), '#pop:2'),
            # whitespaces preceding block collection indicators
            (r'[ ]+(?=[?:-](?:[ ]|$))', save_indent(Text.Indent)),
            # block collection indicators
            (r'[?:-](?=[ ]|$)', set_indent(Punctuation.Indicator)),
            # the beginning a block line
            (r'[ ]*', save_indent(Text.Indent), '#pop'),
        ],

        # an indented line in the block context
        'block-line': [
            # the line end
            (r'[ ]*(?=#|$)', something(Text.Blank), '#pop'),
            # whitespaces separating tokens
            (r'[ ]+', Text.Blank),
            # tags, anchors and aliases,
            include('descriptors'),
            # block collections and scalars
            include('block-nodes'),
            # flow collections and quoted scalars
            include('flow-nodes'),
            # a plain scalar
            (r'(?=[^ \t\n\r\f\v?:,\[\]{}#&*!|>\'"%@`-]|[?:-][^ \t\n\r\f\v])',
                something(Literal.Scalar.Plain),
                'plain-scalar-in-block-context'),
        ],

        # tags, anchors, aliases
        'descriptors' : [
            # a full-form tag
            (r'!<[0-9A-Za-z;/?:@&=+$,_.!~*\'()\[\]%-]+>', Name.Type),
            # a tag in the form '!', '!suffix' or '!handle!suffix'
            (r'!(?:[0-9A-Za-z_-]+)?'
                r'(?:![0-9A-Za-z;/?:@&=+$,_.!~*\'()\[\]%-]+)?', Name.Type),
            # an anchor
            (r'&[0-9A-Za-z_-]+', Name.Anchor),
            # an alias
            (r'\*[0-9A-Za-z_-]+', Name.Alias),
        ],

        # block collections and scalars
        'block-nodes': [
            # implicit key
            (r':(?=[ ]|$)', set_indent(Punctuation.Indicator, implicit=True)),
            # literal and folded scalars
            (r'[|>]', Punctuation.Indicator,
                ('block-scalar-content', 'block-scalar-header')),
        ],

        # flow collections and quoted scalars
        'flow-nodes': [
            # a flow sequence
            (r'\[', Punctuation.Indicator, 'flow-sequence'),
            # a flow mapping
            (r'\{', Punctuation.Indicator, 'flow-mapping'),
            # a single-quoted scalar
            (r'\'', Literal.Scalar.Flow.Quote, 'single-quoted-scalar'),
            # a double-quoted scalar
            (r'\"', Literal.Scalar.Flow.Quote, 'double-quoted-scalar'),
        ],

        # the content of a flow collection
        'flow-collection': [
            # whitespaces
            (r'[ ]+', Text.Blank),
            # line breaks
            (r'\n+', Text.Break),
            # a comment
            (r'#[^\n]*', Comment.Single),
            # simple indicators
            (r'[?:,]', Punctuation.Indicator),
            # tags, anchors and aliases
            include('descriptors'),
            # nested collections and quoted scalars
            include('flow-nodes'),
            # a plain scalar
            (r'(?=[^ \t\n\r\f\v?:,\[\]{}#&*!|>\'"%@`])',
                something(Literal.Scalar.Plain),
                'plain-scalar-in-flow-context'),
        ],

        # a flow sequence indicated by '[' and ']'
        'flow-sequence': [
            # include flow collection rules
            include('flow-collection'),
            # the closing indicator
            (r'\]', Punctuation.Indicator, '#pop'),
        ],

        # a flow mapping indicated by '{' and '}'
        'flow-mapping': [
            # include flow collection rules
            include('flow-collection'),
            # the closing indicator
            (r'\}', Punctuation.Indicator, '#pop'),
        ],

        # block scalar lines
        'block-scalar-content': [
            # line break
            (r'\n', Text.Break),
            # empty line
            (r'^[ ]+$',
                parse_block_scalar_empty_line(Text.Indent,
                    Literal.Scalar.Block)),
            # indentation spaces (we may leave the state here)
            (r'^[ ]*', parse_block_scalar_indent(Text.Indent)),
            # line content
            (r'[^\n\r\f\v]+', Literal.Scalar.Block),
        ],

        # the content of a literal or folded scalar
        'block-scalar-header': [
            # indentation indicator followed by chomping flag
            (r'([1-9])?[+-]?(?=[ ]|$)',
                set_block_scalar_indent(Punctuation.Indicator),
                'ignored-line'),
            # chomping flag followed by indentation indicator
            (r'[+-]?([1-9])?(?=[ ]|$)',
                set_block_scalar_indent(Punctuation.Indicator),
                'ignored-line'),
        ],

        # ignored and regular whitespaces in quoted scalars
        'quoted-scalar-whitespaces': [
            # leading and trailing whitespaces are ignored
            (r'^[ ]+|[ ]+$', Text.Blank),
            # line breaks are ignored
            (r'\n+', Text.Break),
            # other whitespaces are a part of the value
            (r'[ ]+', Literal.Scalar.Flow),
        ],

        # single-quoted scalars
        'single-quoted-scalar': [
            # include whitespace and line break rules
            include('quoted-scalar-whitespaces'),
            # escaping of the quote character
            (r'\'\'', Literal.Scalar.Flow.Escape),
            # regular non-whitespace characters
            (r'[^ \t\n\r\f\v\']+', Literal.Scalar.Flow),
            # the closing quote
            (r'\'', Literal.Scalar.Flow.Quote, '#pop'),
        ],

        # double-quoted scalars
        'double-quoted-scalar': [
            # include whitespace and line break rules
            include('quoted-scalar-whitespaces'),
            # escaping of special characters
            (r'\\[0abt\tn\nvfre "\\N_LP]', Literal.Scalar.Flow.Escape),
            # escape codes
            (r'\\(?:x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})',
                Literal.Scalar.Flow.Escape),
            # regular non-whitespace characters
            (r'[^ \t\n\r\f\v\"\\]+', Literal.Scalar.Flow),
            # the closing quote
            (r'"', Literal.Scalar.Flow.Quote, '#pop'),
        ],

        # the beginning of a new line while scanning a plain scalar
        'plain-scalar-in-block-context-new-line': [
            # empty lines
            (r'^[ ]+$', Text.Blank),
            # line breaks
            (r'\n+', Text.Break),
            # document start and document end indicators
            (r'^(?=---|\.\.\.)', something(Punctuation.Document), '#pop:3'),
            # indentation spaces (we may leave the block line state here)
            (r'^[ ]*', parse_plain_scalar_indent(Text.Indent), '#pop'),
        ],

        # a plain scalar in the block context
        'plain-scalar-in-block-context': [
            # the scalar ends with the ':' indicator
            (r'[ ]*(?=:[ ]|:$)', something(Text.Blank), '#pop'),
            # the scalar ends with whitespaces followed by a comment
            (r'[ ]+(?=#)', Text.Blank, '#pop'),
            # trailing whitespaces are ignored
            (r'[ ]+$', Text.Blank),
            # line breaks are ignored
            (r'\n+', Text.Break, 'plain-scalar-in-block-context-new-line'),
            # other whitespaces are a part of the value
            (r'[ ]+', Literal.Scalar.Plain),
            # regular non-whitespace characters
            (r'(?::(?![ \t\n\r\f\v])|[^ \t\n\r\f\v:])+',
                Literal.Scalar.Plain),
        ],

        # a plain scalar is the flow context
        'plain-scalar-in-flow-context': [
            # the scalar ends with an indicator character
            (r'[ ]*(?=[,:?\[\]{}])', something(Text.Blank), '#pop'),
            # the scalar ends with a comment
            (r'[ ]+(?=#)', Text.Blank, '#pop'),
            # leading and trailing whitespaces are ignored
            (r'^[ ]+|[ ]+$', Text.Blank),
            # line breaks are ignored
            (r'\n+', Text.Break),
            # other whitespaces are a part of the value
            (r'[ ]+', Literal.Scalar.Plain),
            # regular non-whitespace characters
            (r'[^ \t\n\r\f\v,:?\[\]{}]+', Literal.Scalar.Plain),
        ],

    }

    def get_tokens_unprocessed(self, text=None, context=None):
        if context is None:
            context = YAMLLexerContext(text, 0)
        return super(YAMLLexer, self).get_tokens_unprocessed(text, context)


PK�(�\H�5�RR:doc/alt-python37-PyYAML/examples/yaml-highlight/yaml_hl.pynu�[���#!/usr/bin/python

import yaml, codecs, sys, os.path, optparse

class Style:

    def __init__(self, header=None, footer=None,
            tokens=None, events=None, replaces=None):
        self.header = header
        self.footer = footer
        self.replaces = replaces
        self.substitutions = {}
        for domain, Class in [(tokens, 'Token'), (events, 'Event')]:
            if not domain:
                continue
            for key in domain:
                name = ''.join([part.capitalize() for part in key.split('-')])
                cls = getattr(yaml, '%s%s' % (name, Class))
                value = domain[key]
                if not value:
                    continue
                start = value.get('start')
                end = value.get('end')
                if start:
                    self.substitutions[cls, -1] = start
                if end:
                    self.substitutions[cls, +1] = end

    def __setstate__(self, state):
        self.__init__(**state)

yaml.add_path_resolver(u'tag:yaml.org,2002:python/object:__main__.Style',
        [None], dict)
yaml.add_path_resolver(u'tag:yaml.org,2002:pairs',
        [None, u'replaces'], list)

class YAMLHighlight:

    def __init__(self, options):
        config = yaml.full_load(file(options.config, 'rb').read())
        self.style = config[options.style]
        if options.input:
            self.input = file(options.input, 'rb')
        else:
            self.input = sys.stdin
        if options.output:
            self.output = file(options.output, 'wb')
        else:
            self.output = sys.stdout

    def highlight(self):
        input = self.input.read()
        if input.startswith(codecs.BOM_UTF16_LE):
            input = unicode(input, 'utf-16-le')
        elif input.startswith(codecs.BOM_UTF16_BE):
            input = unicode(input, 'utf-16-be')
        else:
            input = unicode(input, 'utf-8')
        substitutions = self.style.substitutions
        tokens = yaml.scan(input)
        events = yaml.parse(input)
        markers = []
        number = 0
        for token in tokens:
            number += 1
            if token.start_mark.index != token.end_mark.index:
                cls = token.__class__
                if (cls, -1) in substitutions:
                    markers.append([token.start_mark.index, +2, number, substitutions[cls, -1]])
                if (cls, +1) in substitutions:
                    markers.append([token.end_mark.index, -2, number, substitutions[cls, +1]])
        number = 0
        for event in events:
            number += 1
            cls = event.__class__
            if (cls, -1) in substitutions:
                markers.append([event.start_mark.index, +1, number, substitutions[cls, -1]])
            if (cls, +1) in substitutions:
                markers.append([event.end_mark.index, -1, number, substitutions[cls, +1]])
        markers.sort()
        markers.reverse()
        chunks = []
        position = len(input)
        for index, weight1, weight2, substitution in markers:
            if index < position:
                chunk = input[index:position]
                for substring, replacement in self.style.replaces:
                    chunk = chunk.replace(substring, replacement)
                chunks.append(chunk)
                position = index
            chunks.append(substitution)
        chunks.reverse()
        result = u''.join(chunks)
        if self.style.header:
            self.output.write(self.style.header)
        self.output.write(result.encode('utf-8'))
        if self.style.footer:
            self.output.write(self.style.footer)

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-s', '--style', dest='style', default='ascii',
            help="specify the highlighting style", metavar='STYLE')
    parser.add_option('-c', '--config', dest='config',
            default=os.path.join(os.path.dirname(sys.argv[0]), 'yaml_hl.cfg'),
            help="set an alternative configuration file", metavar='CONFIG')
    parser.add_option('-i', '--input', dest='input', default=None,
            help="set the input file (default: stdin)", metavar='FILE')
    parser.add_option('-o', '--output', dest='output', default=None,
            help="set the output file (default: stdout)", metavar='FILE')
    (options, args) = parser.parse_args()
    hl = YAMLHighlight(options)
    hl.highlight()

PK�(�\�f�-��;doc/alt-python37-PyYAML/examples/yaml-highlight/yaml_hl.cfgnu�[���%YAML 1.1
---

ascii:

    header: "\e[0;1;30;40m"

    footer: "\e[0m"

    tokens:
        stream-start:
        stream-end:
        directive:              { start: "\e[35m", end: "\e[0;1;30;40m" }
        document-start:         { start: "\e[35m", end: "\e[0;1;30;40m" }
        document-end:           { start: "\e[35m", end: "\e[0;1;30;40m" }
        block-sequence-start:
        block-mapping-start:
        block-end:
        flow-sequence-start:    { start: "\e[33m", end: "\e[0;1;30;40m" }
        flow-mapping-start:     { start: "\e[33m", end: "\e[0;1;30;40m" }
        flow-sequence-end:      { start: "\e[33m", end: "\e[0;1;30;40m" }
        flow-mapping-end:       { start: "\e[33m", end: "\e[0;1;30;40m" }
        key:                    { start: "\e[33m", end: "\e[0;1;30;40m" }
        value:                  { start: "\e[33m", end: "\e[0;1;30;40m" }
        block-entry:            { start: "\e[33m", end: "\e[0;1;30;40m" }
        flow-entry:             { start: "\e[33m", end: "\e[0;1;30;40m" }
        alias:                  { start: "\e[32m", end: "\e[0;1;30;40m" }
        anchor:                 { start: "\e[32m", end: "\e[0;1;30;40m" }
        tag:                    { start: "\e[32m", end: "\e[0;1;30;40m" }
        scalar:                 { start: "\e[36m", end: "\e[0;1;30;40m" }

    replaces:
        - "\r\n":   "\n"
        - "\r":     "\n"
        - "\n":     "\n"
        - "\x85":   "\n"
        - "\u2028": "\n"
        - "\u2029": "\n"

html: &html

    tokens:
        stream-start:
        stream-end:
        directive:              { start: <code class="directive_token">, end: </code> }
        document-start:         { start: <code class="document_start_token">, end: </code> }
        document-end:           { start: <code class="document_end_token">, end: </code> }
        block-sequence-start:
        block-mapping-start:
        block-end:
        flow-sequence-start:    { start: <code class="delimiter_token">, end: </code> }
        flow-mapping-start:     { start: <code class="delimiter_token">, end: </code> }
        flow-sequence-end:      { start: <code class="delimiter_token">, end: </code> }
        flow-mapping-end:       { start: <code class="delimiter_token">, end: </code> }
        key:                    { start: <code class="delimiter_token">, end: </code> }
        value:                  { start: <code class="delimiter_token">, end: </code> }
        block-entry:            { start: <code class="delimiter_token">, end: </code> }
        flow-entry:             { start: <code class="delimiter_token">, end: </code> }
        alias:                  { start: <code class="anchor_token">, end: </code> }
        anchor:                 { start: <code class="anchor_token">, end: </code> }
        tag:                    { start: <code class="tag_token">, end: </code> }
        scalar:                 { start: <code class="scalar_token">, end: </code> }

    events:
        stream-start:   { start: <pre class="yaml_stream"> }
        stream-end:     { end: </pre> }
        document-start: { start: <span class="document"> }
        document-end:   { end: </span> }
        sequence-start: { start: <span class="sequence"> }
        sequence-end:   { end: </span> }
        mapping-start:  { start: <span class="mapping"> }
        mapping-end:    { end: </span> }
        scalar:         { start: <span class="scalar">, end: </span> }

    replaces:
        - "\r\n":   "\n"
        - "\r":     "\n"
        - "\n":     "\n"
        - "\x85":   "\n"
        - "\u2028": "\n"
        - "\u2029": "\n"
        - "&":      "&amp;"
        - "<":      "&lt;"
        - ">":      "&gt;"

html-page:

    header: |
        <html>
        <head>
        <title>A YAML stream</title>
        <style type="text/css">
            .document { background: #FFF }
            .sequence { background: #EEF }
            .mapping { background: #EFE }
            .scalar { background: #FEE }
            .directive_token { color: #C0C }
            .document_start_token { color: #C0C; font-weight: bold }
            .document_end_token { color: #C0C; font-weight: bold }
            .delimiter_token { color: #600; font-weight: bold }
            .anchor_token { color: #090 }
            .tag_token { color: #090 }
            .scalar_token { color: #000 }
            .yaml_stream { color: #999 }
        </style>
        <body>

    footer: |
        </body>
        </html>

    <<: *html


# vim: ft=yaml
PK�(�\��4[[$doc/alt-python37-urllib3/LICENSE.txtnu�[���MIT 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.
PK�(�\�J.���$doc/alt-python37-urllib3/CHANGES.rstnu�[���Changes
=======

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.
PK�(�\�L�#doc/alt-python37-urllib3/README.rstnu�[���.. 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
PK�(�\�)y@@!doc/alt-python37-pytz/LICENSE.txtnu�[���Copyright (c) 2003-2017 Stuart Bishop <stuart@stuartbishop.net>

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.
PK�(�\?).u�K�K doc/alt-python37-pytz/README.txtnu�[���pytz - World Timezone Definitions for Python
============================================

:Author: Stuart Bishop <stuart@stuartbishop.net>

Introduction
~~~~~~~~~~~~

pytz brings the Olson tz database into Python. This library allows
accurate and cross platform timezone calculations using Python 2.4
or higher. It also solves the issue of ambiguous times at the end
of daylight saving time, which you can read more about in the Python
Library Reference (``datetime.tzinfo``).

Almost all of the Olson timezones are supported.

.. note::

    This library differs from the documented Python API for
    tzinfo implementations; if you want to create local wallclock
    times you need to use the ``localize()`` method documented in this
    document. In addition, if you perform date arithmetic on local
    times that cross DST boundaries, the result may be in an incorrect
    timezone (ie. subtract 1 minute from 2002-10-27 1:00 EST and you get
    2002-10-27 0:59 EST instead of the correct 2002-10-27 1:59 EDT). A
    ``normalize()`` method is provided to correct this. Unfortunately these
    issues cannot be resolved without modifying the Python datetime
    implementation (see PEP-431).


Installation
~~~~~~~~~~~~

This package can either be installed from a .egg file using setuptools,
or from the tarball using the standard Python distutils.

If you are installing from a tarball, run the following command as an
administrative user::

    python setup.py install

If you are installing using setuptools, you don't even need to download
anything as the latest version will be downloaded for you
from the Python package index::

    easy_install --upgrade pytz

If you already have the .egg file, you can use that too::

    easy_install pytz-2008g-py2.6.egg


Example & Usage
~~~~~~~~~~~~~~~

Localized times and date arithmetic
-----------------------------------

>>> from datetime import datetime, timedelta
>>> from pytz import timezone
>>> import pytz
>>> utc = pytz.utc
>>> utc.zone
'UTC'
>>> eastern = timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'
>>> amsterdam = timezone('Europe/Amsterdam')
>>> fmt = '%Y-%m-%d %H:%M:%S %Z%z'

This library only supports two ways of building a localized time. The
first is to use the ``localize()`` method provided by the pytz library.
This is used to localize a naive datetime (datetime with no timezone
information):

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
>>> print(loc_dt.strftime(fmt))
2002-10-27 06:00:00 EST-0500

The second way of building a localized time is by converting an existing
localized time using the standard ``astimezone()`` method:

>>> ams_dt = loc_dt.astimezone(amsterdam)
>>> ams_dt.strftime(fmt)
'2002-10-27 12:00:00 CET+0100'

Unfortunately using the tzinfo argument of the standard datetime
constructors ''does not work'' with pytz for many timezones.

>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt)
'2002-10-27 12:00:00 LMT+0020'

It is safe for timezones without daylight saving transitions though, such
as UTC:

>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=pytz.utc).strftime(fmt)
'2002-10-27 12:00:00 UTC+0000'

The preferred way of dealing with times is to always work in UTC,
converting to localtime only when generating output to be read
by humans.

>>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)
>>> loc_dt = utc_dt.astimezone(eastern)
>>> loc_dt.strftime(fmt)
'2002-10-27 01:00:00 EST-0500'

This library also allows you to do date arithmetic using local
times, although it is more complicated than working in UTC as you
need to use the ``normalize()`` method to handle daylight saving time
and other timezone transitions. In this example, ``loc_dt`` is set
to the instant when daylight saving time ends in the US/Eastern
timezone.

>>> before = loc_dt - timedelta(minutes=10)
>>> before.strftime(fmt)
'2002-10-27 00:50:00 EST-0500'
>>> eastern.normalize(before).strftime(fmt)
'2002-10-27 01:50:00 EDT-0400'
>>> after = eastern.normalize(before + timedelta(minutes=20))
>>> after.strftime(fmt)
'2002-10-27 01:10:00 EST-0500'

Creating local times is also tricky, and the reason why working with
local times is not recommended. Unfortunately, you cannot just pass
a ``tzinfo`` argument when constructing a datetime (see the next
section for more details)

>>> dt = datetime(2002, 10, 27, 1, 30, 0)
>>> dt1 = eastern.localize(dt, is_dst=True)
>>> dt1.strftime(fmt)
'2002-10-27 01:30:00 EDT-0400'
>>> dt2 = eastern.localize(dt, is_dst=False)
>>> dt2.strftime(fmt)
'2002-10-27 01:30:00 EST-0500'

Converting between timezones is more easily done, using the
standard astimezone method.

>>> utc_dt = utc.localize(datetime.utcfromtimestamp(1143408899))
>>> utc_dt.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'
>>> au_tz = timezone('Australia/Sydney')
>>> au_dt = utc_dt.astimezone(au_tz)
>>> au_dt.strftime(fmt)
'2006-03-27 08:34:59 AEDT+1100'
>>> utc_dt2 = au_dt.astimezone(utc)
>>> utc_dt2.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'
>>> utc_dt == utc_dt2
True

You can take shortcuts when dealing with the UTC side of timezone
conversions. ``normalize()`` and ``localize()`` are not really
necessary when there are no daylight saving time transitions to
deal with.

>>> utc_dt = datetime.utcfromtimestamp(1143408899).replace(tzinfo=utc)
>>> utc_dt.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'
>>> au_tz = timezone('Australia/Sydney')
>>> au_dt = au_tz.normalize(utc_dt.astimezone(au_tz))
>>> au_dt.strftime(fmt)
'2006-03-27 08:34:59 AEDT+1100'
>>> utc_dt2 = au_dt.astimezone(utc)
>>> utc_dt2.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'


``tzinfo`` API
--------------

The ``tzinfo`` instances returned by the ``timezone()`` function have
been extended to cope with ambiguous times by adding an ``is_dst``
parameter to the ``utcoffset()``, ``dst()`` && ``tzname()`` methods.

>>> tz = timezone('America/St_Johns')

>>> normal = datetime(2009, 9, 1)
>>> ambiguous = datetime(2009, 10, 31, 23, 30)

The ``is_dst`` parameter is ignored for most timestamps. It is only used
during DST transition ambiguous periods to resolve that ambiguity.

>>> tz.utcoffset(normal, is_dst=True)
datetime.timedelta(-1, 77400)
>>> tz.dst(normal, is_dst=True)
datetime.timedelta(0, 3600)
>>> tz.tzname(normal, is_dst=True)
'NDT'

>>> tz.utcoffset(ambiguous, is_dst=True)
datetime.timedelta(-1, 77400)
>>> tz.dst(ambiguous, is_dst=True)
datetime.timedelta(0, 3600)
>>> tz.tzname(ambiguous, is_dst=True)
'NDT'

>>> tz.utcoffset(normal, is_dst=False)
datetime.timedelta(-1, 77400)
>>> tz.dst(normal, is_dst=False)
datetime.timedelta(0, 3600)
>>> tz.tzname(normal, is_dst=False)
'NDT'

>>> tz.utcoffset(ambiguous, is_dst=False)
datetime.timedelta(-1, 73800)
>>> tz.dst(ambiguous, is_dst=False)
datetime.timedelta(0)
>>> tz.tzname(ambiguous, is_dst=False)
'NST'

If ``is_dst`` is not specified, ambiguous timestamps will raise
an ``pytz.exceptions.AmbiguousTimeError`` exception.

>>> tz.utcoffset(normal)
datetime.timedelta(-1, 77400)
>>> tz.dst(normal)
datetime.timedelta(0, 3600)
>>> tz.tzname(normal)
'NDT'

>>> import pytz.exceptions
>>> try:
...     tz.utcoffset(ambiguous)
... except pytz.exceptions.AmbiguousTimeError:
...     print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)
pytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00
>>> try:
...     tz.dst(ambiguous)
... except pytz.exceptions.AmbiguousTimeError:
...     print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)
pytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00
>>> try:
...     tz.tzname(ambiguous)
... except pytz.exceptions.AmbiguousTimeError:
...     print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)
pytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00


Problems with Localtime
~~~~~~~~~~~~~~~~~~~~~~~

The major problem we have to deal with is that certain datetimes
may occur twice in a year. For example, in the US/Eastern timezone
on the last Sunday morning in October, the following sequence
happens:

    - 01:00 EDT occurs
    - 1 hour later, instead of 2:00am the clock is turned back 1 hour
      and 01:00 happens again (this time 01:00 EST)

In fact, every instant between 01:00 and 02:00 occurs twice. This means
that if you try and create a time in the 'US/Eastern' timezone
the standard datetime syntax, there is no way to specify if you meant
before of after the end-of-daylight-saving-time transition. Using the
pytz custom syntax, the best you can do is make an educated guess:

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 1, 30, 00))
>>> loc_dt.strftime(fmt)
'2002-10-27 01:30:00 EST-0500'

As you can see, the system has chosen one for you and there is a 50%
chance of it being out by one hour. For some applications, this does
not matter. However, if you are trying to schedule meetings with people
in different timezones or analyze log files it is not acceptable. 

The best and simplest solution is to stick with using UTC.  The pytz
package encourages using UTC for internal timezone representation by
including a special UTC implementation based on the standard Python
reference implementation in the Python documentation.

The UTC timezone unpickles to be the same instance, and pickles to a
smaller size than other pytz tzinfo instances.  The UTC implementation
can be obtained as pytz.utc, pytz.UTC, or pytz.timezone('UTC').

>>> import pickle, pytz
>>> dt = datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc)
>>> naive = dt.replace(tzinfo=None)
>>> p = pickle.dumps(dt, 1)
>>> naive_p = pickle.dumps(naive, 1)
>>> len(p) - len(naive_p)
17
>>> new = pickle.loads(p)
>>> new == dt
True
>>> new is dt
False
>>> new.tzinfo is dt.tzinfo
True
>>> pytz.utc is pytz.UTC is pytz.timezone('UTC')
True

Note that some other timezones are commonly thought of as the same (GMT,
Greenwich, Universal, etc.). The definition of UTC is distinct from these
other timezones, and they are not equivalent. For this reason, they will
not compare the same in Python.

>>> utc == pytz.timezone('GMT')
False

See the section `What is UTC`_, below.

If you insist on working with local times, this library provides a
facility for constructing them unambiguously:

>>> loc_dt = datetime(2002, 10, 27, 1, 30, 00)
>>> est_dt = eastern.localize(loc_dt, is_dst=True)
>>> edt_dt = eastern.localize(loc_dt, is_dst=False)
>>> print(est_dt.strftime(fmt) + ' / ' + edt_dt.strftime(fmt))
2002-10-27 01:30:00 EDT-0400 / 2002-10-27 01:30:00 EST-0500

If you pass None as the is_dst flag to localize(), pytz will refuse to
guess and raise exceptions if you try to build ambiguous or non-existent
times.

For example, 1:30am on 27th Oct 2002 happened twice in the US/Eastern
timezone when the clocks where put back at the end of Daylight Saving
Time:

>>> dt = datetime(2002, 10, 27, 1, 30, 00)
>>> try:
...     eastern.localize(dt, is_dst=None)
... except pytz.exceptions.AmbiguousTimeError:
...     print('pytz.exceptions.AmbiguousTimeError: %s' % dt)
pytz.exceptions.AmbiguousTimeError: 2002-10-27 01:30:00

Similarly, 2:30am on 7th April 2002 never happened at all in the
US/Eastern timezone, as the clocks where put forward at 2:00am skipping
the entire hour:

>>> dt = datetime(2002, 4, 7, 2, 30, 00)
>>> try:
...     eastern.localize(dt, is_dst=None)
... except pytz.exceptions.NonExistentTimeError:
...     print('pytz.exceptions.NonExistentTimeError: %s' % dt)
pytz.exceptions.NonExistentTimeError: 2002-04-07 02:30:00

Both of these exceptions share a common base class to make error handling
easier:

>>> isinstance(pytz.AmbiguousTimeError(), pytz.InvalidTimeError)
True
>>> isinstance(pytz.NonExistentTimeError(), pytz.InvalidTimeError)
True


A special case is where countries change their timezone definitions
with no daylight savings time switch. For example, in 1915 Warsaw
switched from Warsaw time to Central European time with no daylight savings
transition. So at the stroke of midnight on August 5th 1915 the clocks
were wound back 24 minutes creating an ambiguous time period that cannot
be specified without referring to the timezone abbreviation or the
actual UTC offset. In this case midnight happened twice, neither time
during a daylight saving time period. pytz handles this transition by
treating the ambiguous period before the switch as daylight savings
time, and the ambiguous period after as standard time.


>>> warsaw = pytz.timezone('Europe/Warsaw')
>>> amb_dt1 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=True)
>>> amb_dt1.strftime(fmt)
'1915-08-04 23:59:59 WMT+0124'
>>> amb_dt2 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=False)
>>> amb_dt2.strftime(fmt)
'1915-08-04 23:59:59 CET+0100'
>>> switch_dt = warsaw.localize(datetime(1915, 8, 5, 00, 00, 00), is_dst=False)
>>> switch_dt.strftime(fmt)
'1915-08-05 00:00:00 CET+0100'
>>> str(switch_dt - amb_dt1)
'0:24:01'
>>> str(switch_dt - amb_dt2)
'0:00:01'

The best way of creating a time during an ambiguous time period is
by converting from another timezone such as UTC:

>>> utc_dt = datetime(1915, 8, 4, 22, 36, tzinfo=pytz.utc)
>>> utc_dt.astimezone(warsaw).strftime(fmt)
'1915-08-04 23:36:00 CET+0100'

The standard Python way of handling all these ambiguities is not to
handle them, such as demonstrated in this example using the US/Eastern
timezone definition from the Python documentation (Note that this
implementation only works for dates between 1987 and 2006 - it is
included for tests only!):

>>> from pytz.reference import Eastern # pytz.reference only for tests
>>> dt = datetime(2002, 10, 27, 0, 30, tzinfo=Eastern)
>>> str(dt)
'2002-10-27 00:30:00-04:00'
>>> str(dt + timedelta(hours=1))
'2002-10-27 01:30:00-05:00'
>>> str(dt + timedelta(hours=2))
'2002-10-27 02:30:00-05:00'
>>> str(dt + timedelta(hours=3))
'2002-10-27 03:30:00-05:00'

Notice the first two results? At first glance you might think they are
correct, but taking the UTC offset into account you find that they are
actually two hours appart instead of the 1 hour we asked for.

>>> from pytz.reference import UTC # pytz.reference only for tests
>>> str(dt.astimezone(UTC))
'2002-10-27 04:30:00+00:00'
>>> str((dt + timedelta(hours=1)).astimezone(UTC))
'2002-10-27 06:30:00+00:00'


Country Information
~~~~~~~~~~~~~~~~~~~

A mechanism is provided to access the timezones commonly in use
for a particular country, looked up using the ISO 3166 country code.
It returns a list of strings that can be used to retrieve the relevant
tzinfo instance using ``pytz.timezone()``:

>>> print(' '.join(pytz.country_timezones['nz']))
Pacific/Auckland Pacific/Chatham

The Olson database comes with a ISO 3166 country code to English country
name mapping that pytz exposes as a dictionary:

>>> print(pytz.country_names['nz'])
New Zealand


What is UTC
~~~~~~~~~~~

'UTC' is `Coordinated Universal Time`_. It is a successor to, but distinct
from, Greenwich Mean Time (GMT) and the various definitions of Universal
Time. UTC is now the worldwide standard for regulating clocks and time
measurement.

All other timezones are defined relative to UTC, and include offsets like
UTC+0800 - hours to add or subtract from UTC to derive the local time. No
daylight saving time occurs in UTC, making it a useful timezone to perform
date arithmetic without worrying about the confusion and ambiguities caused
by daylight saving time transitions, your country changing its timezone, or
mobile computers that roam through multiple timezones.

..  _Coordinated Universal Time: https://en.wikipedia.org/wiki/Coordinated_Universal_Time


Helpers
~~~~~~~

There are two lists of timezones provided.

``all_timezones`` is the exhaustive list of the timezone names that can
be used.

>>> from pytz import all_timezones
>>> len(all_timezones) >= 500
True
>>> 'Etc/Greenwich' in all_timezones
True

``common_timezones`` is a list of useful, current timezones. It doesn't
contain deprecated zones or historical zones, except for a few I've
deemed in common usage, such as US/Eastern (open a bug report if you
think other timezones are deserving of being included here). It is also
a sequence of strings.

>>> from pytz import common_timezones
>>> len(common_timezones) < len(all_timezones)
True
>>> 'Etc/Greenwich' in common_timezones
False
>>> 'Australia/Melbourne' in common_timezones
True
>>> 'US/Eastern' in common_timezones
True
>>> 'Canada/Eastern' in common_timezones
True
>>> 'US/Pacific-New' in all_timezones
True
>>> 'US/Pacific-New' in common_timezones
False

Both ``common_timezones`` and ``all_timezones`` are alphabetically
sorted:

>>> common_timezones_dupe = common_timezones[:]
>>> common_timezones_dupe.sort()
>>> common_timezones == common_timezones_dupe
True
>>> all_timezones_dupe = all_timezones[:]
>>> all_timezones_dupe.sort()
>>> all_timezones == all_timezones_dupe
True

``all_timezones`` and ``common_timezones`` are also available as sets.

>>> from pytz import all_timezones_set, common_timezones_set
>>> 'US/Eastern' in all_timezones_set
True
>>> 'US/Eastern' in common_timezones_set
True
>>> 'Australia/Victoria' in common_timezones_set
False

You can also retrieve lists of timezones used by particular countries
using the ``country_timezones()`` function. It requires an ISO-3166
two letter country code.

>>> from pytz import country_timezones
>>> print(' '.join(country_timezones('ch')))
Europe/Zurich
>>> print(' '.join(country_timezones('CH')))
Europe/Zurich


Internationalization - i18n/l10n
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Pytz is an interface to the IANA database, which uses ASCII names. The `Unicode  Consortium's Unicode Locales (CLDR) <http://cldr.unicode.org>`_
project provides translations. Thomas Khyn's 
`l18n <https://pypi.python.org/pypi/l18n>`_ package can be used to access
these translations from Python.


License
~~~~~~~

MIT license.

This code is also available as part of Zope 3 under the Zope Public
License,  Version 2.1 (ZPL).

I'm happy to relicense this code if necessary for inclusion in other
open source projects.


Latest Versions
~~~~~~~~~~~~~~~

This package will be updated after releases of the Olson timezone
database.  The latest version can be downloaded from the `Python Package
Index <http://pypi.python.org/pypi/pytz/>`_.  The code that is used
to generate this distribution is hosted on launchpad.net and available
using git::

    git clone https://git.launchpad.net/pytz

A mirror on github is also available at https://github.com/stub42/pytz

Announcements of new releases are made on
`Launchpad <https://launchpad.net/pytz>`_, and the
`Atom feed <http://feeds.launchpad.net/pytz/announcements.atom>`_
hosted there.


Bugs, Feature Requests & Patches
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bugs can be reported using `Launchpad <https://bugs.launchpad.net/pytz>`_.


Issues & Limitations
~~~~~~~~~~~~~~~~~~~~

- Offsets from UTC are rounded to the nearest whole minute, so timezones
  such as Europe/Amsterdam pre 1937 will be up to 30 seconds out. This
  is a limitation of the Python datetime library.

- If you think a timezone definition is incorrect, I probably can't fix
  it. pytz is a direct translation of the Olson timezone database, and
  changes to the timezone definitions need to be made to this source.
  If you find errors they should be reported to the time zone mailing
  list, linked from http://www.iana.org/time-zones.


Further Reading
~~~~~~~~~~~~~~~

More info than you want to know about timezones:
http://www.twinsun.com/tz/tz-link.htm


Contact
~~~~~~~

Stuart Bishop <stuart@stuartbishop.net>


PK�(�\i��b��!doc/alt-python37-pytz/CHANGES.txtnu�[���2004-07-25
    
    - Improved localtime handling, and added a localize() method enabling
      correct creation of local times.

2005-02-16

    - Made available under the Zope Public Licence 2.1 (ZPL) and checked
      into the Zope3 project. pytz may now be used and redistributed
      under either the original MIT license or the ZPL 2.1.

2005-05-13

    - Move UTC into the top level pytz module and provide special
      case pickle support for this singleton.

2005-08-14

    - Ensure all tzinfo instances are efficiently picklable.

2005-12-31

    - Add fixed offset timezone classes required by Zope 3
    - Generate and distribute a PO template file listing all timezone
      names. Translations are not yet available.

2007-03-03

    - Import work by James Henstridge, making pytz load timezone
      information from zic compiled binaries at runtime rather than
      processing them into Python classes.

2007-03-26

    - Update database to version 2007d
    - Fix windows incompatibilities, working around limitations on that
      platform.
    - Fix 2.3 incompatibilities. Installation now requires distutils.
    - Passing an invalid timezone name to timezone() now raises an
      UnknownTimezoneError, which is a KeyError subclass for backwards
      compatibility.

2007-03-27

    - Ensure API can accept Unicode strings (Bug #96957)

2009-09-29

    - Fix test_zdump tests and bugs the fixed tests picked up, including
      the fix for Bug #427444.

2011-02-08

    - Python 3.1 support.
PK�(�\�L��BB%licenses/alt-python37-pip/LICENSE.txtnu�[���Copyright (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.
PK�(�\�L��BB+licenses/alt-python37-pip-wheel/LICENSE.txtnu�[���Copyright (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.
PK�(�\��R�MM$licenses/alt-python37-PyYAML/LICENSEnu�[���Copyright (c) 2017-2021 Ingy döt Net
Copyright (c) 2006-2016 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.
PK�(�\ď�(($systemtap/tapset/libpython3.7-64.stpnu�[���/* Systemtap tapset to make it easier to trace Python */

/*
   Define python.function.entry/return:
*/
probe python.function.entry = process("python3").library("/opt/alt/python37/lib64/libpython3.7m.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/python37/lib64/libpython3.7m.so.1.0").mark("function__return")
{
    filename = user_string($arg1);
    funcname = user_string($arg2);
    lineno = $arg3;
}
PK�(�\y��L{�{�-python-wheels/pip-20.2.4-py2.py3-none-any.whlnuȯ��PKEePQX��#�pip/__init__.pym�ok�0���S݋)�t��Mp0dd[�����Umr�I��R�C��㹻��o�T�2�KY�)Ir�݁�����RM_����+�fٳ�8��S���7C<��g�b!�R�(���	$�k9��$~�X@���鰣I�,�Oԋ�c�u�U]���W�W8&I�7�j�b𰘁�ej�P�5!l�V�%�;X�:K�D�m0�I�#�)��<7���#��h�{fO�4����uU����L
Q��ތ�ne7ٟ�s��rh��)u��!h�1�F	�u���QR_�PKEePQh<��pip/__main__.py]R���0����T,;�Ug�{]�VUQ�I����kg��[Nı�{~/}�3(�/i���9��@�$?-	�\{���G�	�p�7���:0K���>��]��M�q�^xҀ��H	�)n<�{j�NC��� y�7o;XHp�x<j��yfj3�&B���(�ij`��'�h�kÃ뀎�o~�4A���<����Z؇����W�e��WLf�~)����
>T�Zl��Ê�#B\���ZȑE��n�l{`���t�R�YH_�P��>��0=��}�GUD+�y��\8��ʓ�l�2}�yVj��)Նm���~;=#!�m ��|?��/
�����LIL�
�]�����&©߇�d�tzo�[�v�;e�ܟo/�Mb�]�>����Sun2'��b�VY�����L������';!�-q��F�����=
aޣ8l+�T�2���/PK�mWv�OV5�pip/_internal/__init__.pym�OK�@��)���BM.�Z���?�*��RJ�&�f$�]g&�|{�	U�.{X�yo��v��B��d���:i�jI�}b��`�0*[']+��/kJ���:m�-P�|]f�c���X<,�Dyj ����KP��~O$j�)���%7�����;���A�S%��b%��ή!&���{E�FA��J���r����3��j�ׂ�j� 0������#ML����(����D& �P���閴j6I�wih�M#”D����29��q
2:�6�X�#�l�6�>J����o�c5���e7{���PKEePQb;sXr	�pip/_internal/build_env.py�Y�s۸�_�:$�$�飦���q.���'v���h8	�8SP�u����	���뽵z��.�㷋�����ݞU%��L�zG��%-Ɇ�$���{��-�%�-Y#<�...f3�k�hIŷ[\3�\�_��l�s{y3��#�*Z�xI��(���{V���۷��)�)x�a[K��m֜�G^g[k�i��}�3Mа&��.�H��m&��{Q�N����{&(�!&�P!A�KY�J1�O`�=m{y�3�6��YFr��Y��;gcV�T�y�Ke��6����uf�x���FpP��+����-�5YɄe|��`k�rq�	���X�&�� ��~���]~���G�����������|Fࣤ����"/�:/�`գqvy�7�	�=&נM����ݛW1�(��/��l��i��[
����wz��Z����ra��>��0��|!�f�YQ���N�
{����%�X��,%�61A�E�x��Q��I([����״{�,)r��忐��7��C^�Ϛ�*���aG���n��2E�b��(�"A�%{�eJ{��\�ŷ`�K̕R1�CUpV^:�h�B����ʱ���`3��v)8��rԜ���a���8�=$��ܝ�NP��r�mu"r�`i�v|�^Pാ�*D�ZC�тmX�P^��6z��ԋ�� ��$��;=V���
�b�$l�4��08?��-V2UYw�z�׿���r_
����y]�]^C�oS���Ή�a�l����Ho�t�S�C�+J���Ś��
T��������/1�V|
��2mF��cr��9E�9�M��b��6�C�p�+guhuNu: eE;��*�XM �b�Wd?PQ姠��F��dV�]���"������px�uҶ�V��*pЇ��g�C^���	�u
�ygVj6[��	�c

��a��!�{�����Z
�sq�,%`��
TI<p��	�!�e�&x�B��a�7;-ל���z��K��7��d�/D�H�TI�0{��~����DŽ����~3��|���U�c�π�"���,�:�#�ha��'�OnT)l����A�=զ�7�4�Q}h�ʴ�%��K� �umj��6uD��|xBoQ
��$!PwU�T�S:��A�Cgv��9��2~9_��j~��ɍ��
��J`h���O�e>���M��o�������=����j5��(;���
�?*��aф��2�����Y�t��N��i�<�%ڊ�I#	c�ј�#&xO�E*cQĆ�'}B2:��7�<b��HU�����C���g���Aۇa�a��8��(��	璃����?b�y�����Ր���(0F�sD�i��v`z�Zp���G��>|�����r�����_SnA�;RSA��׭#�*3��Z����hC�ؔ{u@[
��V��U[��mW�1e��/櫞�q־)�h��K��s�o�O�x@:�ݜo�I�sR;��/>h�U�A����E��{ٛ����wP"���W+����1���o���ǽ5k�)t�i:8�nu�g��D���B$w�� 1�1<R�W
'�
o�n�q���8>���^ڍ�`��x�D?����
Kr�%v|�Zc�5\X��v�����JMa��|�{���_�<���	)̬K����	ߐ�\�(��c婌������@܎IyV���u�-װ�p��cZ�o���~�J�؁}�
�O+N�g
l}�)eBg�i��dE�y�
LƣF���J��H�3Rg)�8�	�,[���*ͥ;�*�[�ɏ#��ʽ6

+g��Z��݀�G��B��\N��]���(��K��䫋[�òR�c����k�N�?\��Eu1��/�
���^���@b7E�f���e�N�~/ߨ��>�>����I�6B�`ݡ0�kL,��W��-^f��P`��$5O�`�~��:k�j�r���3�#����l����g���\m68�?�Op���o�[? }���Ͼ��Av<$���2�����
^�	�5�8�1I]����ҼR����I�<��ƃM��z������y@�

WA�<���A���E�VG0�[0��p/Q�Nj ��E���57�ꄋ�
� a�fO
j5.�@-�LQ����ո
vH{���
��v�3݇S�`Q��	�����^7<A�D����r��r�l����=��p�;�
i�� �VޑiDB��c���QЊB?7%�w�S���`�{�2�Y2;C6|c�sK�Ĝ��J�&0f��j�S��Ėta��?Ln�m3M�!�OP�ި�K�:��j(��rZ�?4�n@�?v�I���Q����z����iqD�$�Ʈw��r�����PKEePQJ4	�>�/pip/_internal/cache.py���۶�w���!��C�a�\ M/M�$-�+��ph���ȢJJ��E����(��,�/]��[�ÝM�=��/)��'<�
��W|#v�jfQ�frW+ݰ-7�R������ld��*3���ڱZ�i�AT��i��O�
���U#t���*�I��Ah#�[���,l9�T%s^���� �/S�1ux����)�n�(��R��N�4i)��=��~��Dٟ%�S�����:+��_��/�y��>a�
��{Y�,����x��7�eO�]<�W���W�����8d��$k�l�Fe������1���ʯI��L��$  W���2of�u\���X�k�w��rU5Z
�~J�O��l��)4[���nD����$��٬k�����&.��{ȠX��2�N������:��Z4���5�*3[~~���5,!>�ާ�Ra��hw��@
�g���,/u�`D�5�e%Q¢E4O��L�E�M.%��>m��4���&U��#:���V|,�F�&F�����c�z��q
t>nV�!����Vk�A€�a�(:����`o��:	�…�2��`h�v	�Z�E�w�J���`I�҉`��;w�d3 ��J��ȕ@SՂ�������Ef	0v��������k�a���,@�J{���'���
vߨV�~hA�*��}BQ+̼W�� �&�l�,6�\'N��HFɘ�N��-��#�,����f�|���\�Ӂ��p
�/��*�8��2)ƓT0�x�r��1u �<����~9@xx$8=Zq6�Q�N�YU��Y
F?�ٝ�$m+p�8�7g���
O��2�6�^���d���|�)=jJ���HejI�����Fsm-�����ZӀ3�y�d�w#������"��s�Q,�h���?����jh�J���[,�, ��I}�fo��U�N���p'�E�\j
��[�nN�
�U�ozH�;�J�������d����f�����!�BR�lS����z>���ݕ�T�"T�sq �*L�
Մ�4C)�����	�NQ���ä!�AS�K�mgĔ�Ҕ�5d�8ZF��*D�8l��y@4�yɢ{�r���2i5�0�`�bP�˒Y�K���dbqɵ�ψ��h&�K �4�Aو�o���~�UC��݆�@@S�^��`�q�X�b��g���z-4$A�Īq�߃����!r'ɢ�]d#��l�S7J|e9N��D��;ε�V_�fG�ˤF�I�&��P��b��VQ�T����Ce���Z��m��CHӮ���/�=}�l�r|�8�N:��ݏ��G�ǣ��㶫KՉp��Ź����c�Gv4H��+�QL��b�_9���7�@�1đ:O������p2.w��p'+�ֵ���AѾy*H��6%��J��,�P���U+�4�C�i��~���ϕ�x��T����w��z��PˢwW��.�Q�H4
��G����J=ۦ����l������A�?��@yz���<:���h�ГBƋ�h��t�����nv:�����L����sP��I��Oءұ�Dc��W{��SҦ<�#���Q��ij�N"�����aD��s�I�5BmQ�Q��5M�4a�Ɲy?x�O�Æ��N�h4מ��v� �T|�ES��S�:W�I�_GWS��߅�U�x�4G�����{<,%D�W��c�_�5p�SP�v�2Q*����J�ʟ/�:��S٭����	�=T���q������:P�GY�c1�O��.!��R��]]�\Z+����M��p(S(���Ȗ�+Q�T��꧒�(vC������É���%�ikł'cu��H!8^�=:%�4M�0�]?H�`n�	<H���B�.>bՕ��%�;8X�1F?W�����=��	*���]�鎪=;#]�@������
��5��`��8oL��dȍ�<����/����e�[Gfa`�Gu�]_]�1�&,�
�����/ϊ(��_t5mC���/�ü�3�ڨ#����
Ȱ�!�l�UUB����2m�֎��Ì��a�JB�f+!�;Z�vopAm:a��k�,]�3��m�����P�"����
��ብ��`��7LO-��ݍ�y�����߷"e�&e�Y���P?����㕶(�;��������3�o�	,�x��Ý��U�-���<	���%������E,�;�1;���f%`Y���9��}C��{C�A�؇�/�@Oۋ�Lj:`���Or�{�
Y~gŨ�nBό~
/�]��q�;.�}�&��0�i6�����7�{��N �;=ޮ:����0�eBF�?,7��,���Q4N�w&_��`!�Ȫ��m�F���R���iy�������v��'z���o�X�g�g���?�B�4p���A'/ �b9 ���E��y`K�d��_���	`�w%g�7�Iz�Dgq�}A��2�7i���3���h�qئ�M�& J�B|�v�B�OJ�}�e'�;?��;��q�%�D]�fz4J���HdG��>w%�E
5�WQ��T���ٌ�kAQP6�!I�T���P���Y؟,�OWۧ
m�sË=���~�e�Oz�ͳ����g/�'��<���)�
ʏ}��7�
��ȸ':����z?$�T8���"���÷I�ޞf��+P�o�N�TG��"�J�e8�
��ݏ����[��뤲�
���+5�Xi�j����\6Xo4�ź=�������+���Ex2a�F574�PCqi���V-֗�\2D���R��7�;������8C˵ᥟ�t��y�!�x��i�댥ld=���X��P�N��V��,�j�D�^G�Z����O�`#2F�F�o��`���r���;����e��57�t���������wJ�
.�"���m�b[r�q�MԽ���TB!4/ǯ4�M�@�34�#O>�–��`�W��x��c9��D��;�DFS�)����x"�ފ=��(l�Op���f�2Q��7PKEePQ��
\#7pip/_internal/configuration.py�[{o�8�ߟ�����U����pk w�G�
��A��.|�V��YH9�/�}���)�N���Q��D��̓l/�b).72�EY�uZ��|͋�)^o���\sVs�E������随{�؍u�&
� Bl)r�bt���	�e�R�B�5�؍�W,�D�� S����#D=V�Ă�
͗gM��iQ#L��2�즔˸ZHd.�͊K`}�
kv���1ǪTH�����\�� �ĺ*e��r��uy	$��R�oj�F#��*Q��5/�R�J����+f�i�T*.���i�����fJ[c��Α�����_��_��<;-��L3�E���:�Z��iUeB���bPH��v���ӗ�>�G��Vi�mp/;���Z؉�P�X����Y��B͙yo9�%y��ы7����ǧ�A=ˁ�S�	Q�)h!��Y���K��#vK�9�؉P��|�V��i �#�aS��NF���F���t�=�����;_+��#�&���S��к��1����'�,L4�$�Q�G��݇�){�n/8�m���-K��~S�Ӓ�\���7GcG
�_��yAtC�&-�G(:>O��ߑ7z^�6���cq�
Ć!�e*3pw��%S�F.8yq-dY����`b	ѿD����v9�%��t��q2��`�g��i��SY+D�p|/��ZZ��s�FY�[VI���%�HH�	�&
<#-�L(@&�sH@T{��2�s�[ ���\qt���L���Io��e%�Ny�)P�J�\�'�H�{`?�˜>�3.Wi�ضܰ�A�jG�_��8��E��?�ɓx�P�6�e*`jlBo'��cU�A{�M���7����
�9�<�!�Z:Ϗ�*@�|���M�_��Xи�'�?;9�6�X�-�t�>�L����@����f���7i>gG��z�N?`��4�H�rv|��xw��u����O>={OS ��f���'�V`cj�R2D�?;?:}���0F0��Y�e<Gu���ؘ,`C��5��v��Lo�X�֫�W��P�$��Yc���W�o�(B��ۭ��I1��`bJ�����A�1n=ט�A`}oU��1���ݱv����#�zd���Ɠ�yAl����vTg�ȄB ~�EX� �`�V
&�:+��kH�����C��:C��l���;}��u�i�ރQ.r@P;���70c���?���œ��6�3Y^�+@>F��b[�X
alGL$B��O�L�I�>��b�9t�!�@Xh�?;;D���X`3LL���[��3E몺���L緽�V@Z�Z"�"�	��
�����4�p�ȝR�{"�l��(a%��	��]�� ��5p��Y0��-JS+�Z3Ct@�D��fYZ�z�@�U�g���Q��	�U��D�$����F�9J(�x�f	��Ӳ�No`�,�6#���f��T�ɞ�A2�M�fm���']�,iVG�k->�*r|&�U�
������]���wwVo	�5�#jƶ���Za�� ��Ё���{�f9
��:�Bȱ ��;�<�O&�����J9�Aگ�W����n��^נ� ��4�����zH��N��Dp�~����YkV���|�Pސ��:ˊKȞy���g����ЏA�+�W����s�H1'��<�W����
�KSx|	Jo���PM]_�Rw�M�`='31�� �d�̽o]��P̓Bԭv��y�-S�����O�?P��XX�$m<sD4��t�R�Vh��TCx��@:,�U01��P�O�&r�t�D����p�BOA��}>�84��ݥ�Xh�G$��e�3�����1����D{+�=�V�r�U
aG�R�۶/dd2�{��d���#�}��?�\<�Jg��;Ռ�Ǹ5���k��f�Wi��X�%�`ȸ��d�]�iݢa��o	����4†�k��K�v#\c��ݑ�ߺR,P�g�'�^i��!��yRNN�����Ă���֮�[1c�<07�K[>æ�^sȔl���M7��ۯƖ���ST�C�����R��
���	��WG�/�H�m�DHǃ��L��Pr6,-�k[�׼��n.4�lm)��-b��r�s��&����8m�:K3�^�%:�<bF(C�&��flxALcn���,m[��1���i���Ɓ�Co?V�݌As9�e='���;c�ʫx��-��Xܦ��}�׵��H`������AO2��>���`���dM�̑O��Mq2`�&ۦ��&�[�4��7��K��W���u_�>�Ld�O�1;�"�AP��H����2z�z����n��B����"]ֺ�v74�	l(~�h�j�+\?��'��s}]:z3��n��o�ar�:$�(^`�{O����>ՈE�,��:#)�c��R��;J?"f �� vd��B�|���I��w:��T;d)1-+^X7�mq���T�B����L�k�&���Jռl�ò�rU��@܇�=hi1%�&)^���7<^
Zs6J�8�%hI�9�)��������C���ä��?+	B����G����_����4v��_�٣������L���6��aCӍ�y!q�$�R9��
-w,��!/�؊5��MTŽ��G�8=1t掽�\XOr,�_Y����A�w�P�z/�g�S�z5��j��i��O!���  ���&���-��m;���hv4�Y�!�釫���Ǫ{2.�[�|���Ae�6�"Z�Vb�~���4n(8^�S8�Za1��#�0��Ƴ�
[��p��`�a�0���~Z1n6�������agd#+��T�h���c5faӧz�&6EΕ��g8%ó[Ql�����h�V���U�@�r}�91�t�G�o֛�
\��
�^v�I�/]Ct��ݚ�EE���#��r@A`�@�|�}�8����� �r���{�&:���������\��	�f��_}pnnXd���6;'��>X�[A�Rz�Ӻ٩����oߕ��آ�vQ]a�c��,�5�?Eɵ�<��l�kޜCiRMݾ�I���������ԁd��M���M]�\zm�YEm+�Xs��G؈�"�w7��R��aW�鵜Z��(��c��1
���X����֓f��s���JM�<���ks�W��T�*}R��Pj�Փ~��_��\�6����*��\BQ���=[�R ��j�!~�m9���/�Hȇ
�2�)|��O���85j
T�b�,�Č	>���ۏ�_޴�!�=y�击�N���Ǻn�83��VޡX�qh��`
+Nm��-Á9�h��F�>l"�u�sW/ug�����.�L�S|P)�2I7������^��S}Tx���=��`'�__��&2p��`0=+w�;\�8,S%b�c�lZ�#I��`S����}�o��z��5�Vg��A���g,_}r�^p2��'')/`|
���!q�B��;}��zW�(3��G�A�0�Sr}^�\�d+x��
������:a��hg����ޚ�����=5��]�8I/�k��M_�����Sm����b�/��Q׼�ܘ�0�hG��+l��A>�&���9l�N��5�2�>_����®>�ۣ��){[^7W�u�(lj���R�MA����@�V���
p�V�jk}���$xS8c}�eW����m���41so�5C��C�+���λ���R]g^��b��Ksn�ɐ˅�2�[Я�;�xg�cS�m�M�Lŝ�}x1�{fO�I�OJ�pD'+u^���Q�|]趺���
T�iBA��.�[�o�A;����H_x�\�`wˮ�5\0Ԟ�J0q�k��u/aP�����b�:�R�(�P�bwW��@��ך03mI�b�Jl�z��tҠ���H�王[[�U����LY�7i�f������r�h������1����V԰�I�q@�=�R^a^+�L �����^���/=��P���/��K�����wD�a��h:;���]���d��	��q���p/�,4<��z��!�s�t�?����>��ム�����L$t;8Ib��l��-���PKEePQ4V<`p]1pip/_internal/exceptions.py�Z�s�6�_�S$�H��7�DZcOc��8�tҌ����"X���f��� �r��^N�Ƣ�.������C*�J�°ڈ�U+���J�+yz˗b0��-�Z��lQW����R��Qy]��}v�d%t�Tn��t�e1aK ]�7�E)�]�2�݉"S:1��A"�ڄ�d�<O�J�&�6�,�~�ώN��~�]���8�x��'=?��1�՘�a½&u�|�^ISM��¿��n�B��˙F�:͒_�\-�5�꟦�_�0�I�*����)a7��р�ف�.�q� ~�
��b!�%�F��bՂ\�?�`*��~�}D��kQ8u��A�҆⊛U.�~���i,T|f,>3nܤ��4�ưKYk��1ر����`¿#�u3�hѵ�����Z/E!4�[
LN]nfH���)f�&[&�D��[���.������.��K����(O��
�_�8�>0����חӳ����v4�~�Da�[$�?05�S��EF�n2x����<���3�o.u��u-�&-E��I�z6V�ȵ̹�7(�]x��q�h��dbp'Y�f##�ńe��٬�k1nM�B��g�p���l�o����}�F�&���)鎍D�g�+��S@o�n�\�ٍYC?���~�ގ�^aQ	��H�E$���C���V�H��!����ߴ�7薸H����+I9D/�g²�B���^KEi^g��k�alV��v�ry+���U���+K�Յ�)6�t9$��)���Wd�v�Øab���58i�=�����o��C��P�	J0ڂ���#W��d`���:�:*��0�
��-��Ds"sq�!�b͓�Xzd��UiZk�0V���
[شB$��!Z��x�k���c.�����(�뺜Vj
{К�����qK�?O?��gGj���;���碸C��phr�- �ǡ����Ί��p��F�9��&m����K�1����oq�ăH��p�hv����z^Z>!�K-��Z����,������s�ڐ�I��k@R�7Q\սҷ���{z}}�D�0���B
���S]�� JL�K���0͜l瀏ǐ3�-y.�;���e�������x�nB6�G���x�_���o���u��|o�@.9��8O �E��!��s����*=ҍ�n�p(�G�y����zԯb��㤱��M�A4�0�����4��;r�;0�췕9B3���@ٍG�9-�H�L4�ɺ�d#��$#J>-=+��D!��Ǩ!0Tm��IT�C{3?����
���]��"k�=a#�,�U�չP`o����"pIWD*`�d�j�t�'�:�r'�S��	�����r	on����������;���	�y6!���,g�z��t�%�6��-!ap	�� ^�Ư�?����n��ȯ����{�e���AH���?
zӫf5�@�I p�^�n��'�y��뼒%��f�M	
�h����&�Z�/@`�>v*h{���
��v0v-�7�|h���,Q}�����L1K�vS��^6�5������g@C$JgB�Y0�5͍[����,�~J�N6¨��lF�=�u�I��Ē�|�!�I
�\eXʂ`��΄Gcv�܇��O%��w�a8]��o���=W*���B�D�/��(���q��|����y
Y%8
�����g�|� ]��B�ӥRu�����w*�����ɂu74MH.0��� E��Ȁ֋`Q��6�սЮ�^q2=E���
�@�b��\�^TȲ!���M��R	�b�
C@�pM�- F�;W��;z�����(R��A7��R	Ӻ�� �-0>	'�!��J�5�dj��ZC��q9.>�][�|���Te!߄��� �V2�" ��J���Kdl���ȆU�B�K���N��$>|7�JN!��,�6�Ɲq2°I�R6���oJ��w`u|�5���K�Y�PHYh�	�O�~{1�P�0��H㻉H��x!�ɓ1+"�rT��4�2��h���t�r{�ֈ�00��؈�i6�1����Fb��a�I����-�V�v��n�r=��:X���
��md��6��Hy�Kr0Ͳ�q�ѯq����a�g����ƁTa����n���E3�����O]V�E>E��2��,e{�M�#�O3�w�XA?��VR7���sȲݔ��c����ذ.(0x�6��]j0�H��4���{�c�?�	���>��b�Y��l���9�jB�9��N�V �c��R�2A����B|�g���G*.�`GT@�F�M1�s
�A�-'�=`Z��q��Q�0�R�� l/���[���h�/�$e��}ׯQ��j�T�^`$v���r.��3**�h� ���ks�(�����
O풸n̂:mө{��5�q#��.��ڊ�jV���,a�����9�2[d"Ur��CU6�AY����G%p��$�Xvh��9n\O���7�
%�U��F��WzX���uI+�y�`?m�	jtL���U/H�	N6%&����l�a{�ŦIi;�0䤝d<�l0.UI���SO�26�M:�9�,/�)64�~�+#���Ml��a��6x����{�2�c*5��c�c䶅����Nw�|r���������i��6ĺbO\�=������4h��իmt3�&+ñ�K	���5#D�ϼ�O@4��lΎ����Q���X�)�����.��T��*zy%�V-M@N�*(�
5���ֆ�#�!�P�p��SE0���VP�Uu)��������rH`;5�u�k6�KQQ�/�v�����va��?~�@�:��i?�缮޷2��.)z?��~�Ԯ��q꭫M�U�~>1S�T.�j0�P �tE.��#R"�"�v�1cg;C^F��r��Ci��#,u�����֓/lw����ۧ
��Г�L�6�m�B\�l+_��;�콉l��x���.a'Ԝׂ��=^�b���kb�}à�֘��C��8�S��}�)ާ���7������×�o؋���5;?�>:e���'W����?oϮ�Ϗ/��tw����q�\��
�ˌ�P;~?'

;�K�M/���^�i�x�k,4B����%��-j��R�`��gj�1xsj��@
6��	�g�����{��S��}�`��_�ԇ'Es��8̧��|	�[��dn�	��Rʬ(w3vֽ͋@d���z��T�;�B��-񐛮᭄K�l��ԦĔ��]/���l�+��:c3�E��EzO?�i�lg�rf�Z�Z�QE\�w_~I��|oj����N��`4:ZbA�Nζ���]ױ�hV����"%��S�yTID���O??��^b/���.��O�w�6촘)=���
�h[|N7_ɫ;�N`��
ب�柉�X���_�0][�����
��5�E=v����ޭ��k2ޫ1q�㌛��o��_�
�^�U�=��7E���M���ͭ�Q��-Bq���g�Σ��9��?�}BZ�mG��D�w�b{����؝
����aso�����`V�	���`��휳{X�s:��¼pW��zJ_Ҥ�&\�B��ܥ�fj)�@Jd�Qlt�]���G�γU=��Tm_�m���d�m
w�i/a�io�E�t)�4�ˮ��!P� Ei���fk��-P�����y]�Bt��G/��։=��9S�;%�U��w�ُ]]��/�˅���h�4�l��.�|CC��|�Upu'vo�f�@3xW`�>��S2�b�"���8~�NW����K0��Q�:����lD��)�k�=����PKEePQ"�&�
Lpip/_internal/locations.py�X[o�8~�� ��][��`g/�����ӦEӢ[�@K��F�$e�[��}�Ë,9q���������w�$�k�s+Ue�n-�`;�J���Ri��j)Wf�de,/Kfl�\N��y�$�����Y�j'��o6��̬USl!���T�j%�.+f�`c-R����Ե��T��/����R�
�2�;˘��J[�F����¼2�QZs���u�-���o#�h�{�z��Ņ��V���3n�٩c))�WEu�\�����E����k�Θ��b��RZ� ���c#Lf�L�^-�KVh�5ݨB����&���������u]HmN�#f����ի���Oo���9a����>gP��?����.�~���{��Vj��RT�HC7U�YSBg�u8����?G���+�ℽ�f'�mp�	�Xa08��XiSģ/���2���h����.�;l�"�JKa�/�g/_�����{v��6��&��=J��dR�X���نQ:�HxO�ڀ�h�%��5��?)��,�/��*�����`�SK��7ZS\���5f!w�Z���U�I���=a8��󟒴w����>�_�)�!��g�4��.UW&���b)�/
�z��� ��A�!3�_��FĄ_��!�
��BD���_/���b��%�|W�<Y�I8��1¬ G�zO�<�[:V�D��>��1�s��碶���J�)��ˊ�F�l�S������gk�q!D�T|�$
I��E�C�G�K;��:��	�^5��~�{���q���H�+�e�Zaゎ�Riң7;#����/��;EE�Z�B�{H�Z�
|�1o
*8vM���N�ivfլv^<[�j��]��Ge���4c��X�����r�C�`K������b�R-x�
̴�_!���O��d��ݘ�(q�\$ヷ��s���5�I�]Α(H9[4+��w�w����(�f��ѵ���� �]4�����+(��ҘF��_���/���ԫ�Le�+M�3%f
��T,F�K!
NSʳ�֦^�T�KA�m�S ����,�����:z��zmy�P�h<hc�}�>�N��H��$%2�6XԀ�	�18��tn�����	���lm��������߼׸�L��-�>q1����"a.�W:���+ח.\�
��B����\�ښ�&�]p|���щ3x�,�X�̰!H�'Yj)���s)�"]dc�ȳ�ɹ?�3]1��3���Cv��.���F~U:����X�5F�J@���୪�)k��K)�F|f����H}������jef���I�vY�%�*E
��l�@�D�;�B�����(��ً��A����>��ԥ���v���r܉B�}%�ٌ*��9����F�=�R�Z)��pT���s���>B����R@[n�v����M\�}
��.p�݋����G�F�g|Ķ��	����!I>���pH��\�CB�.���F;F�,�^q���#��M2�VjJ����Ur��R��QK�{|/�Fd>yfKY��DKj���OT�c�z�9R�Z�s�a��x]�t�A7�_�
X��h����N F�~t������~3�:|���C�������U�
�c��/��F�@��	A%��puh���.[JhC�Wd�-���(6�'蘇��g���X^Bl_T�5��g&�*�4���8&,qA��!��ׇ$�fZ�!4~Dʉ�'�b�IR��'%Ӑ �~�D�ٮ�~+�Æ��̄�#��a�����ŭ�(�Q��qk4
kO�ģ�{D烏n�{F�v����7�B��(�#��p���yfj�˥.}8eS������3�g�p賖J�u�-#���`��w�a�\�ʡ�-��B=��LP���8e%�Y2�2�({��ߛg��K+��?V�?��GU@�;8��j
oe�E�{��ΜC�{ja�u�?���gw̯�� �yQ�SRt�a��!��g�Z��2��^iS�0#�-(缧�I�Pz������Zpl2��c���_�kOz��"/�B��	j�yL�i�Ov���C!n���QZ
�N��$PV���r+:2Xغ�ǝߣV��*	�Jn���6�x�w�I���l�ݛ���� yh�B��*<
`�_���]$�V;�D����]����m�t���I��)]?�<�	����"a��3����tiUV5�`��ä��^�*oڦ���-����nŽ��o�,���$��RP2�Wt-�ϳ��-�}������Mu�R{{����ݭ4��X�%#��Z"/{��u8��^����}�E�s#9�{z�#�}��LkIv�3�v�8Ck�L���V����lx�"����[�|����mz��bJ�.��2$y���JD�R�A+�K0�<Aݲ�m�v�IQ#G�2�Tؿ�-V���
�(3����ч�)}�Փ=�@����=-�x�):�+�y���Y���>iur��X�b
�I'��*�n	�H�-�����IG��5����[Pxy�Nqq<�PKEePQqM-�pip/_internal/main.pym�OK�@��)�zi�&A-�5��C)%l�I2��.3%��mJ���Ǿ7o~��$'��ζI��J�C Wu����}�/���*˞�c�:!/�S�S�'�%���B�Ƙ+�,���Zn2�pv0�흸��Ѳ�;6�����b���d2�lH �(�_XB�|[B�A
���X����^;�
]K�q���1–%�C�j#�9"4�AiZ�6�.)|��!�4"LI�GI//���c�?� �S���9��lC@>TaԞݯ8���PKEePQ�^�z�	�pip/_internal/pyproject.py�Ym�۸����U>Xl!=�h��������4]$9�b!�m3+��Hy����̐�H[�-��F�X�p8��<�n:�ge��m߉�dr���2�6��(��Օ�]��M������T�iDe�V&�Q|/j۷��r2�l�� T�� c�ӂY�o�$��W|+ն��{ى�PvP~������ՂE�RY�)��mb�2�7
��v��V6���l	����s��/o������7�	a�L�|}��CZS
?�����͂�����ņ�Ҕ
<�zS��z�e�ԼB��xΖ߳��
���P���#�D�T%p����9�$��<��V����;K������T-��so�?��=����/[nwy�0s�.��J�5����;�:���?���l�U�⋖겲�
�X@3�ɩ�=ڝV�ae����t��Li�ւ�JV�$)C�o?�����&�pX�d)��T�S(T�C'[aqK�j�
�wd>����"ߏ�l�$���J�-���fvG�f�#���j�Z�D��F	�]݇t5��Q�0l�bzi�_���Ř�P�wXe�.E��H6�Ѐ�-l1�
l.ѿ��iQEAE1l~gJ�e�fw����0���-�`Khd3&ot�-�/ܐ
��C{;���-C�[	e��;{���$���*R��F�,Om#+i�#3���F��K(	%X�NW�CLo�S��L�7�	��*@(Y:$d�>�8}�K#�e��-
��� @a)����@U�È��(BcB�h�Flyud�N�����G	�9s�$h��	� <��"���$�nY\V9�J-�8DD����7P`dt�,2}Kέ���P�iE#*p��Z�aN�Zg��,�OK��/��γ�@Q�Nk;��<4�;�B���`��i�·%TW��&}@��c)<J�Q��
��bK��U����M�r{��۶�{V�!
ķ|3D(楃c�k'�0�g�n��en�h�������c���~�~����{c��}Uy�_28G#�Y\��ZR?���p�o*�:�[�,!�D�2"�r��^/�#+�$�����y%�m�q(��~`=FU�{�	E��E�`�d
��D�"�a�$_7�N���-alCH��P��N�v^���8Y򹟌0y���<����;n��b��(�8���	�Q�7�B����:��s����~�b�n���R:�zͲ�Z�}8 ��N��%9�b��^�J�F/}�{��0±�_��X5(��)ݿ>O-ŪJFCV@g�=7?q|�N�w�b��$�&��1��F��;��L�{G�N�)�(��/�L|�qX���!�b#:SVŽ�fFc��JP~�K
5����$�Z�����
P{8��!J?�:���X���n�W{�4�����*i�W�v¯ޡئ��7��a5��B�o.վ�!��w�W�t)��x�J�x\E:�;s/E���
�c�f��"5Q� �/�A�ݸ����	����xh>ߖ��b�#��~��A��	`��n�i��Uc
��pD���؎�ҝ<wI�xU��&�D�L4�	�a8x��Cv��E柼��\q�
P�_����-�fw٨���_^o��قedQv�R���nK8���te]�٨�B�6Z��hjS9��-d�TK
��o���G�%�_�C�ͯ�ܭ'1�������=
�-P���1�ptB��D�~�KP��Nq�2}�
��o��F�l:���L�X��ӭ-V)T�8F���K<_FVg�0�+
z���ʨ�����k'���9�0Ψ��c���3K�[7��v�=�m@��pi�E��I��'LZ�U8�.��k5Ad�K�حى_�>�/��Y���=@�#�t�F*Ox�8Çh��4�!ZC0}�q�h#4�[4�>���P�����`���q����N�r�L\�%?���c�8�:�L�SҚ���]]O�����)�]�r6���1����o���~'n��G���8�,�'q�V�����\*��N.��0������y ����?�
����4O�=>v��6��K�:�(��yw�ֹ��
��D�G���*3A�n��S���6�x��Iˑ=r�J�Nc>2�g
�#ry:dϨ�=4�����/�$���4�ѡ�D�9v���SB��k��d�m�`u���lR4̵�����k2N��`�j`���@<��p#�#�$�R�z-n�h�<� LP���Պ�a(�'y�����`�,GA�����H6�n0���e89�g�v�ُd&x�7�}�l�=������X�pn��b୎�+NaOY����*���|��b��  �x��;��ȑ����vɔ�{���4_'q�ld4�@��:FB9��|�����S�EC�~�'69�;�0c'��E�(��PKEePQ���?	{$pip/_internal/self_outdated_check.py�Xm�۸��_�:X�\x�"8���\4M6��6� �i�^-QkfeR�����>C��(ys��E������F�Y���m�eL�k�XƷFW��^,���[a�^��7�Jn���U�_�;��£6i��.<��Y,Jڼ�u�=U��='��ǃh�Ԋq�wY�8g7�10
e�@[�xs�$���U*U!�\W�ȭn�T�/���|^����3������)�.DeR#H>ΐՍ(M`�	��*�raNIi���RVf�b��Ç_x.���Έh����3�A�J4~�u�b��F{i�x�κ���	�c�mI�aU*c9�Y�}s����"N���c=bz����W/�>||��ͻ"~�˗N����yc�[s;�R_�㚽��]�[��p �S�tsW�!Bd}�W����k�Ы�W�뷷lÖg�.�g����go/�n��-�m�*�i��Z�e�+��dY
6����^&����}F��,q����}^���1<:*�gۣ;F��$9����fǟ?�.�W�N<�N���X�(�M�C!_��ȼ!}����4ug�E�Ͳ)S�Y��wIt ����N+ѿ%�����u 'W��ó�O�;�Q��щ�x����/��	&�,��'D�
?�M��-Uѻ��lI�.���v�{W�O�d���l���&�*9�⊀�_�3�N!%+%=W��x�E
Xy��U�h��_�jE��Gqt�V󝞱�Ǻ���Ց���"��/�m��`�
��-;pe����tk�c�OgjF�2	xV��E:��>,�^70Zc�}��΄�"5J5�t�8O�"��E/���E
@�q��m�8�G=~"�}�Nßy�<coJo$�4���8s������q�a���"G:1����w���Tr�O;�`�4�����Bޕ��t�iMKB�cH�I�~K�w�T8�-<��&�e��@��Z��J,U���H�	�W��(j���*��/�F@�Q�
�p8L|ё�q�Wm!ܙ��h&�a�lV@��N�;*k��h�'bh�8+����d~��K@��<l]F�#4%�I�5q52�������:���(*�}m<P�3(i6�MK�
�#�&Y�����ؘg�Փ8Y�qV��F���Ք��1��g�&�X�L��,e��5zD�sž��N�h��)�����VC.m�����B\��J'�zĤL)�֧�|���q�==�?�
0Q��|��GR׾����c�L�i��V�ʽY.�L�(J��ı^e+�y{�R��-���bqأK���k8�d�҂���*��$����ȑ�#���������%�R���|-0��4���=u�L����<����]�xͫ�w���t�6���N�94���ș!}|j&]˺���
���C�����mW��a�…*��Y�^��{i���F����sd��qh�%����-�S�Er�A���B:WK夑�E"Sdc[^	��h��P8����C���&{��A $�����8ݭ��&o$ۡo�و�6�G�Ĺ$r�f�Wo#r� |6	���L��j�Q+aM�����97]0�C>���!c�t`L˕>$L<c�&��T�l�
㣗�9�Ϻ�q!�:��ۤ
�	EF���#�jW�fM�H��c}>�g��b��v�K"C^�t\�VùH�\� �������=�_����w��G�G��<�>�<�c!��ĠL�w�;,�IK�7-
��:��OHɧr�T��6��\�.��>nt6�eN��l����s�0xdJg�^�w'O����^�>dG��E�q�M=X?������\k� �����
������s��4�&�
�rX�#�Nf�Uա8=a��m������O�)6�f�<��i+(-���5M�'�_v�ƫ��<�����4��&���=�O"�f��H�j�"�G�p_h���0As�7&�a�F�1��5�6�td=�4��|0Ď�率�O�[�gO��̈́5~=�s�=��'�1xFe���)��M��&��A�߮�w�+�k;7���Ъ�.+���5~?���'j�uw���-5B�n�-f\�
���x���B����S�j.i�sb�.�E�оy1��=�xyk����ȭ���k�_��w�L)��Mb��(��4�҄���j�I�n�n��Ѹ�����IiTZ�ɤ�X�p�*�gv���5��HP�Arg����~Faa�(FN���{z/��h����eW�z�rj�Bl۩qn��i�B��/�\��4��`�F����T�Ii\-�PKEePQ�H}m
2%pip/_internal/wheel_builder.py�io���~�TF!
K���a@���4u;i�0bD�%ּ�!�h}�{sp��-�ȇ�Zλ�].��d/d��j���vY�f�=��%�k���/e��J|�F�le�X.��EV�UӲ���ȼV2�y�7��0��k�|� �uVGqV��)yU
�<+��~Om�jgU)#b7"^
-Ŵע~�����s���a
��2�
Eƕ
hV���V�A�L&f�(e׈8͚����wY.B�IM>S&�<:)ڮn�*�11nP�^���$��y��O��uS%BJ�%�q�<ڊ�F9�gxn���=���P;�ǯ�~���8�{|�������]�[.��ⶊam
�!�;�'��������}���ϛ��s�ߢ��z��C&ې}�ѳx��]
��^�x}�Ah���}�+s����0�� U�J���y�(�O�H����m,�77c�ېm�Yn�+!��0�����r�X`��p�`�v��@kA��qZ��n��Uq�l6"J���p�Up�O���_���i���Naa��?_~��8s}���cqR�-}Yԁ\+3���� 	����Hl����Y)0�{`��`':E^U���ٽ`�dq��~V�L���=D[�6RD�"�E�n���W��m L���\=@psH���I���z�����D���J!tJs�Z���xK.s�3ξi_ZuE�H�WJ2�HP٘A�db[A��(茫ZA�b�M�p��3�' ރ�Uw�z��-��Q�hD~`=���Z��x.�K�d�|��/㣜<"/�>೺��j�)��!K;�N��F��b���+�0(B�z�[��W',��� �0m��j�U��!��M�1��w���du�
�o�^�HR@8��CQ�2eU�4���iC̮���]�����5YuMB���y`�i���ag���QM����LH��a���L"�
*k���3����B7-���� X��},�ʕ�V��`<��E�
�m&���I�Na]Q��beU5P
@%�<��;�VD~5��r]yJ��̓1p������l�t'����9�N��~<�[�@I;#���%�M�)��Ld�%L-z�04�5�mh�����1�dX�tٙ�L	�-V�
���h$t;F�*ƈ�q)����^�_0��t�Q�+Ty?�,5�Gjj �WRJ�%2��yaF5�R1f����t�B�4����%t�.��_+G��6bo+��m��6ueN�F�*
�	Zϊ�S|a �W�"z�1���
�W�3�B���߰%5+��,D`�S��!~��$8˨+�t��H�Ɩp����.�7oGh�Kk[��(���Si�<kaM{]6�+#�zT��&�#��c�RǸ�b̞
o�2mA_��tnW!f7;3�\�^oЉ�����k�@J�����B�tN�c@�xT��H%��wP=����U�z�t`�!"7o�$�7<+�t���iHF�F�yF:��!�ĥ
o��;0����z��8_�Ȫ<�2�&���k���k�B#�B!��4��&U5vy��۞�Ax���)�`FG%����#V��g�xp�K��oЄ����m�M����׉6��D�-�x}�4�J��Џ�)��
�ğ�cC�j^����bl�Ǟj�P8�a�U��������5�t�~���1k�DPY��T�;6]Y*pW0�8�|h�2�o82
]vD��{I���^p���fI�_��w�A`�n'����B�?~�s�
��<��v�S_�I�iG��y��LڤYU�i�Ba��x�4�d\n|s�6�ZӍQ.�ϝ��I���
�y0����y+����]�#"�����|������uVG�z��T5�i��s!a'�KA�a�A�B��<���
n�Q��^�����9�)��j{�0�يnk��zp��=�c�au��+S�&����}V��m�~��7��#�������t�ӗ�^EF�!{-E{�-�v b�~F�k;Z��Z�r���9V��]�/���ؘ���yiM+q"�{q�$�J�_��9ɫ'^�=��� ��uy�F���R_Ra�ԙ�ʤ�3
�>�?��ލ�o�WG�+�/� ��oؼ㑹�xDf��s���D�3{&Gd�����\�=�!KU�sF���o�]Gݢ�F2X�#�S"˺�˚9nb���_v�C
��WqS7P�M���wT�?
�k��Q �8LN�݆��Q=�2�F�G�P��Ζt�Z�������]IdϿd4�a��$�H�<��
�sd��k��*��{^0)����d��ܰ�n���w�ו'�n����GM����e63��͝�g!��'����5!s�����qE��}������N�:Y�WyO��Q4Œ:,���8w�AOc��`9�6��Ȟa����,����4����k���H�/ϣ���6.��H����L���j�j@��[�յ�e5?�C�Qw�2�q3��3���g�z����1i>��9��6׍/�Y�=dz&��PKEePQ�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�PKEePQ%�����#pip/_internal/cli/autocompletion.py�Xmo�6��_��$�����W(�`�5A_0�!)2ms�E�����/)�Y:ml���=w�ܝ...>�-��ڕ����
I�N��ۚ*���ʺ�krw$EѲ��E��...f3�o�P���-���o�ɣ�m���P�גؕjW�ffAz���4e�U5���k��? h�h�L�}٬5�w�f�J��tJ@�X-�=����*��9R	v�!�ulY�u"������W>�_��|��7�n3�x>#��RC	�cJ�AEyWӔ|�[���[��l6[Ӎ�B'F��C�$N��;�7T?�]5J�-���
�{	���DDvw-t3�9	V�����;N	�ա�v���w��0*�.�tlXM�$8�^�����?�q����UD� 
!�2�<0�c~U�h�����۷�PH��͗_�F�L�5Sq�|=_
'�������U�w>�Ϊ�T�ri�\��F,=T�U�Y�Õ\L���~j#{1Ա�=������8e��zv,W3���HPޔ{
[1��p1���6�`0h�}c�`
��-y7֧5�`��}r_g���� &uP�� ��+kR��v�n#_*"���Q�X��#��&���Y��!R�
H��'��Ԉ��	�5v��K]��Q�@4[�$��e�R��D��hE���1�!����#S�8��s��������\����¸��j,.ql@4��	n�5�9o����h���d���[VW�Fڭ9*��Dp**0*+ۖ6��	������B�x�?��
�ƫ�r���k�䆜�x�����
d4ܜ���<�ݐ"�Qa�G����E!d��2c����|l)�g�`�E�4d_���~���5�����4�7���D�5o�9|��y!+�~2
�+]ֱ����M)�2�l|��	j-��G�>0�I�k��F{�2��|(Y�u��c�'����h%˟WڰC�CIRʣ�����D��_
z�=�@�ծ&L����su�5m�&�
��Hݽ�sVV�k��
�7d���X'�ޙB��AJ��,4q���[
�r�ѓ���l:A�'v`�"-�Z).Հ��2E5�To��H�;��Ѕh��yx$-�l܏N¦ρ@5$�9#K��w4�K����C�
[�3�L��|,2gҚ,��y�$�9J�c��:�yu+'���n����YaᾸ��8��B/�2�P3f�ŠCkvX�u7l�6wc,Lpm��VT�Rg~i`�aAFzQnm+x�� �{�:�����T�6P8�:=Se�I9���'��~���X>�2Y�����or_.���{�����G6P�ϳ5~~�iBr�4���d�Or�C;(<E	���c&�I��D��0L���P��a�����x�Eϳ�D^��x��Y�4)z�輄Az�g��F�� ���3�c��B/��@7�m��.C�8�Xh���MPDb��J�3�̇�L�cQ���������P��^�
��dq�����f����AyN7ə��-y�;�<��oV����fxu�QSHH>-�GDok:�8�J u&�g{5fHgUhD���%&����_�l����ԹG2{�?���^�7��:f�ɳfb������N^6=��%���?��}f�yx}��".�L�d�.5�7���ۮHu����5h�f
c
��K�/��T��$5�]���:w<��<6	�r������Of^l�l�Fk�1�f�{�� Uʛ�)C�\����T﷯o��P�
���e������,�$��{y��B�Ěq���†�b��Z"�8�u���K~��0W��p��W6�[sW�C� �ߍkg;O��V�i�0�y�&3|
�7�HT$���τ����6�'s���+u%��7@�s�1�K ��ğ�z��a�nľ��r3̟S��$
��&;*A����3�洓�^U3�'��L�"�!?��p^+�y�I�áo�$�q �PKEePQ��7�V$!pip/_internal/cli/base_command.py�Zmo#���_A�($��� �Q�8�$Qs'�|ip8,�]J��j�!w-�A�{�!����si����,�Ù�p��~��k���nǓ�1�z��1�~�<����~��Vr�|�g��Ϣ]*U�J�8τo��Y��$Yd�Lz��.��M�lZ_�@&��i�r�E�]�O)4ZK�s����Ċ��(�|� T�c/�#�j�!J�����‡V�x����D�v�}�<KNq0�+�p�c��6{�3�f~l�Ӑþ���y���E�~�=�,#��):�Y��d(tS��ݽe����0�{|�g�n��ٽ_�}��0��q^�0�_>�}w;�����w��J��@XC6�_�0ոظ�r��,�<K�|������\d{�>�P�Zs%�"��<�ÛHզ��B�@h]|L�c!�ۀs��E�D`��nܐO/[G��fbW��V���g[_��N�-��-�R�H���NY��Y��.tN��E:p�6"�S%7c��+�ѿ����jl!�è崛X�x��$�|�#�8�u�Jl"��Ë��im��Z��_{���8���ߝ^��,�H��j�'8ݍ�'�P~5�Yw��4��M-�A�1���1[�i,��mr�V8,rk>�8�W|�-�g�x/�[����x�k7�̢Q��pc@�}�4���?c�%���ߙ���'|t��t��Y��'ns����T�A3m�GG�s�':�)��ǺF��2��	�I"J���Z�k�!4�+�Wa�����(t��l�cf�#�#6��ѭ$�y��:�a$e�BG%��b��
�R����ypi�z�˸I@!���/��_~xk�C\Ñ�֨�j��K_D�a{%C
�f(�7�iQ�LL�6g�
��f[���[���r+�_{���	���Ws�8M����E�v���W_��2j�k�ʑS����
�O�������<Lˊ��2ɲm���l�
'-�b��Ŷ��D]z@i/�i�|�F�}�Рs���Pij��#�Ú��M���F�B�l+��&<v�()0��T����E�E�a<l8@���k��nRװ�u�G����j�nE���
-��&�;�R`[�c����4�b�q�@�.�Տ�S��>/�c�#�Nd�49G�w��:��,� 2���+*�żNAg�=!�ۋ&v1C���Y����7��1Z$Y%
VHK��k@�+�@����� �6��Am^0��$׏H���U� KR�#d���f;��4�8����ID!��4#�o��NBM�T#_sʸhfP\11�T��(��
��,�4ܺ��Q�Rqǣ�w)W7��i�(�Z���u�Q����o�����ud�[�]���9��}R�<����Q�]��%!�F	-���,����\��$F՞�j�l�+[��
p����U��*h�k�3Ă'�����5a�#ɘq�FUڿMU�3�1�M*�T�S'��M5��B]�-����*太g�3ua�~�–?�(��!��0F3l��ھ֖��wWz��b���㭆�"0h%5¦����[(X�8޶z�©�\�	6)GP_����'�I�[�B��	53Z�~ڔ��h�@�RM�<7�$˩2������4X~7uAG�%k����'6���1�fD�+-�2V�'=d[,t�\Q�S	n��Qa+��V�)i�y���1��<5=	���Hbo�o��<ɩ�{�
KX���{��PdpKx芠�q(ق	-b-ѣ1�H�m������r/��"9�ZTg�!�L);�+��b��.���Zh�fRH�s&�gސ2j|�!��#��p���8����R�y_���Q͜Jp$i[�	�Q�D���`�2��Y��ԗ�^yla�t�(
v�yyl�����ĉ�'�+���v����1W݃��1�c�xS���l�����>�[�����1������z�׿u^"�u8��l����v�9yT/Dq�Z`��v`�_����������-!)m2��2��]��(.bL
3���k��C.�w�#-7���"�m��Vơe�-7�:�f�z�������P��md-�z
W�yZ��y�t�J����l����|�|�F��xF�}n�4_�w�����{����-S6�%Q�uru
l���^)�LV��i*���3+ał0�:�"�#^��q�FZxꖮ���wY^�PB<���uY��EZAL�
O�dk��C���������
����
X�_�4��tiҸ~�%)�^��c�I�x"E-w��<����.�P�!�k���P <�]h�%���x�8re�Q%�1kt?�m(�I$���
P�ڸ�i}��EZ��rgc���LUZn�#��"�
���n+�X{`{�t���G��&߳u�7^�IvtF�d����2���v�f��78F�!o�C
�;�G�e2}�?&����Hp�'�T�\x�)���jp�J���8�O=לP0�=#[�_���ϗ����
��쉫��h|Jâ5;P
ZQ��1�$rb��/Ҷʃ�������b������\S��b�3J��rz������Ҫ����?�8����	b�B��$Dh}�
u�����Y�̩��T [�7ݿ�]�X3���}�t
*�E5o����V��_��]>�k�&��J1��}��~p4
�s��ah�*�F�.�P���pp��NU�t�L��`L�MQ<]��~\�ԛn{��g��gѣ�O�q��#���2�f�??�����?T�SϿ���@�4�Ƣx����+���:P�+Jx�ܡ3a��jl&<�Fh
耵נ6ρm��l��`K+��F�\�Pp[�GN�J��������w�eM�w����kx$⋭��8�$W!]�)���o��j{��15S��X�@[Y2�
�+�/�3��/�
�|gq/,��PKEePQvu�q�nppip/_internal/cli/cmdoptions.py�=ks�8��+pL]Qڕ�drss�O���&��$.�3S[^��� �c���aG���~ @R�x2W[���	4�F��
{�7(�a!"˫8KK��*�:/���y�Q�'R�e!E\�*��Si�di$�b^W�OiV�I�iY�i���Zn�$��I�
��VȰ�R1�q���ae=��Z�~9��<���Q����
�Z�\V�R�"�R����\}+��"L��1�紒E��iz�:��E�W�<,{�����J�4O9��̒${��Yƫ4x@�3����8�(�l��r�=�a�e��f� �$˺���6�N�"��	�&'	�R�"ۈٌ[�f"��YQ�p^fI]���ԟ*��z,�\��,��[WqR�SC�l�e	7Z�iT��R������)-�~y���������O�c�&��A�~1�o!@65SX�`��/��8ȋlUȲ��a0���ӫ��_/ϯ�zɏ�T+������EV�H�(t:�|}~5;;={{>{}q56�fe�����>�l!��ˬ؄�8�*2C׿��3~��w�.�G��r{y��m�U���Ϫ�
=��g}}y��a��f��7W޿��=�~�OO�Tms�r���_/�:������/޿\�<���w ���9�`���d�k`~�,a275H��o�ٸ�%>*��0�eٴ��"j��C��W6��`"Na\��Dv�j�L��\�xR�pFr*�.2��a3����>Ky"(5�rI�$Q����DM�yԀQ�xZ�JZ�Sc�$q����V�N�Д$���3p��D��>s�����W�>��b5�{<X���~�7��A�'q5���3O��	��:�r�ϱ��^�[ ���nܳ���,rVD�tMQ���QE
hp!&��ހL�Hs,`\�a~n�O��W���r[ZӤ�i�ˊ�lL�)-t#һ[���	��j����,�B��BQX��P�I�԰�U��2��%�l^��bƚ^�(Ǫ��z���^,ޭ�f��w���:.Q8�ǵ����"�Ť�� ߂�`�j0i�Q;e
�
7��4��M����:_�-`�s���v���#�:���uRa��Kw?�Kw4�p��:��O4�.y\�a:j:�j�c�{�4S�ª*��Pc[�����8���K�Zyc���O4W�Gwz�a�nB���,̵�4m��v���ͮ�<N�"��pd�h;'�C����P(_�uj؂�Rsע���(ՋɄ��L2Ự��{��n�Oԣ�G5F��|���7cb��(��f`�	�lH��X׳I�k7����AAqC	���7qJJ���
ueVHng'u��wS�b̧�׵�B˂6��E��dp���_�[�M�lu`d���fc�h� A��n�W3�	�q�!��D˞LD~r�~�mgY�l�����X|�@ͩ��Y���,$z:�,Y����3x˞��gH�6��ՠ�J3��Q��w.�M�ы��=�I.Je ��"x)6�.4�9��T�ʬ."I�B�R�I��(^Ƒ�d�^��ö�dLY�2`���9xo8VH��8�er�vR��4d�9�+!<�Ӵ�7bz{�dR�?�i�^Zi�y.�Ʉq�8ݰ|FfC҃�p9�
Hƴu&�4����R�I�)�
�b7ӦK��q�fe�Hk\��i��jx�<S���{�~��ٜ���E\L�!-�u��ɼ�Z���9�����<�����㸬q(|-�|���3�ҵ�W��2��c�B��m G���c�������0q�X1dX0p�`0�2����F!��X���z��L#v�ίܶ�ie�v�m}�p�Ww�۳����3�`-�|TX�WTQ�>��5hP >����)��z��G�#�x�_��G�jx0j���� �z�k�����}X���m='��9�y�jA WE-M�Y�[X7l�]�)��b�L4t���DO^c�YJ��0�pf,��[,�"r�ꂤ�ڻ�c(S��1�Uu������L ⤟`��F����h:��b̉��@-�D
2i��қ���b�U�B�BCm?�����Q>�ʽ��O⪭���L�euZ�0}as�Aº����*�����ҋE\�{�tb�tN,������b�����X	H˽�C�A͜��O]
�)�	�j��w�*��_̺`��X�v�n�="]~���dp,�{��cI-�'�rN#M��H�=����gv�(+`��,]PP?��^a�o,ί�>\1�������ӟ��[���
�|�r��";|�Gu�	4u�h�P/pL��:�#���<I�h�hs���h��7�Ӧ�5[=J=���`�l�̷��s��T��3.(p�N�S����h+�&�1!�~�F��Ӈ�2N��f9���^�}#�tЉ22��x�_�$C(�L��d&��(q�����kX04�{r���%��{[���\����&''�|Դ����a���m�y�
�dU�w���P�`
-�[4�xZ����;z��|���LX����j�R�3�M�t�ړy~�7�F��f�q�����0Z���J��󹰪$,�m�{zg�����cv��s#�܊���y�l#���C��e	n{�2/m����–Yt/yJ�fw�0�s��L�P}e�6���������?Ӫ�qM��x$�2\l~#'p��M��	�c��𶔿�K\�<�9��;>���z�:�n^�� �$�"8��i�=/�m����Ǹ��c1�G�O��8���Q��)�0�i��u�gɢÚ-���V�Y���e�O�g-��\������"���(�����45��k
zY1hz줮�Z h�(�����
�b�![q��b&/��ɽ��� � �<'8�w���xV�~��ء�h�_�m�7�xb{����E<<�J�ba�f?��١
d�&M�K��p%�xw$�(p�u��Jls�̳2��q�$Suwy~)�}�ʕ�$	I����ň�Cs��=�o�0&ā�tdn����U�a�*.I
${;r���M�:�e}�����-ɶUKJ�J>Y+��ٻ�U�)��'�k^b�q��\�����Ζ�#��Kͺ�_��?��d�K
1�hH�e�t�T�	��b���}�Ā#�/ѽbF ��IK�
6VjFy*��s9���b)B+@�کXW�����@�~��4�a�����Â����v�1Ęr��o��t��Ɉ��Aa�€�n�r��9��k>�c#)Ƣ�p�&�
fJzX20��"��/g�h�c&3�:9�sgP�ra�>�pi�Q�u����3A0^�)<{�����|�uy�{����s�	�.,�9�•��S��t�Ĩ��|�Hެ^�E\u(��`�p��Ab@�{A�oon.��d��w���"�^
������ٴ���3=�Y��*��U�D���F`�u��|�	���%�Ë6�Tl�ҿ�z�F`���1�SG�*�����+M��DY�t�I&��5ԋ�O*���{���+4bXOL��@.����R7�f�-08����1�TVp�tIH���=<[��r`�}7�7:GەP�>�Ӻ�J&3y�W�Y]8/�>��&�ʶQ�n*gCe����3B��=��@#^l>��?O@�����qL�g�������7v8jŤa��`��H��zb-�m0�6��$���m8F�6*�*ӛ���5��i/a@�O��C~xz�Q7s
�P�%w��@����sz�,��q�6��r�O�#�:M����7xH.Zi ����VJWw�7��|��n�`��9�%J�V�����
�M��;����)5bO!���ܬgh맽�j�$��吤�Cz�ŕ;�藓Y�cm�lo�LL8<ֶ�(�ّ1�,L������3�M�2e�WN�+u���*v>�ji5��=�R'��E�i���PY?��xغ
o��P۶��q�-�Ә���"�68�Be	؂#�*ʰާ�cg��rF(�X��%Č=��遶��4�v�b�*94�t� ��>k�C�n­Xb��S�c��en�%�Z�Z��w�����m%h}w��W�q�����-����6��xG�);��]�LQ��M亱���A� �D�����{.�>l,�v�v ��y����?T�t���t�^���b�C�M6���:��x��}xG�^S�P��jRbQ)1Ḓ\��d�:��I%����3,d�{|a];����Iz:/��n�g����םU�����F��x>�\�<ގ��^���<�U�U�]��#:T8�	]r����e*N�7n0T�gq���\�3�"�1.���ͣ�{�Ł]3�u���ժ��6t��:�(3�\v��ּ
�D�	�|k�!�C�P	@	�!q��B����x���~�_O#F��ڌ��մ��jg�1�j]HiV�A[�~��j�=9/[3Mţ��*��\4�����LM{��ES���a��_�Y�z��:*[������b�����K��C4����8�̔U�Ҙ��(�v	I�۔3Y˜��Vr%M?���P�����ڄ���-���	�E���n��͙�׎����^q�����Np+~T�\%N9Lُ�T|���S��
�4��|�h�f�O+ O�
���S��.�ܻ�P����Uk��]��騸��dž)ZU$;sjZ
�����6��7͡�]=�g�Nɖ�l�w��r�=���A�m9RF��eM��E���&h��-sc�G@��^*R���1��T���\d�D+܅��C�A�?�ͫ�E�bL�M?�4�\�S��e�d�Yao3B%LJJ��+i%�X���4�����=Ϊp+0���=4�{e�qG�'^����5����?�$@Z�y��߶�3��\#?�@\�G��0��
���[�BEY��?Ô`k��T�`��7�I�JAm�
�c�D,�ؿ���Y��{��c5�����}?�����ٿ��C�ߦ8­•E�7|;��t�f5�(���*U&�R$Ϯ_�"��^"�[�Y����&V(;����a��jԲ��ziW��vճ����{۸:}OK�r�Z�:�k��ݙ�.���3b_��� N��U�'|���V�M�5�0�Ʃ�t�a��S�&�3E$<h�űa��Q�c�0V��1�(=�ڝ[2X� F<x�Qd	��v�Nd@L؁��z����-��p�65ų'9�h��n8q��4���a$��{"<Q	���������q����p�kZ��Ea�r?'m���hZj�5P�\L'D�%�}���!86.�23��5�p�`�G;�-80:fe�X�)H�Fb�Dp�룂K��@i�y3��)ނ��8ִ5()sЎXѹ/��~��9f3*(}Uic�|\^\��hx�w�)��{}$�ws*��.�ư��Б|�	��x�a�83�3�����h��Þ�ԣ&l F���0VWU���pU�Bʶ�iRݠ<2�O>(��b�1�%
%�G��7��c#TL
��B����0R
�Ho`�B#��ʐ#�	��`�����#"
��KJ@�S^\��0n��ؒ礖57E��.�W�L��z�E�r��f1Њ�,�I�9P�.`��3��7~=�ے�F�ʴ�r���fr:���N��M��
�\��5���@����
�}�b��-�uŊY��Zգ̳�V���_L���<uo-xz
��ػ�۠� oW��oA��t�V@�+���L0��zQ�c�[b�����a� ��ظ��m'�_�_^���ޜ���+nvI�"#4G��!���>���P|3Fj���[U`��hUG��,��(+�@H�8�P�������+���UGv(~A�j�`��z��UD��Û�w�(��E��b21�xQc���WV�h[��4m�t�i��0%)hb�x�UG��]�����g�r�N:�T~g��h�=��W%m#9[�7�^�Vq3YB�����I��@[�t��J�w�|Hͷ$"iQk�Z�7h��N�8S�m�����5,QjE�Q����4���I	c���f;��_�oը6�8�e����)|@g��<݉pf�Ç�&[�=�.�l�����yX ;���th�J�Ow$�ɇ��G�#?�T��)s<��`J�w�K��.@�S�
?�$�Y�&�')�9��U�.��@Nmlz�`����q<�wup%�Zv
�bX��tki080��Ӏ鎭�S/J��{�8?H�G�=�0����͵���Ҙ���}r�ۑ�M�cm�V���ec�����Wgٲq���6aL�<��0���Z�1��BsH��8�����l5g��T�yM�u��!c����U��jM�I�7&���.}3BU��&SJe���*�bW*n��䮷1?���<*�"Ϋ��y]�)��
m��5d6���h_bIa��6(�Q{t"��h��k��嫼P�׏���iTH}�/����c�������d�Bn�m/8<@��r��O�'�7����&?��l�;]j�λ‘w[�<	c�OF�"�Lh</_0%���*U��
TUP��q�!����8�(,},�OԘ��Q���`3�eT��a�G��@?}��1L'���SoS���"���{����n�|y(�t����9�w$Ȓ�-�\C"�Һd�Ȇ7Ɍ��	1��,Vr�7����Co8	A����'��*�.��"Iu�����g�M�T��2��t}���Q�V��k�����x��g��na�k��M��xy0̹��?��ߧύ�'
����i��Љ��>�z���S������o�}ڮ��y������#�x�t�(�͹�~�F4	�]�nJ�`�%��O���O��"�V'��=��2�3Ԇ���ލ�!/#���2�����-�War�����ȸ5]6�*���
G�W|G��3�!��f���t��"�^\U���� |���ln;���>�"�޳��;�5��is����t0;	bZ7�~���i����qG�*}I�٘��B�Z������	Ԛ�-j*�(��*i�*Db��m�$��e�Q���ƍ��Z�ӽ6�9�f��BkU�"^Іi�=��H�R��"=\<�\Cy�̓N���,����l��g�`�u�2���e'�k���݅£��a|����{�����d}ЍD��'t�h��M��u������ԺD�,��#
�>e����w��n.�L]�~�u��&�_���~�O�q���[H0JU�__Qυ
9Ђ�,Ss��J+��:eu���Y��u�j�-Xe�r;�n�v�xs��� ��Y�����S�(���u��~�"xu=0����(�	��?SG�_�߼����L�eXV|LjS�?������-!�{�Y�aAH}8t�.L?�w�V�5��H�tr�օ���&�u�"W�D/�t�[�y.�r}�U��k�j�׃���d��|b�o�
_%h*�z��X�T4݀.˶���˦��ݫ��w�M灛�GW�6_��*��b:1�[{h�o�y�.l8��Y��d��x!������z��2(,�i�d���v�;��'�z�i���W��/����
>7��9#}��r�R;��̵`��8���V�6O���#��PKEePQ��zv�$pip/_internal/cli/command_context.py�S�j�0}�W�P����meT������������6�:i�7��9��)��D

{�����J�NN݂B(���!فH�
O#wnf�g�]����L	��J3^��.�غ���uI�ϳ�y���y���c�M5�]��a�Z�O����>��n'I�'��H<
��U�
=�U>B(�,
On\�����“�oH�P�B����4!^	<;�m�Xy0ƞ�o�q$�OeU���ܐ�-��16B�S�9Fn�<R^BՃ��0t
�Rg�|����Z� �M�����v�Z�V�I��_��<vA�j<m�3W�{\�m3{��P�G�B�KA
�Խ���Mp$�u%(�Rb�t�U�O�PKEePQҦ	x�8
pip/_internal/cli/main.py}VaO�6��_�Ud�ݠ��D��=T�!t��P�M&��׎lg���o�d�Е@�3�f���8y��9��n/�0hUˠ�d��V�Pfy�g��QU�FGU%�f�.��V����eӾ���t|�:e���y�>KЃ�
����Z�R���v3h�	�����F*S
�yr�[|�ฑ�y�/��C�H�����N��s��+�{�zJ%�ߵ-�~g�˟��U���.�����^���7��3�_D}�p�|X��1e�����.�����WT��Ty�eى��
cá��'�$�(�$�O⫏��aK(/dԖ�0�����=��G��?r�_zx������˭�N�0�l;�:��?��B<��{i:�{,��o䃃�"ך����âm�A��".kɇ�FM�8�R��e+eV��5�����8\d�x�I�{��k�$(��ZHΦa��gg,�a?�R�32g>�x�]Ս�����)^�n�]�A''�9�)�8���
EjЀ�[�2K��Or
l�{;�F�{-�5$]�����N:5���j�UR�~�B$���\��'cw	�&���b!)��IK���>3�#ǥ�n�b��1�gYs�8�yzyHeJm���"��
gǞk���YY�\M�G��=?ȭU
K�2
�Bz�I��Q�������g,�c��}���+��gj~�w$�3g�RKO��	V���,���߇�����闢��'�[���ͨ���y���"��82�|�om�T�x�X%zV��Y�Ŵ�;b	n�B�rA�n8C���VL(�7�Uj�~�����S����)�I��&.��~$&hp<fj�
�I�L�ŭ5�H�!��b�<|p����8!b��/���ɛq��@�Ç��l����U.F���c~��������c׋4�}�x�S*}k]M�U�+)��pރڎy֛�JS�WS֯�H�":�K�ps	�y�Ƨ�-�ʝS��_���?��K�����=�/QL�4�6bE3��D
��GQ�x��`0;�1���+~�X��ɓk�e
�q��N�S�jO�_��h�BZ���e���f)NO_Q5�=�uD:H��H�|��꩝�=kkz�SuDuq�H����E:\����ugl��n��p�8�z�R�S�Q���/�Q
l|]�j5?�L�,��TG��33f��*6ٿPKEePQ��!�[ pip/_internal/cli/main_parser.py�Vm��6��_18۩״�RXz��M���5�ˇ�5Fg�ԓ-#ɹ[.��;�-��mB
�I�W���h�0�
4ok��	V"��R�ڨ�4$�V���Z`n�[�Ҩ�0��7�T��+}�ApP���wY�[��e"+�Q�l*�N����
�~};�x��3���;��U�&�;X/�~��{#U�*���i�nz�h�/M
5�B��
/:�J.����JIu΢7\���6��Qi�4�nn���ct�ӇO����ݟ����.�� Tg���\����u�	L��&��`B\�>,2��E�0	S��&�ɦ�<׍�!��'�yuG�Dl�9ڱN����t��T�H��ݥ7�b�(��)�Gwb��׬�h�?�w����+؏4̣t�gUU���AH�o�и�8xv��싓�U��F-�
ˈ6+�x����Zt�煋_��.�,���kv#p ������Z���i6�������*����;�J��VI����Y��p,^Q+�w�B8���*w[����2����Ȃp��{�t�hsתǙ��n�B�i�o��/,�*ԥ�.����ֈ������w��/O�8���d�{ڨ�S�
�fB�Ĩ8I&k�ڧ���5�2n��Z�|�*;�z��+y/���
��g�к���-ON;�Ά=��ka70�vN���zn��_IC>GU*���
¦o��:�v\{�8�		��8M�rÉ��m�<�`�A*;Z��U��>�#�"B 
�lԢ�7�5T_$hK��loP����(���SJ���f��m�����ZJ���[��[;"O�2Las�*����t�@���w�v�{�6�q�=�('���N,��?Ӧ���{ET��S&yօ_5�:�E�]�R�nfѼ�/_�?7���"�����n�YܛЋ���.�_�A�@����
L����F9��%݂S�����aa7��2��'<�m�3`N��Q�qt��Z���1�5�v��o��B��N�i��';�
5G�e��F԰�
�Q�� k�ڣ�My(�	��/�8�
���&��C�m�����[��IY��:����m�:�6�3�e��4��PKEePQI��%pip/_internal/cli/parser.py�Z�o�6�pp��:���b\���G��b�Xt{8d��h�YH*�/�~3|H��<�3��-��y�oF].�����j.�R��$��].���	�m��FԵ8�fKJ�߳F�]]�kF$ۋ[V
�VpX�
�x�ӝd9����T\Q$u�5�ز�bu��֊-)��(왢 |�
�	�V��4+����=��v,�� ���VG�jv�����Aw��*ǿ����BԎ���yq˚J�\�`�Y �*�	23��:/k�+Mu��RTL��_?���ſ>�|��2{P4��$5�p�ކW��R
9G�
�j�&�Ж���6��ԍ�[�{E��W�,-����b�(k��,���_X�~rO5�J���M>��h9[/|��ސOs&_�h�2y-��v�\���o�s�|x|�7\E�X�Y���*�绛~s����l��F��Ni�QZ�m>z�z�S��Mp��N��&zZ��e��wR-<��
t����Fn��K	�f��M�x�wfmb�4�|}EN�_�CO�8F1����ub�Nه��X�l���Iw&0��7�����^�'�o�?%fA���%��h{���党�COa7�S��Dl|�r�Td�4��T��ɬ���m^�fx<�Df��
�|�V���5I��
�vzj�K�1='��_��츙���۝�s"�6�˫�}����/�Y
�rڶ����^�l���Bb��1��5�Ie�'r6C�7PRtz�͝�ɥ�
S�-�;���������|�O ~ue�R�� �X��Q�cY���$���
7���ٹ�������$�S�IJ�7��G�'�[�Ln��2w���H��oS���+"��iء���5��KĄ���\Bx9&B�zB� A��g/�+��$ߚ�H|M�@��H&׸�l���l�->M��+��+�l�.�i���=���IT4jFo��5��FKQ�42�O���c��ᩂ-͵��H�#{ʛd����5�QQo1�5�J�-����
|��N,�D�g�ʉ%���{��ItD �<�v��,�d/�s�5��Ѹ�ji��.������OV�
��u�'H>�r��8�{�^r�����Q�vs�?�>�FR���Y��9�?^��v�Գ�������2ұe5�r��v�?�
	Ф)��6p:Wm͵���q6X~k�6u�$���>7�wlC�Z�����Ⱦ8	h{�v�pf�M��M�;��R&���� ���1)H0��Z�L���_�z.C�����
RJVjH��2L!(B$��`���ǐ?HY6�k�	�El�`S^X�<i&��?�$�g��S����=�$�S0pF#�n��ZG�WwO��͏�,$/b������dˡU�<,���ohU�w�C�^��^��"L{3�2��GSPcۧo�ha��׎��nT����:����|�wFa8�u�W�xp��qjE� E@���!�1�8��9N9
�E#��!���{v�<�PM��4	�xLr��r��4�Pb�H�+o\82q��ᵫ����R4�3B�L��5����h�wP�]4n��$��JԦ���-��劘���ݬp&�D��T@t��ҳ3mi�4��N�hu61��
;�@u�-���5��m;��Cy�+Y���������=�-��.�@�4{DYv��+Ru�N��!&^z��� �#�6Թ�V�BVī"�Vp�j�'��L�R�+��٬k5�c��mj��2H^1{5V��״W�0i
�^��	�,r`�r��RV��n�o�:�r�.�G�kh�MN0���%��!���7i�F��r��?!|ۘB�o���P�(�Xae�����n�NV��'.�� �_T���u���X|
#�r5K.�q��M� ��M��Y&rL:�I:|����Y6ւ�85�T/�1/ݯ+ߓA���o�jȋ��-��p�_G�usF�)����SA��'2�9���+A\>���b��b�٤u:b�����۾Vy
]���;��P���4V��n�kt7���dLQ�8����c�)�L�
�Wk�7���&w���5���r�<�Z�/���3M�t�p��p���}:@7��ZGG��h��Q�N����r�$$��	 �"��Uu-����L1�9BD���ގ ���l1���;^F�1-`�ߣ@*px��Ϸ9lhNmN��XC.����C��N=�F��D H�_��^"�+�H"�''�6m�3�p���5MZIVh�1��_D��]���&���?Ν��4���j�P��i�^�Ao��~T�%��(n�4~"y�2��&~�'��Ҟ���z�Y:�,�LE�*��.�O/�;.mՌ0W��2x�hH8r��J�kZ���������Sa_3cak��ã"y�'�[�-�s�F��N����
+��-�R�N��<��pc�������7���xlDǶ��*�L���QI�Q��엁ɮ��-�]���z�lsoȆ9��+�A����`*7}��P��Q�Sk�	d�"xa!����f=��
u�np�����m���P�|��
�8d��:d�~:ġ1'!o���AP;c����3�e\�.�j�����r���mGo��d��ǣ���T�_��ҿ�;�ާ3�4���{
���,�5PO'�����¤�!dZ���
�f�o��t�??�򿀽��f*T_C���0�nx(u��Y����ʺZ�Rwf�O	3��g���y�k��;�Ϲ�ȓ�p��6���������o��#V�Bƛ�l��i|�^#e�1��|\��)�}�X���ٯusw��:�#�(��>�9)n�=���þM_ӧ��~TK��ܶ��g�|d91�=��6G���Ps�{G�^5b�8���p�A��I���d�׻�H�ٞ��t{&��!�����S��PKEePQd-�,0�#"pip/_internal/cli/progress_bars.py�Z�o�F�]�BA1Uh'A�Ԁ�Ik����A�3���6��,wiI-���7��C��G�W�Drgv�2�R-�d2�LU�Ʉ�e�J�Ry'�T�`�oH#J�T��
�уk9�y�.~��|;f���*3��ɂ�i&ʱ_:pt�,�ɝ�SUb-�;��T�RhOy���W2�d>?�e�	mo]�I)�"7<�^��y.j~W�-%��+#3'jYpֿ����_�/��|��� $R��{�R'�h��%7-�	̦h��ˇ�&�?�<�i�������0��ɀ�c�v9��1�^&f�~���ܴ�-Q�*����L��=��(�-e�J��c�R�R��̓�Ji뫍6b���2�
]X�N<�D���_@ω�e��R�b0���D�L$f=I2���(*E:f3�eS��F��=�_������أз}*�DYOɄܘ�a�d&�l��V�h�^��J�T���Պ�p��#���÷�Ǹ!rP<�2��҆A�j)��D+�Jhb��‚_����*-�	;�:��`�����j6vjӧ���$�}�2���6ْ8Jk9��ɂ�<�j�m�aa���+inm�dz��hў��Z�\	�ea6��
)i�c#�fB�E� �A��mA�9e�|�ǩXp-4x]�D�Qߖ�8uҷɃR
2/��>�����U0����KDs�$g�3V���m�p���SDy�{f3�')�v$w�vw�ddFV&魙2N�dmՑN�-�J�F�(���Q�(r��B���ʗv���^g�2-vV4�4L^�JxΞ�f~�ut#���]��
���\C/5��>#�C����
�	�D�Q��}��ϥ^�"�@Jn����݊�T�؇=b�8oɤX�V!��3�SM���YE�2,����D��t�,=��`�����*5lF��vN[��r)3^֖��������6�9ౠXF���M+�G�w0>r0{?;D��h��g��$f�/���q�.�KS�cSDzϞ�g)��s|�lG�|Ae�Ȅ�Ƒ>�����TVy�X���	�Q���f8ytg�:��2Y���b�Xp�LE�7�(o	��.~�@���9e�NU^��w�i*�F��6�#��7!O�|Ƣ̳R�tS#AE
�F�9]ǵ��(�i�f2���C^�Q>�]ѯ����R�F�ܸ^��vtm�����&�}�/BDI]��HNB�g�m�{laL�O����jJ]�Q�AL�G�M�9�H�B={���&SUp��nT�m�Fq�}��PU6*�ǁҽ��o�*`7�4�
.���pG����S�qXlZ<l��	"���w*�T���[����e�l`s�S-~�-Tc��]����)u���|�!� �d���E!�q��<�7cb���$�#F�B�j$H��`pM`#R����-T�7Qq�-m+$@t�#��a�u�..[�l�Tr�"�~��u��ݰ*�K:�O:6�gמq��/_�����y��<6.C�mx����љ����2<�j#����}��E��9�Y�`G����J��1���k����mD
؝h��XTK�A":ٻU[�sꈺ�|*fd	dy@hk�/�{�m�`.o�#�l��E��~K��h����-��d4�R�?W�!7h�h�N`�"Ef�/.��f�"��˥�(�s���j6�k��>��y�޿�C:���-`�͆��t}9n����?~���w��[��v/�
�������c���T�?Q�z�+
_�Ֆ؉��Fa٨C�u���=ix�e�M-�6>����̦6@h�Dz�A�Ex&�����$�z7}b�.ė�~���)���D���4ǻ������);���篖VC�R�1;���#=�\��8����7���S��c'�(OL��V�VsK�>,�9����\S.��[�7R Y�;��O�����DaMr�m6PgŖF��zs�ﳣY�o��G�j>��#��ݦS�!5�֑�?W�HcO�9�=�s�ߔ����`Z-��LR�h��pLE5�8Bi\����]^]0:!�-~vP��I�/fWʟb�qb7�`�W<�(�y���ۃJ7���l'�
u��ti5�k�G��^-f�y	���[(��MMu��g�U	?u�퐸yڣ�;Qr
G���W�Bi�8�u�H�۳"�:z�\U�mؑ�1X���\1�кP�=��I�[ɟo�A��0
��{{5��5M{��r�v��*�����Ip�ɭ���e��2tpf?C-�H[�7/UZe�=)��㺒LU�;ܵ�K���g��M�a�z� ��'�z��\��g����iF8}�4��g�j�3K�QZ=��F3a��Ls٧>���q�6����4����2���Ȇ�#��H�Gί�z�U���P��pP� e�z#�l7�ԅw��gB�H���m.Ci��Iyڤ�2�n������i�"͚K�e�[M�aӱ�A�O�=8|JM|�񲯆��&pl�M��4��!>_(�'���zvX�"�{���xh�׿��k�|^��/��V�J����_�\�C:m_S�Vn踔è�x�g�~s'X֕7D7��7ֶ	m�G�|�I�qᄑlNh����Mk�0�%�j�<��<x�^T]w�;w]�&W���WP�+�k�$�d^�^*���w�}nl��,�Д�_�������4��.��lPw��x7�w�C�[���q�/��)ۻ~���m�����	�⾳qOv��e�����w�D鵮W8%>K�>�o�;Yr
���tJ�4�B�
w������(�)�,A���}��7#��<��PKEePQ�ַ; pip/_internal/cli/req_command.py�[m��6��_A8l^�W�-n�5�u�E�t/ٶ�@�%�fWURڍ������('���,֢8Cr8����tz��&c�$͞�~8dUA6��$/3))��RК�^�kV��R2^%��;��*��$9�-)�Ŧ�HZg"k�}!�+�cIR�fRQZ�jG
~_�<+�r��َ~Ǫ�
�gu�a%k�Ч�5��*��<2��#a����NB�C��YEőາ�$�����-̲h�3*��6y2�N����W���e��l?�m[�
祴������fu�������$/��
^7 99�1A��F2��l���
T���Q]�֗��U�@?�TO�G���%���V>kYY\2��c�P�`2eIA6�r{����8NW�MK�z�q��1b�(Z�DR��HkA�n%ol3,bK�2�
���=��S>Ci��c[*����ٙG���Lŝ�Tke#��5��e�h�\�7�Q�
�\�F�(Q�����O�W��)XU�mJ���.�4F^�$-��Nk�#~�這,'��)�ެ�����{̣��My����{��:�N��;*P�m�I�0P���`N���[Э�؆�X#,��o�ߦ��?��z������H���
�ky���-��{��:.�fd�$?*���%�i�N:��9��)-/�e��1�&;ڤ���w�{��U���M���J?zZ�1���lݣ��o�H^�(���3��_ݍ��uA�~n�
����2�|s�a���L&�)`1+�2��6O�*;�4�n�Wi�Y5���\o:z$��T�Zr@����º`�F�
�uj�i�H>ݒ�š4��-��R�B�s2_����W���l�摹/�b�8���^$v d��X�~��{��o�Zt��f���<EڊR����q���k#SKp#�U��M{�����M+0J)�5�[�F!8�V�VRqV~�
�̘��FD;/X໎; �6��5���%�V\�e�$�e���
���ѐ̍t(�E@����S8�$�1ؙ���L{8(��<���pDo4``F�o����"�+܃�@�	;P�2�p#\�{{"�WZ�tU�gm�8�G��T��������=U�8� ���۞�C�3�7�L�l�6�]B˵K�����0vV+遪��Ct�T621[b�͚��q�چ�*�>=j�����*h���:5詆��Ⱦijy��Ɏ5�v����d����	���䛯��5�e�-�
2��Hє82�t촢'�@!�H+ �_!�%i؁B���ƕ������=���Y��b�r���.s�
&�����HjU�eHN���C��Y5L�l�"�62e�h��Y��`�k�#'���I��a:�� ʕ��9h��v
Z�#��Ҋ�s֞:����������?��6-6W�Y+���`������=¾�]#��y��8L ؃m�,K�JLJ�7��]�ȸF�el$��|�h���P��;`뾎)���Vl�x�e�3xp���_�6T0���p�Yƻ�����~I��q��a�����,�*�"*k<�B�_�J49F|�bT�Q��v;�48i"�+4��ok��8tR�Fb�x�"?,����Z�6��&�y�`�� TB��#aӫ�T���‚���̏�̯�p��+]I1S��E�n���'bþ��E��Z*��bI]p3x�}v��j���DЭ�?�G�evK!.tLȪ
W�XA�:&�)�3}3��<��ʬi(R��|���i����G�a��wOg-�.����
�����2V�D��U������F=�=�c"��W�>Lu.���4ތJ ^��K�Y}�a��~���:�Y����z�޼�^���Bqjɳ��^\��W?/#/����/�_���/ҋ��ױN��H����	�.#�K�Um=�r�1g"�)�����.!2�����!��ċ;Y�Y�PZ�/��;��0�5l�0Yup�ډ���험���C��7X�����˚M"U�Q����u�s/0���3�(�x��6�T�+�aJ��gߨ����
�=��U���أ�x�O1�W��@\g]��םC��4��#2�lK��*��V�{LH�o�u��5�dM��
��Gm����+D���"ǩ}R���y�{�P�s��Y��W�J�`��@:�|���f�Z�F�F�����|����1��{|{S^U����Ŕ�W4�G�I�=?)��L�B}AL��R�����[��p�+"�Y�%��T�E�TeP����W`��s�<�X:��7�@�q��z���q��EQ}��鈂��L'E�I%k�2F��t��
�Ϥ׽���ru��)]�$J�bG'��/]�ǐY�@�kT9ծ0c��=��򀁻��`�;#��unB��_2�db�
��G�@�R�ځkتr�>��}���A�㵊�c$)r�Ѯ�<���-��n}6-#3e��*]r���=g~+��s�݌�]�Q��m��@�d�iW��C���V���'!N�t;j�.f����5��H�QOơ2¢��Zt�+������3��qT[��m�,
plWq�?s�E�Սh��(�Hs��<J	��#�4>�(e[��-��펫i�� �cr{<�Uy�F��
���W�f\�CQ�؝���uX��+}�s�\tbT�$�������3��ן�yeY��7ಹ�����B&���!��!0�����	/䔼;PƣGU�/Z�yUƪ;n�KL���B�;������1ՙ���@�x�٥�ђ{�B
�_]f�:��kj�`jJE����W�R�d�%�/���3e3Lͬ����-�T��w��ď�
˒m�W��m�!B�� ��X�]9t9�C��c��}ر���~Ð����/��T���w�:��7���!3�m7{�����0$�\�yHPf�<�j'W�m&�3��<��!��#�^�]��j�1�э��GT��Z�J?P�?Y�?K��Ÿ��R���'��"<e��ku���]B��x�c���q"���a��s� �$Ƨb5�ᵦ��~��x��3�V��h��������C;�N������yjv��;x�/�wnzW7����$�KzC��G3�:�t�P9D;�U�.��ѕ���sQiO��I}�m�R�~�y<$j�
Dm
���}�qx������-ҫ�ƙC���]O�u(\=�Q�C��E��"��E��c��Y��Y؋��%�����P�RX�ȫo��$^�?|�@P����g�5$�ЏŽ?���|f��!�!ffH>���B����̣O����<��hu��!��X�	�P�ڃlϦ�I��mD�WZI���6:G��ϮJ����SwHf���s}Z����
�a�VF�
q��_�5j������F�.H֐�fx{�Tz⇨�w52��q�m�ų�)����,���}1K@��lD���q��/�+�Ռ��g����}F�� I����V�n����A9=�É�,��i��$�U�=���B����M<�Dq%�犵�l�w��%w}y�+�Ǣ�G�ɺ���ۥ�G���[}��P�&��f"ߧ2�5[�T��꺖��$�=��^�O���\�yp��5���o�'J���bp4���X�2R��KF�N��?��*��J��K�Fy<���E����x
-�Z� x-�T��op&�n@��2��:���+�B87]@���{
���$=�LiJ��ޠP ��K}�J]&SQw\�w�nm�d-����t��
~��m��YaP��U�Q��MB]�t�>l^F8b����+p@[��f�nX���߭k���4�����rh�Ƭ���d(�U�w�+���ɟ�PKEePQ��e���pip/_internal/cli/spinners.py�Xk����_A8����&i�`�Y��L�F6�b'�A�
Z�mv(R!�q�����R�%ˏd�A���"/�܇V�,MW���HS&��X��Uy�����'�уA�Ȍ��'��Y�^Xo�r͂2������;^b0X��R�I�$tnlRZ��¹F�W�/nӗo��߽���Ww�{TB
��J*/�K2S��7�/��ϓG���ȅ�ܓ�g�]�9��w��.}����雷��|�ܴ:�|=`�\9��{c'l~7�V²�ƃ	�z�Fi�y���Lq��|��sRp�312��̏kY�X1��j���R@\�јM_���b�e�tK~^�Jp��o�5v�
ϕ��m�	�p�:8�r�d8o�SL�-�3/�D4s�7�cg�[�>M�V"�����
ɞW�ن[w3��{���p�W��z���2�J�&�sV�9��͜@���蘖�8>[�M^��9&s7ϓ�?�������Б�V�p�4�,I�e��k�/W�Z&]8w}�`ع!&���=�q��K�(Y�A�������G�)fD_r�Ġ�__�.Z�IVF�͍��H�dkqb4dC��c�G=�}�$Iذ��V�~���POk�uP�g�#�a��|�9k9��� mm���+c�ر%�]�3J�0��M$��	#�(Ŷ܈V8"5O���!�rF	{�8B+��5_s��lh�*��%9��󾏇ȵ�3X�7�EfK�n��`�-׏�)N����Fw�����%*��P+U!�������	��{�K���{?D�(��K�FJO��F㋧��/7=�j����3��܁�X~���y��:��[[!�>`oށ$�W��o�&p��ʶ�0���R��40�w�	>K��A �R��8Дf��S?D%�����ێ}����G腫y��Ƚ/CF@�?
QN�"ɤ2��cJ>
(��jM_�R�ϱ����YM��ˊx3
�s)Jq5-�{��?��:���}J�����7V�3e�<^{m��FC��E#2�@���
���Ӑ�`"�ʌ��k��N��W�(U�>'|�*�4T�៞��f��}n%�K���wW��^
��~��2h �h<��LU���GM|�B��g.�</���#)uP�� ���:B.F���~K�S�	3cB�:�ȅ�{D1=֢�5�%G�7�lwWY�⯇�)WtU�ގ�I�Yp
�	4�СhS��莢�����"}'�ȓ�
�W.-���V;`(Cgh���=�Z,�l���7��lF�xMز�OT�b!�U"����|���$r��H�{�*��A.]��xT��
}/jY{��B.���,z���K::CZa8�j�w��G�@g5��#���\W6��Z0e����8D#a��<nW+�zM`�o�OִA�h}sj�m.���>�����ax�kO�72�̔f�u��[S{�|'f�(���L��}-vK�m$۪�G�%1�3��I�:��(}費
x�<A�N�8����
,z���>��~�FJ
�E>�Q3[�o@YN��gU��@ab�6He�<���q�� !�ٓ�XU��'�ހ���.u���W�pq���ؖ��E�TE�gź�AA^�F1�Mº=L#�8���-|<�bAD�*�?�X�k��鏕����ޗ�z6[c���(f��R�3�\%��ӿ|�y���}�i`�C��gP�:�0d:�H�3dj�9dT����ȳ�5s<�PKEePQ۬w�}�!pip/_internal/cli/status_codes.py=�A
�0E�s�A[�.j1Xg$���Ђ`�������7�4+����G���)u|ҫ�Q~�s���^m�8Gn�-0��n(�@�.p7���H�z9Z�:-���A��n�v�$�.�'�עi�PKEePQG5�"pip/_internal/commands/__init__.py�Wmo�6��_A�d�2l��Ȁ.]�`k��"Z�,"��T<���9�r�Z��h���s�X$w�x�[�
��Z�-�J�V��j�K�,p.y�~���RfG��*�c�6�*�F�N4�I��c�4��F�.5s�ػ��4�v�Ji9�:�۷�</Ee�n��"����}�A��3�6����{W}A\��:B!����Z;��ˋ��tu�����im/��W�~�5�ղ�Y�{+,��N*P�83�V���l+\^(cE�pW�t܄k��s�'��gi�{�G/t!����M�U�'^��y:�$Ug��Ry�dC��X�z'��?I�~�Y`,�Q�%��+��|%�f�7�t}�D�g9<$:�U�;�l�;�o#���w���?\�������۷?By5�}�0��ԩ��z�L�*,��6֌a6�\��I��խ���_�#J�fic�^���^�Bqks:�f�ǹn����5d��E<w���xl�S��RY�f�IP�~[�z�a���Y�C�y��B�.>�dL�k;Q�?)~�g�o�ׅ�Ks�2�!h#|LR�4���MXG�HRtli[Q�JȢ=E�&x���Ij���0�A�3��n���4;�6ȫ��#+�58���h�`M�ܔ�G8$q/��;J?o�U4܍��_M��#-��W�(�T-�����ƅ\�IvDl
m8o���vF��RY�{K�;�����,��q3J���e*5ܧbgIKO�_:���-�
�Ȟ��y#7��f��Z��v��2�<U��/}�3�g�Z`̘~�̀8�>���K�
��Ռ�w�k{�<�x��o��,Ѫ�5|��CS�ʧ�<)U�P�=�X7Z��Tݑ'}��n�N�E�@O1�:F�FW<�
g`J�i1�7$t�����2(�V���D3��茮�dx���-<����7\ӌ��-���Uf��DЌ'Qf��d_\�{���'��������ٜ�bSzM�c��8t�M��@Tj�&��زŧX<�T,S�;-fl�}/1P�c6�{�w�4?6K���~�<�k|gp`EG0:�8�=.���+�4�
��'�����f���:�0ha�(}���f����}r��L�+Z���L�~<*ϼE[�q.r��O��B�'��E&�zX1�¿.��
�(��J����c�2L�gg�;�m�*�ʃ��rv�9y�ο;�>���ﵗ�(*�xVPp�`4���V��Jz����1,M��{�>�Xq�����*��H��sDIy�v��z���Ńc�����7���U����x��V�
z�Y�HŻ�%Ah��3��v�9/^�����߁�;��9@x!ᵒ�y+�eD��E�b�L|�=��]��<��b.�<\~B��"��Q
o�PKEePQ��t#�,pip/_internal/commands/cache.py�Xmo�6��_Ax($u��K�"˺b�$�"dZ�m�2���]���_$�/m��C
$��{��wG�e�"Y6ot#Y���+�	���l4��ٙ[/�ł�������HZ��5�ӌͤ�e�h^�t�K��J���togs��ϑ�<�QŲ�Z��(�e�����T7
�
�<���͟7Cr�����'���Z�J�=5WRVrH�ym���Z��x�?�]��.���=�y;������̏,��|�Ԫ�5��yѲa���kx!�C�+H�&�Ir᳓.�~m��,tyM�,/�R��K漋�wb��P5�uئ�.G�l���$G	�!�mf.?jlWF��rLn�Ն�%�Ը+�M��Q�\Q?�jt��Kptl�5�A��椦�0O�`D�J���lLn�7��I�z����X7r��Ѳ$���
�t�SM5B�t
;�̀�,�jF��Z2��?�L[��F�F�<��2�i bٚ�5�l��n�]���ϓZV��
�uo	�H�ZC�m�H���m��7�`s"+V·�`<BCB�B9L���.D2������'d��-��T2���]�hT���1AE���>��a��>���=B��'�gO�)�#�q����&N�ڼX���}�� *�C��n�{2�	O֠x��+��PΠ�����!S\�`r�QtV�"$=nɠ'[=ςd��+�y��`�
���{�ӧ��?�08���D�'*!�"5�X3��eH�(�N�"�z��O�g���K��WX�����%�l�}�*ae��i+B�m?��β�ǽu�l|��l;Vۘ���OD��΃�x�V}�lOz��}ٙ�@q��}�%���6Go�
�ɛZEIg�s�z|p��cnү�Ѭ���ASg���ٜ�"3=XuЈ�FI�l+��:�ZV�d��'{�������Rۛ������&���(?�+��8�Y�y��d��<�nAl���ƤY�`ށ�o�"/���;jЙ8��a5^��W��Ћ0-}:��_���8*y���U�F��d$���ٗ��(���L�ib�h\��G!�8��.jx�VA�hR�%�j�"��ð���h�]���A��Qi����`���b�<�|�z�9\���8��/5���#Yw$�=$�Ǽ1ehT$�QF�n���dx���N�N��:�I�p6���Ǖϋ�.��� ��3C�a(��=�§�{̊	��sb_�z|���F�����\�6kqd/?y��!9d��W㾅@1�,�0cD��`&����~N��]&�j�N�؞k��2�@�ط��s��h�Va�bn/��h~"�`�1�^��gD��G��7PYl5lAi��U���Ϲ��__]���q��B���mt֘a�[È�O�h7kxY<$?�v�V/�.�q�_�T���t�,;y��E�Q ��8��-k����dmb�g���
�t��[�ŤX��^�8K�0Qa��z��sQck_򼑁���o��iz��|��,�ßN¨�ȫ����
�@��0b��L��(��P$o��U/�������y�٘B��Ά��7�m��>��O{´�_F�H��u�Xۋ�)i�á=m�R�r����O/���䑵��	�lv�\��@@u�ʲ�fPY��N8�Ϣ��,����|�٤�i%�[�׬V�o�P�����䟾%�>�28
�~m�5�X��ˇy���[�PKEePQ>|nU�pip/_internal/commands/check.py�U�k�0�����(ؠ�}.t0B�ƺl��PB0�sv�ڒ'�-��w��K�2�D����Ȫ��A��B�����
jY'�T�e��2�
�i��J��3�~^�X'\c	�C;@�Տ����|qww�k4�I�l��1{�Z�QZ��I�Zt�;6(�穧&V*�,q�Y|.Y�di�J�lH�b$��Ս��p���0�>��/���tu�\~]~f��nc��m{���i̘�π�[Im�i�[i�O�pе���8�<��A��Ja-̽]}���;�g���`4	z�,��3u��NlK�֨v�2�6!$k)K�$�@��j�XSU���1r�9�FE˜C�A������k�:��&����:c�o��R����^�(����I��K�9o���E�>>֑k��f�m+U9P����T�VD�C�&�c&8�`���O��d~���ܶ#pe�>7Ҡ�sx��l҂��8Ɍ�eK�DԻ��9E�b_Ј7������JI�_)��ֽ��P���m�ࠛ�j��Y"����fz��S�E8����
6�����x���i�ē�R���'T�|K]h
R|.���PKEePQQ���	$pip/_internal/commands/completion.py�Vmo�F�ί�"=��h��R�m��ٖ��%"�8ۮ��.�ٖ�{g0o���n�;3��<3;L��
�~�˜���R.!x)�%�o�(��VT��|��<�#V�\�&��$`nȨ���f$Q�;)>ϙ�\�QDDe���L���)�\R&�
a��&��x�>�-�M֕��ŝ?�}:��/og���oj|b{l.��F��Bֲ4�Y���,'�0~�\M����zzs5�����x�<��x&����4My�r/BN3y8�E�Hc��j��Zܬ���,<�c}��G<�Ʊ�d�?���p����g���?�/��/+op��ן�?<xxhYw�V�(}�~����¿���W�M�\�৏"��!�j���k'���A�$8�vc�����
)��z��yj��}�1���הGB�h�8	"p.�B���	��mO0����7�����m��8�sq��M�Y�C������7(���� 
�� �I��A
Xe�a4Q	����3)��:��&��
,�M8�.m��O����}���0j�I�������`���8
sQ���ߤ�(�8��u�A{�5���0��B��\&�l�V��Ǖ�%`�������D��v�{Ww'eN�I��N��)>_H�-�礐�
� �|�h',AX\���;�t�,��0Kr)M7�hS��V�^�qt#�ۓ9l�]v�)�r�/dGC�yE+mK�?�ݚ;ŕgN7���eP6M�Ʋ��2��[��}�voA�}C��
���Ʋ�v��]���2��<�~�#���y�we!�kѪ㪐��`�LJ{�����qV9���Y`O��3鹞�z{M�*���K���֟ܿ�V4~�Z��whq�2�}��*�(�
���~<B�Tڻ��V�2Q�3xF5:��H"���	�q��Z�`���b��#����WM���n��L1mu��
���+�"4��K������Zm&H��-Ȉp�r*I?s�\Ηc�Ks��BB�����P�gf�t�Lib��͐;N�PKEePQ��
?
�$'pip/_internal/commands/configuration.py�ko�8�OEa	���>�z��l6	�f�!�m�*K:RJj��;ÇDJ��b���!�P�CU����n��Q&K��x��X����F[VH�UQ�5eE�G�<��	��<�"%
�B>�B�uR7�R�5����.$�����b��,�m�kXRge���߅��W;Z�F��r��◬H�6pmC�nh���n�j�X�\�M��<R��@�uoO�2���xV�.$�,�i\6u�ԧq�ce������/~��/�?�F���z*xTm
W�C�8��F���hY�U�8��'yC�Z�Wh�W��h�R��̴�E���x��q�h��h�'��*U��k 9�<O\K�dG��&�	Z�./�pk%�'^4ke�|*�LH�O�H��$������_2%9�@K"���l��4Pdh��9�@6�@�
8��c�H �)�D%�����&Kj��Ǭ������P�~&P�jS��{���^J���`}xf.*q�f�i��"�/��(J�-�LNYW�D�L8�5I%���!I�C��F-�,�5N�qT!�l	n�JGH\+D�
���[��q
;�99�)�j�H��'UE %p�R\��r��Q�f�&�����M�+JFcF��dp}���AfJ	
GK��������d���¿~^	�{d9�H[!?��J�=,���d0�Nӧ��#�!���®l��8I�����>��V�1��`H�S�d�3�5�Km�G
����XkZ�!�Գ�s	��,fcKt�&�?Ó�+{�W3{o��\�
�	L	/TG�MD�9x��W��/?�ܑ��	˒5�a�>V�C��4��Qw�킓���\����<�����%��=�	�Ï����#���ȏ�����;\������C��d
~,S��1���yEQ��b
���M�m1]aM!BGHT ��v�Id����5[���J����S�!`?Y�z���<��2�B���5T	)��XF� c
��F�� ���{��D֐�EM�_�R=6�G��>R���ᕩ�K*���1t�u�n%�AI��8�� ���b�<���5�|Ő܉�oy�1��l[�C�C��x���%%M}�o����hݰB��jۙ��-��}�ٻ�"&B���±����!�Xa<�)�"��RM��k��fǾ0�!8�Pd��	�J�u��+u=�������P[�m)Tv�
NHQ6Dm�$�gtM#%����
�.�,�-�^@�t0��[/s,vgJ�~�Сl�:k�uz����<����C�d]	�%e����Q��D��k��DY�V�[��������o�o�{����sy]���ź�\b�j���A��/�H *������Z�EK�/�w�y�6��"��tu�W�Q����x�g
�c�8�RT�4ٲ��:�M��b�R�e�V�'�^M���AU����K�*�aߤ8:���ӈd7�FU�P;}(�щ!�,;���s����?-��(:�A�sZ��:2���S�c�`V�`	�����B��~/��=�����ԅ�1�F����5�vj�WT�F���ʣa���%F2>�	Uu�>{g�á��<�������ls��{o��-�]:�������b���d��%����|@�;se$#�} n��Ϩ7d�.�/��}f���,e4\��l~�&�6G�1���!�7��
ڿM�r��V��IyB�R_�߰��|z�'y�>�=�z����Ȍ�����R�ul��5�U�$%�����^�A[C;\1�Y`pqY˰W>��1^�!g�/Գ=�H���Q���*��HK+(�J�/&f&����T8��΋��V��2�5Ӕ��v_|G��0�d����b�aJv�5T��)���D������{�����2��J�u����i4��]��tz��vd��-�%i�-P�R]��̷I��x@B���Lس���b`�D��9���ؾ�x���p�,M��f�N4��ο��@��c�&COƟ:x���6~zGXd%5���~�ދҗ��"6��=��!_}��N��5�4�NV+���R�\�2.Ы��Jػ(�<M�M����`��nE<�P�6���m�t�%�$y�/�lM�e�	XO�[�t�=>W���S#�EK�g�
�	~�&O��Y��d#���	K�V�VZ�̹�A��	.i
#$�7�Ѧ0�����_h^Q�a�|� %F�qԮ��)X��C���Q��thn3M�(a��3Rز=�X��3�'ح)�׊nP���m�������J.S�==�r��>�ha���Z������Q���aKjJwԊ��o�P�4�m�C��p��M�~#"�QP?��+�z����!�>P�>8�=�D�U����4�sڛ�ۜ&�F��{���
(I#��Vg��]��S���6
�f[�@}:D��梇D*B�q1:b���Vx򣡇�j?���d���Z�����JLa���Wdj~#E�	PKEePQ±�tT	�pip/_internal/commands/debug.py�Y[oܸ~�_�NH&BҾ����.�����b�5Z�̰ֈ*I�� ����"��L�C"��~�x��(�'�nz�+N)�N*C؝�Mo8u_od�>�m��݆W�Ó~�K'��>�j�Am�BP��o��Z���zFUV\���q�_da�
��4.S���F�Dk�jYSV� ��ײC:}���c��J���ڽc��=���0��v�fwԮRfz
k>p_^��痗�Xz#]�Tz�ּ5��q���U��VA���GB��s����Ͽ�����/��\�Ҿ9�|� �g���ѯ_e�7�
��H�'�͊�f�ɚ9�i!�S�����
�'ѕ�Fl{e�b�d��X` �"���K�'��Sڲ=X�X,j�!z'�j�qcE�s�|}e=!�6j���n��=�����),E��y�Z���:[�X`�:{��{ȯ59�*��x�.S�d�����ъd)Y�X�d"5�:Z#��T���'HWK\������eK�(�.*�<28�S�\��B�+���j�ݳ�p��ol~1�� b�Xt
�X�S�_)�|�)��B��<�b5�eގ,Z�*2�XD�o�
�f�+�"-��;������-�eD���rE��NX�Ĭ�S|#����7�M���j�� \Bxu1J��! 7�(����]#L�Hʻ����@>�m@�@vɦ���V��6;=�p�n>GW����c$Y�-�,1e��R�LS�>��;˜E MJ�[�Ŭ�]� �:M�'<��F���
_���b-���:�*��1cX�:���*�k�V�{���#Z�5}�p����h�Dg�l�5a��Y�<��?�	]�H@/����R+�D�o^��J���	�뷬Ą2��r�m#�XE1.�Y%]��9}�&J>��B_�r�]D)���)N�K��Q� 2/��3��O�	 7l�P�xx��������3�F�~���j~׷u��`$�"1ێ[�l�9�r� �g�9� ;���U�������Arh1�1����`VU�o]��E�
�� s��YQ�N�M���@
([�GNj%�A�Zg����1O��?R��]r�'�u3�I��ۣ�d1*e�=�r�ԗ��<���_/�=�J;%3
�W���c��%�#��� ��a�
:>{�ڴ�S3�V��%[�@����dL\��	2��RĊ6x��i�x.�ݩ��&�.���.�v7:�L�Ɵ�|25�OKa�^ǣ�����.�Y6l
�R�Rpg"�ҩ���
g&���ew���@v�B�܋Y�^CYg̏��/��!7F>�H�%�3���׀k��������~Y_�$f�0k����"�=�����N��1cZ&3���km����R�V���c�db�w���F�)0���?�X������Q�O@C�a[��[��Cw�K�zڈ�@@~�v�ע6�<�[��!�@o
��9c�0P�	
ٳ�GK��영�0��G���|u�W.X(�w��Э����zD膩�(�1�^R�SN��^o�g-�pJ	��5�F�V&�r��j�Y���q��q)!�w՟�;�݃�~���n�5��SHz��٘m���{{�8���?���!�=0"�[�����
](����Xg����@%����6���|J�u���ۣ-�g�5y�&D�7��m*��$�O�Q�\�%�Q7�Q��>�L�2�rb{"�m��+��1��yE(�	������/�p+3��S��9������1�\D�PlU
�RЛ���>��Q��w�ۇB�HVg��u�c�Z�Ȟ��	/�.`�d�1V�m���3�3G�
!
��Y�����B�\���bሱ.����[��3�����)�%^�vP�Z�/;�}�1�y
��%?yy6�p�r�`ya��b�d���5o6E|�9xN���k.=)q�E��>v�N��?��t�d��oW������y��zWPa^P[}�+w6����"L��q䑩J(���nj��m�{���&�~%˔�L���P��X��m��I���!�������#�/������zcY�a+7NU0wU6T�XU�ƀ�PT���,D��g��4��������'�O��
Nߞc\8��@I��1��$��g�o|�T��{'<�)N%��K❹_�P~��u$�;���F��ogx�0�*�8$s��oI�?�u���q7��ÑX~9�����%]���8�t���%��$�lN�����黢R�cb�tV����d�����;5g�tp}��5e����?r�O\�PKEePQ�S�6"pip/_internal/commands/download.py�Xmo�6��_Ax(,��}U0 �b]4m�"TZ:Yl(Q%)�ޯߑ�$2���K��=�£)*��E�[	iJX��	�(�[
i�>��u.�[Vo�W�f��hhX��� k�㌳^QV��L��c<r�2}�TS��6{]������i&���y/���LB���(+��t�fh�6�T)Mu�P[�!���^��N���vw-i���0&�т�<��Ռ��b*녡V&9�+RYQ�����D$�h�V7�>�MC��^�{|��dZ�3b�������Sz����w���\���/&�/f?V+F��RA��#�-����)L)�K�\�'U�ཱུkQ�ִ�t\�f��S��+�XsAs��0��Μ�|n�{�`��j��Y���oސ��Х�_��7PK�*c�C��X�@��	��%�_W�J>���%w�3x� $ꯄ�D+3 Tf%�6ˇ!"�+AT��ɝ3�4���3=c���dYi�߱�*Z�jO�h�\����f܎IQ[7���a'��N��*���K��hK�\�ޓ���]�;���x=��q|D�Z�:�Q�r�)?R���� z��ewA3j��r(����G
x�2�|~2$Z��%�5$�i��U�#e��?l-X�*Z.O�q=Uv�2���r�`-�����r��|���M7��r�����L�FB�La%�3�;3Ғ�N�T���
='�b8\PK=QC��<��_?c�P�����,�b���8��	�lx�X���ɻX�O��;mje�
4�Q�<$�+��:�ZiF��\o�h~x�a��%�_���(���e@毠�
`y¶#�E<"<Mv��^ҭm��qv,O���r�n��J�7�e�Y�<El��?�Y�E�ȶ�Ь�sg�g�VM5�n2Z�����=0<�G$[�q�^O9��}/[�tB�4�psl���
���	�G�H���g3Q�yE6-�%��x�<}����pu8��L�ODH���
"��l�-2ypw?�]Y	�f�2�2"�2[n��<��T�����d��ǩ��!w��7��-u�	�2A�û�(��&e��뉮Rӎ��Ӑ���>�m����%I��S��x�ͬ�B��k�6��z0�տ9'�\8�r�_�tt���y����1�Ќ�<m�ƕ�+dx@��y����8�c�'��&�z���	�,�
���Ex��ӂ�9v�5�L>P=C����
$r�O"/d��|B�u^%ι0^�%SE��s�d��ʛ��7�c���;@�[�qK����YԚ}�[,�Ib����v��2(NR�eVA�Y��|��8���C�4��a]�u�G�����'����p�C����VGw�'s
��@
6���~�ϴ����xgO�h�=}�0zb�f&^њ�M��q\��?�D�[O���C��A��~�PKEePQi��"|
 pip/_internal/commands/freeze.py�W[o�6~ׯ <�;[�s��M��]Z4K�"Z:�9S�FRIӢ�}�������l���K�*Bi��F��W�Җ��Q��@�9��{�`��t25�Sʥ-�Hs���k 6�f�U�1�
U[��y�1�24WU�d�Im��1c�m
`:������jN�B>a�R�Y��V+��]��M���V5h�=HK
�� ��D���T3�q[���a7�D�5��N䏏�>��������˗Q��}����ȗU�+�Mm�Ɲ
n��[��;ݻ@�_1�匾����_�T3mz�>0р��W{�F�(�3�\x ژ%�2�^,��mc���;!� 5�l��'����i
	aJ#/�s1
D�Q�DFr̚5ji��w@��.@��i��1��ޅ��k�v���ێ Ԏ"x�*���>ٳ�ϱ 0�P�^����2)�$�(h�31 �����3�,�7r�$�$Ǚb�8Q�:���=�Z�x��#��Մ��f��#�;�Y��dq"]�F���vz_�ewLgq���A�����bo�ػ���rYT@|��a1Q䟅���V�H_y�u�gOJ��sC:��laVOc0*t��h��
L�q�^��x�e�\��x;2�#�����́��]�g�A�U�
A��s!.��`�F|
R�b?."�"T��,$s�
cN!���\��`����P�w\ۆ	�w�6�=3d'Ԗ	4��A(
E��m��z���#=�5����b���P����n�H;O&gv���ɛaJ���R�[�d��|��AO��Ep�E�9��%46����ǣq6k��k�N�ĥn���2�&��)~§\4���mO�bp�e��0}���A�t��c���~���MHm[/�N��N~]M�
0�H?�Vm��Rbzg��X�V~���y��3=�Ѿ�MW-�c��{;�4��аkf�53��ӓh����(�.K2�y�u
t\�|w��[��ͳ	�NM���0$��f���+�K��<�iM������4�F3�ԏ��4C���3WSVߓ���ѳ��)�kS&w3�q.��iJ�1+z�E|�;
w6��:	D�>������;&b�P�E������ٳI|�G�V>,��^ccM��/$�[�Z��]\���PKEePQ�_�#3pip/_internal/commands/hash.py}U�n�8}�WY���g�*Pަh�)��@�-ZIl)R�%i���!uq�&Ճ%�3�3�̌�{�X�7����#�d��ظN�i�㶓�4/�n[��yil�4qeB90�KZIAO��t�sUϷ���s.�q�-:�`g���x},�͇�ns�wBZ={�������]���B����u\���[�xͪΫo� �F 5ڻ�����À��z�������pxsx��6Olo�ODՃ��0c|�҃=��ox',
$C�Yڂ{�2��Q�<I�Jrk��4��M�|����"�q�£�D7�%u�%x���xb�N�M��-��⊜�x5��#�Mt
�
|��@�Y�	�iRk��;~���B�%��?�
��$��n�g�Hhe���%�����4��t�u�n���T�R�l�,�fJ><vaK��l^��V�KZ����3F�X�'���
��Ƃ�X`U�2}�괨���Z]��*�Z��a���7�KW�+eҁ��]	r�r[�9���/��6=w��,1E�U����|MW�cCQT0n⋵F�!��X3���1^E]
2�T`���)���(b|��|��aK.��mJ��]%�8����E��8�T�1���K5��d99�W���eo�B"�s��
�D�x�d�����)�����	��9�����t�B_d??�g�f��I�����B=��:�ܰ���V�K~�!��C&�=��nJ�)�	��l9�q�o�*���a�H��:��hrg^�f=�Q?��A
G���x��1�,O�PKEePQ�+*�pip/_internal/commands/help.pyuSۊ�0}�WY��>��]چ�tKB�ǎZ[Ru�l(���/��!Ջ-͜�3gF�Q
0Vz�
2���8�{�j��(*�<-tƄth$���ٞ[d�j.��]��A���[hd�\�6�k|�Q;����_��5�w���;i!����-V�O���z���E��r���V�:e�,�{�)�47C��=�(��[X�Af2|�=�l6����20�g)u��
����Q|2�C@TRQ�����/(_��x�
,�x�X�˴Uܚ�7�Ĵ릭��%�]�[��n��@����:�>$cr�B�"w)���%�
��57�Ц#�<�9-&�7������@��0�Sc�S/��
�X�5�lH�S�M�$oZ�[��]g��|8"H$�г��&<�_�q��4H�J��=�h��K�r��ԩ)KE]�$�[I�93�]������%�q��ٟ��8��ް�	��uWNU��i�㆟�'�A.ݔ���/4.轜?�$�[���JȄ��A���М|�ڷ�d��p��U��E+�PK�mW���zX7p!pip/_internal/commands/install.py�=k�㶑�W���U�8^��̅�[�'�-���Wj2�P"$�C�2Aά���ۯ�� ����IN��J$�ht7��f��;����������e�R�e��T�~�L=�MS�GYo6E��?�=o��n�o���m���U��|?�gkD�z�}�nճ}������ﯮ�\�}����۫g�;�����1n7i�E�5+.��}�����2î����UV��i��=@Q����2^e�����-��>	6-{��\��#
㾅��ny�f͆���n�j�o�NW�n�U����
�񪽐o��h���Y���@�6k;�rn�|��7s ���>ԓXqy5�e��͜��nYf؄����*s`�h�C�
�4�"��bh��5�Ќƅ�T�X�A��t/�~S����<ցH�6 H�H��ɮ_� Ь�<ky[�4�u��B�@(ޤ�6r\u6�	�����}7c]��_�w.��)�lY"�#��
��ݢg>��B�ל~#AEy�����u�+��Mwu^�))�w_����5b�Ӻk�];6G��G�4�����h�Ñn�=��黿^�5�����7�������yW4m����ӽ�'iU���^fe��=�t�e�����
��2�/�u�X�MK
4�:��9+�M����G�ޝ�k�	�`ξq��h��}y�G���]��k����DO/��1c��B-߯y��Ǻ�u�c&"Zq@��_U�^�e}���(�`���f���1���,J�~����|M�.5Ғ����ĚIf=GN�s9D��ŗc�`/'8�Dv��B#,k���D!Q;�){����������3T�]�q��XQ"Pg`V���L'�j*�!��K$m�5�ܑz`
��$���_��j��mUfBh�Q�,ZUE��dB���L�`BQ���xvu�z�"��u�E	�r����.<�x0��+�}�c�/oQC�z�uMi�f�4or��
�5�@��e�/bY�ڂ��fR�{ ����(�BCČ����&��cNŶXmq��"�R�U�g���45�ˠi]r��
�f	���ZҗN	A4q{�lصr�n��$��]+�/���>��H��&�@�xݭ�ͬ/Ov(.�|�����il�� ��T��/�!@����W/�DW������il�)���ֳ��xBW0�9�?�۾���Q}@����8]��9�!����y>u�L�K+�{��v�5�t�
8�ue� ��7[^��@��k�G�e̦N��W
���B@l���%�/3P�X}Z�����5�D��Fz��b��7M�s\�h�� 8�TX���Eܷ�Ybq��J���=D<~.��
��|D��/Sg��
a%S��80���&�m@)0`u�@�R4
��&�@w�ɐb s��-f�]R��QLU��Q��xuu���w�^��oj�/�G�e�,z˹�W^�:\��:8���7�W��^�a�u���[<�<~Q-�����\�N^�	�5u^�"E��-u#3��E:Z�q)G����<Z0��@�/F�������|�ϙ��<9���,�s�DϸUm�_�@�rD �&ˠ3)�|�H� C0�ģ
�hV����4*J��WA��������(Wڍ�{]��(d���cPu+�
zzl�)�@�k@s���V�UBRZ������b�؁'�r�1J�����N�<,����<��j������r j3�	1"\��
H���{���	+��L��L�F��w��<g/Է��'0!t&(8��(����d
p2h��\�=��k0`��g�
9������h�� �D2��ɸ��Y�3���9H����	���h����ˤL�/��Nj���y�r��3�g�Ya�O�A�eeó�0�<m��f<}�d_K�Vl*�ta�$8g�(k�I�&(ĺ^,��C	Ŕ"�0h���;��+�p�@�[�����
�)H�2p��k�kŬ��3aa8�۽�X��������2P��Jޅr���IY�Z���B�3NO�������9���ڽ�0&�Ū��!��|��$�T&���da�.�]]�^��W	"
�(Esh9nYP�21��27r�199���"_��fr�5�B��b�.������R	*u��j�I7+w'!���ZQ��w��ݟ��?y�fW�L<[b���L� �b�o��/�Hn{��ÏU�f<�+F7�>��R��6[��\Y��/�e��6�������;����n��ۻ��(V�@m\>^�-Ռ�I�G�̛�����1�B���v�ȕ���(�4gj:s������S�{f�A�P��P{ND˵�;���7}�����"�������;���\�A���_�>-iG�vv��4�&\��H5��!a
�5w�,�/�fm�D�!�ѱӨ3pt��
|�>�m���N��VS�YB��/[����X���=Qw*M�o�;��
#����X�p�g���J�{S]�G3�$�s�0�1O��9!�h��#��?M�v�p"�����ofN��I�$MwYQ�i�?L�d:�૎�3�1틺������
�O�tUEno�7�K�S}҂<�2�
�xCYK$U�6u�30WY��5���'fR��N�!<���^��:o,1�C|�d�hF�|�ޓ��\��y�ͫ#�k6�h�m
2��Q5�\�d����,�o����9_v�h�_�~�W�a����J@��S���`G�XY�Ķ��۸׎�Pa�M�bK��m(C�c�	7���A��6E&	i��"貉k���f�?a6-JH0��)��0��ko��lO���F��o4l4PJ��C��u�:1��u�B`�5�{6To[�=yG`H	�P]�e�j#���-�~K,�EFPX�PT( K>�V��x�noWGn�����j#g|K���n�J&��dv���3�1Q~�q���b����>�d���F�O	�91���ш���Oի���l�A�a�d�I�Y����q����'�|�\Z��+ᖨ�:Jb�8�<�L�$��^��7�-�KNZ9B�5�"�j��}K��(Y�X���"=k�xEL=��"�$$I#%�N��/_ڃ��L�$�,�M#��\:JAzQ��^��d~-��Q[(���
�,l�v�'0��b
)�s-W�i8���AJ�~`����P7
�1�`�C��_��z��
�٥�$�`X��Zu���
S�k�H��ÆG�#~$}E�k�;1���2���݀Z��B�v���h|OR�Zˉ��W�9~|���X��hק�<Cw/$��<0_�-O�aɜ�C����E��)D]�
��#���ז 1B�/c�[��t��[$v��;Pǰ(0�`<�U򉏡�Ң	�g�7�@~�:Uy�¸�&]�`��9{��~�p�p	��2;W�NO�r���ߠ��6>��"I��3�ty@/ҩ�#�=��}�Yg��u���zV@x�yD�xV�؈(�i��|`�롐���EM	�
b|Gٳh6���a����|�v�7�ӹr��YQv�a�� �
-~�J��i}3l�ԃ&��,m\]^1T]�[e���6�^8Qcs���w�H]�:���l�	�g}�+�~H�K��X���v��C5�X?LGw,��b�1/�>)*W�T�4���T�4 >Vj�P��8cI+���Z�a,֜M�ꢊ�';\k�>�ӟ`:U}O�S'�M�$ŭ�lu�@�k�2�
1��J"�M�m��k�����HWp�'�#r3d.�ُ�c���rF�{�����{ώ���eŭQJ�7���Fr���-3�8]�����L��@gB.�~cХV�u4���q��Ρ-=�E3�=���G�T�n�c�ێP�P��G\�	r]��w�z�u���r�[�F`���k��ޡa[X
K��i�3��-��>MN��#=4��Y����|��
QO��@�X��|/~���'��ذ��E�NM�Q-	=��"��A�=��Q��,�i/��A���p� ��Qy(n� �C��V��������nn�ۖq�s�<�Q�{��ȡ�ldM����}B>�=N�	�h�vx:���&W͒Q��mU?@��aIZ�ڒ�5\��P�[o)�<�<�q�6)��h=D*����o6]L�o��T�z���!�3!�dq�G��_ֶQ��Ǐ�4!��y=z�T��$�����B����\	�����
7�!˘P�U+��)�J�h10�n�����q�g:}ۭ`�	<EbG�/�t�a��i.��ɇG���1�S��/��B��[֠��˄��H޴:�����{�T�N������1u)��s	\�F��)ݔ��g�jT�ϙ�S�]�`m1�v`ep�<�U��,X*��ΐ �
]���_3sjB��
z�e+<dy��A�`���/���ĜRX�w$D����y��u�e{h
6��A<�߭3�d����g7 z��w�b����h��!C�\B�,�ο'y�Vx7�DSX�!ׂ�/���0U{���T=���U��o'�Z��ͼF�hz�.w��B�۹�i���������Ğ�ƴ�S��0M{ Th�ٽ\x$>TQ_!��K��
Sü��(l�s�����1g҂���Yu�^�Ӵ�꣜�O� �]�/^�P�];0tʤ<#"iU[A����9��ʂ+��ϩB0�3}�W;�&5/���[u?@ࠃ
�9VL;<�p1��xv��ǣ�h�0��3�1�XD/DYT�$:~~e��2O�93�h�T�g
]���w�����	HG�A��Lp�c�ˋCw�xo0���-�6���f�6��������jn$��0x��S� @G�(E�4H��=���PzL�S}�,�5Qj~x
�,�>�v�ZX���r2v�GC?�T뷁�WC�o���J{IN.6fWri�)ܛ,��x��=n�N�j�
�ٶm���lF�[br�l�gg����3�\h~mQ�<ўo�`S2N�Nթ��P���i���V��Y��`�x�c��7���^��gJ���!�xf
ߴ2�rl�H�bO�K`��3��5,�h�%���7�d���\�(:bp^' X"�/ž@X�SX�U1b��W�l�I�0��g��Rn�Ƅ������L����hpk^��;y7���sH��x�<�2�4у���BL�%_���7�`Xu�8LU�8�R�E�5�����&����yH~��3��?��<�e\c�R���{2ڌiAߑ�{i�4���ɇt�lREB�E,�w�[���U�f���l��;���VCdf�vC�<E���b��/�`W���6�� ��C�M�	�"~�*�!V��Տ�|W-~/���?l���cH�zMӽ�ݲ����b�[El�:D�y$1���r`\'��}����fF3oږ֕���D	�+@�Y��KUXB`卟�,�8#��픺rJ��Q�R��,�y`K_�]o�?f�-f���n�r �E�^��?��
�Oz�T��־�Xݶ܀W��^PU�G7��ĞKؑRX&�M����;�v�2P�1t%V���n�ɣ��錖$�oz��nVuF��1��a}b=i�a��Q��L-l��i���e���"$�=�HO'1,m��Y���M��+�J��h��M֠`Ǚ}%���F�f���y�9�SR��:uT�����Y�A;��^��qLް�m�p�*ى��˹����T��[���*6�dG��D�b�F�s��RfX�6S�<V|`�0q��
.$�r�r�Q��rr�ݨT�D�Em�j�=��n���3�|����;�8�ɶ�y��M�mAq�Y��԰d2��+�̡Ypp�Tй�O��>���w}}�T�J�A�*����,�d-/ �a��ho:��?�ɂ�zK}
nw{�>9i� 5U�g�/H\r� �z޵U�U��Njm4�}�9[����|�d��&�"��Jzp+ �`�Bݺ��fsK��FVu��^Q �Q|ΚL]ń���K}M�4́�tp�j	��j+�ã|��z[Ft��icA�S�p��a�(�֩}dM��Ҩ�x��Ŝ�z;yH~蛟:5���V1ݍT��!��y�*���k,������h��ў7螀�9)��Ny���/��E���= YY������?c�X��	U�B�z�t��llQ�Ó���2�)�M�y~��ո 	�گ.}=�#��(��3]��eԒD��C[�'F������@������J�Y��<�5x;]��8<u׳��t������2�;>߾����[e������Cx�����a�H�E?�{�	�Zsՙ�=.���2����gC��#���K�{��RA��#C`���
e�3%�f�@$�饭Թ�����#z��C��[���|�������|�&��`��}X�Q��D�,�%r���؂�U����?P��o�k�EW��&��	��4K�9,G�\Q{u�GB�33���Yg��_������a.Z�����'�"B���a�&)�/&3�� �](�`�*�����%��5���>zxׄ�n�\���[菔D^�6�0�;���x?k>Iwʢa0z�8���^�4��~"h��e��C��O&����W!σ)B�4��Ы?�pă�|;���뺫(F�&[-�eb�Q�ʜ�$�S��a
�2�ґ�� ���3y�<Gc��M5A�N�K��1���冦�u�#e�t�k����B�U�`Bs�DZ�ɿEB܁�<u���q5(�T1_K��z��Ձ��Q�5�M&oB��.U�6SI��a��;�"|'�O$,B�0~"�֦V�R)qC��^֩-�D�H�,0Me2��䐿gw�sf�|��[rR� �@���;��������74�r�
@�;���xϳHV3�z*\/^�`�4f��|An�+խ~�2h*-N,z���I����/f��T�k�d��脦 !�ߗ�:.�_���͞$�ʲ!��s@
��C���/�RsO�~ܾ?��8%}2�uShG�h�9�Î>�`��.����ϫ6�W�qc�V�U$����FDo��l3��L��m�7S�#�!��PKEePQcӟ�w0,pip/_internal/commands/list.py�Zm��6��_A8,^�����m���rIФ��B�%�f,K:R�]���̐�H�vv��}8#��$g8/ϼ��F������$OS&M-[��U]v-O���̌Rue���v+��l�A�h��WE--%�IQ�\VY祰K�CQ7��+uba,�Ӽ>���D�U�~�u�\�S����Ny��%������B$�!�Z���-e-C%��,y�������k�|�my���=�{=�
���N�bő?H�6�o���{�W9ڶk09�[�h��SզB��m�.��F�+�'(U��F�uG��`mWf�Y~/`��ڦkW���	EVw����N�Ғ�&=te+ڝ�Y��=6�n������տ^_�;���o��H��/I-�
x���<~��L��;�S��)��Ǯs�k�'C\$��o�k�+�q!�zdD��.n��TrUw2����#���Ѝ��oh,J�*;@X�f��̔"�
��I�-�A��9�ŵ��3�V+�ˮ@{X<�X+n`�X&9+��D�2�g�_/^)ъ;�(���x��m��V5�-����`�;���8Mw
v�+&c/Yoٍ�9�=��oXV��� �6FG��@��K-��+���x?�+cHcH��Gԯ���^����¤X����B6Y��iA��0|'?d��Ԏ�M� X��'�iA������#��A�����rg�O�XU���ZҲγ�k�-�7:p�l���hwY�v�b۲^g%�9±�YU�nl��2����b̠����mp�).'��6Y&��wUyd��8
��^@�����h����]��3@����_S�E��	
�P�
S��xY7^��KE�-��P0���j4 v&�)=�����`S�C֞�B'd� �5�:��P��?��j��P1����B��u���u�{)�&n���g١���̰c�`�b�mЮshq���|a
�T4$pHOp�zS�룆�	ViLo�݀�R�L�	����:s��r��$���Fxz�����^N��J��p/��
��(]���f��j���p�>*�'�^HI譜�x�ܨ�n�Y�wVj�f��F-�<	=c[([�oW�@˧�y�Z�`��DY���Z�3 1��&Q�VN�Nm���TCo���]�'�'�a�@��H��m
)����`��p
M��i�K�6���f���x���>=f՞��0�gzx���cj<��H��
����Ի^�Ƃ�F򶓕�k��o���K2�.��ȁ�]5S&���0!�I'�!7�K�7�X��m�/=�e&�{��o��;s2Z��p4��Z�5a��kQ�z���N��;��Ӿs��q����$��F�¾:ņ��
���~�_�#�����/��Bzӏ���O�p�
��p}Apk5;tJ[[W׍���.
�Y:c8b�@79l6�la����W�[c��y�����\�����b#
�Ѩ�\�<��y��eF�u�˩��9i��d�!1�V<��5��Ȓ=X(��

S�"������D��:!�v�Y�i���}}¨��H&�ٻ�>y*�4��K��ܻ�ە��5�Kr�7X�����Ԅ���J�/�f���ꜪƵ�)64�(�Wz���Ž����Yzw�ߛ%I�b/��'�����QK-��)�jV<?-W�Pr���b'nvFd%3����hٷn "�a���8+���{ѵ�"�g(�̨�s
V�=�
;
.P]H���{R�^�;/xG)��c�[�G�ߒ��ױb��X�Qkc�?���$�E�	�
("L�n:پ���d�|כ�:�G��ϟ�гa��Bc����@�y�c2 �]���jzQ��/�B�1.��1�I�I�ݹ�pW����y��V�'
f��.��u�"�
���[�7��{��$�X(�(p;���w��L�����sJ��N?���$:]:#�	���k�`�d�)�'�?��	zo���d"�D���b��Uˇ�0��K�Ib<+�3�w��aI�i��{g�J��}�S1�+�l�"����I��pdC��i0t��倖�9��O�H��t�:[N);A��&_ ���j��hFN��k �"���P9����ЇB`J;�Y~���=:s�`z��^��7
�,)�ú�H�K6	F8��C>�p:s�:[��n���!k�ہ;�|hb���u`g����ɉC�Xts�}yLauFd�k8��J�waȸ����K�$/�^��|5u�4'N>Dc�p��;�'d��XA��
i[z:��������\|���q��T��7B���!/�^0}�I����
.�=g���Mh3h��s̓Z �FSn씼"|.�,��46�E+ޭZ���ߦ��-6U���}kD3
��x�Q�W�;X-)�������y��U�52y��-.��`$[��=�Tj
���D�b|�����$�>6{�$7����c{|UWw��Bm���5�Ҵ;|3�SxGE$��g {;Ȯ�p�?�$�+��?�Oxw�̊?Ç�t�=�3�F/���f��`�>��͵.���
UM��,<��3�y��v�%�V�P�d�RV��+T�Ò�}0r��=�����oL��/�mt��ھ9e�a�)���`~��3|��mzdѿ�B~Y�У�����1�0\�Ù�
E�b2t�ޭ�iw�V]b�K�|�Z۞�/��xY-?#Ԥ�=��:l�����l�J 23��t��4�(ROKD0��v���O��ah��aa�+�x�[�Ц(i���ϧ�E�YX�-nY�7#�Žoh��-�x�=����1q
�z��qG"�%d�t��h����(S��PKEePQ�_ٽ�| pip/_internal/commands/search.py�Xmo�6����pHJ��ӻ"�� �ڠ~Clߵ�3F��e�����5��o�/)�n��XK��3�y�E�#y�nU+X��kj��"�U,7ﳙ]/�͆W�*��=*���mfkD,�d��u%�X1�Vyp���M�߱jUG�|��ɺ�#����W�
dwLH@���Pir�;{E�/�O�ȯg��/��q�Y�����|S�V�WD�&������w��w��Rr�����|�{r��T�`Dm��F6���c�%�v��,�+ES�ъ��0G׷�-3 ;P8`Q�v�Z9�c��`߆WL��,���s���JX���_�g��>��uqs�1%W7��'WWS �`MV����؁�Rf�Z��s���4E[1u_����fG͛_�µ��8��m1`��*ǹa*���\�?��6'�[�V�g�qY��V\*���h5�!��V5��B�xR�~��-O���9?�t�d�zb�h���Q�F�����e���NAǔ`��B;��C�ҟU�w�5D�Iw��~X�b�V?sE�v<�yE��(J��Ǩ�;�VJ"�B��}�n�]�*����'Ý�f�&&@��W�?�kq�#n�լ(���T[����N�Kbzpp`x(����2�r����(�����c�(C���eb�>���j%����`����,k�?����Z%�[�ֽ�M+ZfWlM�j�[�X�rm�Ə+9qB���y]�n)�b�Ye�c������?��T�f�K���vvL�;*����Ӛ��Z�!�b+oE�lY�,�B$�O�5X]m��^��O�n����I�����$Pg�[��Q�M|��&Hz���҆L�5kJ���)���J��Ԇ�|�H!Uu3���r8�_)��CBbZ����a��t��H28���+(�[Ԇ�r%aCӰǚ�;WbI��O�w(�]��y�Wj<AT�iaf����"�qI���Ix�¨"�����0(�
�c�>�d�&�>�!�g0U][,�_֐&>��.0R[�u��U��K]�p�����Lc�M��[W+�\�hL�v+�\�{�uJ`�ϸ�:�$'�
��	�˗�~�̝�Qt!�Į�[z%_�<�R-�0��A(���A��85�?�sݺjo�L}%�����`�,���-(L�1e�?��SH�nO��C�+�q�R��3j�+��`���h��q��T��y��Z�
�
��;�.�6���[6ƙ�v<�+�a閷�ťqd���]�מ������F^�c�DX8A�;L���尚��%r��c��j�/�zÆy�����}�
ɞ�7�l�K:.{�ی6
�b��e��c���s�P�m��t�	SȦ�댎7Y��������.Q���
L=u�νX�̳9��W�NBv�K`�$6��*���~��*[ܱÌ*>.N�� ���v	����\d{u�� �P;t
���,Ȏ>���%�b/}�]
�$X���+)YFs`H�o��ݞF���	�A

[�^}X6̠��m^����i���3���=@��Cm��9�:�n�R�q��`
�x&�{@�%�(���u:'
���������'o�I��/':9��3��5W����˱7��
��W��U�C������!��7$��;�$�~���0��W���G
i�w�8�z>Z��(�4�*�!,����S��yS�-�������F�}��"���Э:�!��93�/^�����}��[(�v���N��o����P�W�'�G��>�_]8==�xD^K�2ˇ?�V��%t{��'?�Ԭ$���~�>��>�
<$p�+�1��\�|"㜃�7����z�v�*>���D�	|���8��wR�o�P��F�a]u�t��v�Zx�[;�4ǘ������PKEePQo�GTpip/_internal/commands/show.py�Y[o�~�� �($������
��NZ�0��h��,���4[�wf(J�$;ݷc,b������!wW�GE���KEL���ߪ<�+��ɤO�^f{��
�#�iX�R�Ҙ�"y���*dF/"K�V�x�G�Py]�B
��`��q���d��V̳<�1O�7e�(�	dV�2�i�2�r%�8?y��K�xJEU��(%���z���
��ϗ�׏�c��_x�*6:�����uU��i�ꭀ�Η_~�.���)Z�|{��^L|�j^T�wc��֐��;ÝTU��do�^�P�*ni��EuGc~D	���d2�S�{<�M��{���N��Lf��<�J��	��L0(�1/���"a��B��}:�%�I��V7�s�`�J�Uq��'ஶ�SӏZ�1����E������
�O3�'�����,�QK��������l"v�'I�X�HwM���i�����H�W(�GRUag�o%���w^�;�
��K@b�����M-=U���;P��:��7<U�}ui��V$}W�)K,�Y�Y1�L�`�z���^�!(��jB��e^��M¬KiYg�ʀ5�
/�j,��!x��rC���Ԋ�J��,�H5��W^fnߣ�`�z`���Mp�H�o����JL�iJh_�Q��
�sw�f��+W���!2X�pq��4�_�SԨ� �lT����lr�S�^D�͕h�����8�ACt�	���d[#�6�_�H788�w�+>s_	`�82<QV���r[�@����i\C�
F 3yL�XB�w�����5�'3��l/2tD�V]�̰���p�8�1/����i|�����;�쯿5O�
4�l��k^>^#%��t��z��EX�&���f(4�Z4�hQ%r������lk
��1�!"�P�&i�`��M �=�!�s�jCѳ�"�t]������E4���,Y�2(��e�7Vf���0<����o~褍0��ܢ�i�H��������l�HH�S@��ѓ�p,@�z.ɬ� #�oV@v(0C#�O�h�Y��ͤE3�t{��6vD6$\8��
ah֋�g����ɜĹ�����4<�
�0R-��b&n['��1�a%i�Lm��	\����w�Y)�m{�G`ԄW�=��d��$g�����`�H��"���񁭮/���S��N��]���9�h�X��@�1J������i�^o"��2#�"%̔Q��M�:�)l-Dw(*� +����"c����z�B��i�+f{��Ў]��V	�|�E��mh�_$��������X�,2hk���~����*�Y��a�������n�7u�NG�6�?Y�Q;�SB����>��y~{�K�iN&��Y�[@
�������~h���4�9�{�=go��.��W}/�{�œ�̈́���
D��� ��l�Q�m)�s���*O����)�\�v��"�Tk������7��!O��1�����rYZ�-�c�H��}��N�؏h����pl��A��f�����^��R���˷��|�C~������p��ל��9���cd�t�"�u���^�����uU�T%��� 쑰oLO٫�����}}���xȝ�1\�'�&z����A�I�s��ek{��`j��Y⣍u*����*���Oе���ג�x��{�M��
ݤoR��UNslt��Y�9�꫉��J���婣d��y��ԣ�縥��xZ�/��3�y�=�5QD��ͶߕA��>���
�*���3Y%����þN��|ja�}y�"��AK���aqy��	�_�:hZ��^���)�hxa��0�i� �b�S��s�@�L���i�X0\v^�����PrV}�3���j�-���=K�|���1:�{6z��|�_���ntנO7�ضc�f8�������5��ZL]A\���m��p0�jH��<L���s�����Ƽ�~�u��ɾ�#R4��si�Q���ߐ����^�7���ݕ�3�S�75�N�`���nh�Y�Wѝ5�8�k��O�PKEePQ?.�v�#pip/_internal/commands/uninstall.py�Wmo�6��_q�0H*���*_�`+�Ų�@f��MT"5�����;R/�,�{1�("�幻�wt�UiZ4�ј� �Zi�Ũ�����U��jQ��2W��<��wB�XcEizŌK%E�K���W8VҢ��dY)�7�f����{�M�����?/5���d��Q|�5mc�m�q�{������/��kK��L�%w��Z+��F{��k
���Bi�+
,#/V7�Uz���>��鬤N9-��xy����U���W�U�dT�,f6%��V�rQP]�)�U��@k͞j"Co����t����C�������W+Q,,_�P�UU[Ao�^6h�S�
C�\e%7d���a�����>����R
[�
����P"X� W)c��c~V�R%���5^�Ʈ�0�	u{^z�����{�n��+	mS���l�1�"�{{%���2 Thy�-wXs��T���
Q��#���`�gZ����5�1����X�z�eC�?��` �
�#qjO�M�3��"���+2WލϋG�G9��<�tB�e�U�}~p4�k#���;%q�r�,���ag� �>��b�{5���6	�8/x��&�K��g�oJ�<=O�]�\'���Bg�e�g��_��3�J��LH��Ԥa��`b���9b���m*\�&JQ5�XE(E��/*b�R�szjsz��T�����)4�1�޸���OJ4��g(�j��ЕoZ��ёͱD���VS��hF��m?�i����x`t��n��^�e��t�wf��m�}�z�6��I�s��7):>��mڱ$����<�פV�� ��m�v�p��q�!��d�M�dy��3�831�BE���7+pZ�h�F��
9g�zf|���
���3���I���}�=�1��.��yN:����g�kv~����s��e���I����T��d_�x�[��T���wK���I֥�s��.	���<#��j��Ѱv
h�̤7
����W��o@��e�v�v���(`�)�9�7��0ME�ax��׬i,^�Dw��8kG�Y�V�;����w���>���i�Ub�<Ӽ!�]��urM�EL|��aOpo��c�P�6a�ˁ��K�9��PKEePQZ�|pip/_internal/commands/wheel.py�Xm��6����砰\���á�"
�KzE{�i�(����6�����7��_$і7�=�ș�<3�[}�b��E��a�]�������V;V���vʒ�]��e��(�Y(���U�j�A�S��f��2�kE�����.�W[����[�$�"V�Z�V�Ɯ!�5|,+���L?��Nh�Aco�̒=
�-+	���s���3(�e�������S,��[$���Z�)���k5�@G�
�R:��)	�^�"34�bV�d��;.şP��n��[ص�e�����+���	�C�Q�L���?����zs�C����}��)�G�ty�	Y��%�Eu����Z���h"����\1|�J���kӣ�\v`��T��A_vQ�"�8G��Ʋ�l��@�JrcN�>�)�^��l�K�x�u�{�����la��5����TL~�$x^���Gv�"�Hʎۥ�S�5h�,�����D��}�`ծ�lw+���\�;M��}`�A�K�����N�4X�q��x'�ńժ27lkmkn���"��HES�P��\Kn��ko��]�j�v�UJ����o�����?0g�o�}�A�I`��"�1�B����8A�eVy����؋���SEgS��Kg�������VvJ��j<fZ��Z�~��<?ñ�	�@Hx��n�ξ2'��Td���g��B�"��S<�,I�uO�;��5B�.}f@���yA7,[��k�N5p��i�՚xM>�z
���|��+����2!��k�����;��b>Ÿ杴�2y�i����d[d3�����+$}��!�0Q��,���		�J?PBձv�Ű�������Q�h�>d��U#�dm5`)���(�+�a+?9J_�Â��9=�+-漥:9����'�+��n:�d��L׶R@M�sW6�0�%�|���ə$�5�n�B�cq+[h���חr���g�����7��B-,��p)߸�]�ktu)��`���2e{���ÃNƍ�b}=(�\��j�ښ�;��sp#�=�O%��8��O��gRt��~'R��i��i]��&&�~�B��������3܃E���^��	�f�K��M%�pㅕ<V`�{�=Hպ>�,�B̾=D���
�z���%4�aƥ�  �U���喛-�`�|r���Xv���r�Uצ.g���hR/9�\o��k��Q��t��ˑv�K������B�����,#d�����~�,��q�U�k������B����u�,|nd�$q�q}l���`@J�&�$��x���-�d���N�
Ak������Q�s~bx&8)m��Nj�L_��� 7�O�qȟa�x�X��ȞHз}(2=�f'$�*�x��'�����N<PdgN�I���H�i��x��q Rl*�b欘�3H��a=�h��/X�&SM1cX%�1}�{��Vz)X�0����0�R$H�.z��m�)7Q�dr�b�~\g��E��Nz��`\2�����;)5^��K#0tGC�v��'󃩓���?����F�Y��S��^�w���G|+ڳ
C�>���1��"�V�70En/�Г�yxɎ���e��
�-Ծu0.?ΥGiC3�Kܥ"ݵ���M���{�1d�Է���le��aP�E����k�U��v� ��u�r�
���7��H�mEZ�b����0U�N���c�����~d�M�7��i.E��:���S�AStcR�u��%���V�Sw��77�[�Z"�"�V:}Hu��_��$+�Xry���7���&�gp������nD��N���tE����_F؁�_������t�dpJ�8I���Y>�bRHh��r��V���ixD�^z|�~j��3`��S
�x���'m��ķ�n�{��PKEePQ��g�'pip/_internal/distributions/__init__.py�S_O�0笠��d��`b梋q��1{"v��	�ރ����؄�k��s���R�)�|���ʋ�:CA�(�ֳu	��q�&��_"(���#���Kx>P�sUN:�ϻם�|\-����f��<A��B���i���D��������
��k},�x(�`��	!"�!�_��83�7����ٱ�+�p�!�nn��L&[t��$�O����F=溅�����BϨ���q�JYYl3p�/�ﱂ�Cf��Ma"�
T�P��W�!4(��4�8c`K:�&꼦^���%�a��T�L��Ȉ�$+Z/k�s�u>�|λj8�#�d�5�G�_�+S��9��R���PKEePQI~�Z�#pip/_internal/distributions/base.py���n�0��Dw1H�6��-��vQ� [t�U�TI��ۏ�l'n�΀/D񐟎)���Wu�5δ`�-�ja\���!A�b����J�i��.H���l�ގ�˛�v���;���٬7_�L6G«���+��A*��	�ݖ9�s5�Q�Y��d�E��D��~L_k�R�x�I�-��/���J��;�E�ĥ�\��>�e��̱�.�>�_R���U���p����֡H~����A�=BR4��k�z�6�wA6Tʗɧ�;�?ORr�v����}�̣_%9,���|���c^0 �lh��ż<h�b�ԉ�5����9:�zN�I��^vv븈i�r�1{=<ʰ�����,&6���/9����.�D;�C�aȆ"B�"��R!v�N/���@K����苷̫Ih9NH_��Q���+�@eh^��!�������ܣj�����]�F����p����N�;�.?6��ŋr�U�E��ߢ�u�:�S·:��3b��b`������}���O��츤+�1a�Z՟Ņs�����CK�`F�F�o�M_@�I%��F�v�w� �1��o�PKEePQm
mm�(pip/_internal/distributions/installed.pymQ�N�0��+F��J��*[�(U�
!kOR��mlѿ�I�����Y�2����D�5�*D��:*k�0��Y�6K���`��RC�N���}�mvb�t�|��z�~dL�鵨c�W��f-�7i=w�Rx
��9�~g�t�vV����0?`I�h����tՇ���5�+"jMr?�t�Y�f2�l�%udb4�z8�����^�606��4��iա�0@�x���O}e
뫮�OMԞP[���@n+WG����QI*��(Fw��tqrм�&Z�t�7�8>�~?�Þb�
4<i�!)�")�㟀��hEE%Fl���%2��VZ
��iG�Fq�
ku�um
��]���PKEePQ��C$�$pip/_internal/distributions/sdist.py�Wmo�6��_A8"��~(V�˺`m4݇�(XZ:�l$R#�$F���#)�d�x�* �E��{{x�m'�!��n��.%[��\P�5��MMA���j��-WR� ̜P͵Q|�.�.�LC��e�;�2�E'�4�}��B�4�.�+%՜�kt��u�dzV���7;�;�^Z�g[x^����mP���'���7�]^^\�],�ff�lA�qZS
�`
��X�8÷ j���fKh�+���H�b#^.j�/;VݠCtc_U��򫿻��ba������r�[�(�Js<V5�w��������r�:��BF�'$��һ�qvL�|m�#��١4�&-V3����H��h�Jf�.`rѱ^ې_�_�W/"2,X���ړ�Lߕݞ�v�A�ȯe���հA͆&	����f3�m��k8#YN^�<͙}ZU�*
�
��qw*��`��S4��,�OoA|gr-}ÓIr�R6ߥ�~'YM�=��7�Lid�6�5`}�\�ہn+r���z�4�֠B:*�Va��[�V }��� ���2;4��z��r�;��)4��F����Q 6�Ag�2Q?�ר�:����d™OB��h5�p�Z�މ�8����i�N�8:ZI�ixet�a�;�+H��u�z8ZÚ+lj>;���^�ߗ/Sˎ��j���R��V$Kv]C]�6d��YDű�mG?D	~$˩p�M���_�g�])�.��2U�'o`o�@��5�^��)��*$���z
l5�D$½:-�i�Mr1�o�ӇG�n\T��j�
y<
���-�1��|V����(� Q+�W�TA~$���7t�D=!���]�8���]��xax�V�]����uL	��Q�;��rF�/��?�À��8��GΗ��4v$��@�SPX3�T��iu-�,ؖ�6ޡEȢ���Z�n�\�9w�� �S'8c�7���҄ז���㫗����mR�i�%�l�#������;��͐�!V>�1[��}�z�]� �'���a���Gj	�bu���<�5�&X
���š�TLXэm={�����28<h�<�7ϸ��=�����.�w���!�y���
A58���9wy�3��?.�c8�	۶�CC���F�;�����$S���j�5(�`R���
�YyT0����V����}w��L�߂�՜V��\�pl��ص"S���谓�(2żs��(~�Q�Y�?�� .8� � i��@w#M}�O�4�]��ơ��Gq	&$[��w]�c����1ڟ���?PKEePQ��F1$pip/_internal/distributions/wheel.py�S�n1��W��%�ž�J �BQU���bMֳ�U�mloC���ͮH���̛q�m�j�	T㬏��_��NA�\)���
�R��Z�QY�5��n���Q�)�PƽSf�c��_ߋ�O.����������ݖH�@����m}EA������-
U�P�(��Q扌���0�2�����:e$�*V��!Q�������{,���ܥ����S.r����WF&@�6�;.�.�v�H���I@��:�C������S�Z� Y���SR
����@�~.5����/���?�{f�jQ�[��"J���M/����&Z�h��s/<��va�0#�!�/.;<�}Z�.8��~���e6�9��;�d��Oe듂�;���#O�8=�S�D�m�Z$q�0nG�wy&������
��+��!�Sq��9�%��v�i�_���--RG�����]�	0��rZ��߽��8�Z������t�-!�%�[��P�j���
N~#���V���!۱��oPKEePQC?K� pip/_internal/index/__init__.pySRR��KI�P��+I-JL.���SH�OI�RRR�PKEePQޥ`��@W pip/_internal/index/collector.py�<ks�Fr�+���S��.'UJx�,{�n���d;W����!	/�@�q~{�1=�@�!<ߊfzz��=
L&���V�4/ծ�w�ѪZ�f����m�|k*����ۼ�p^�Κ�N2��(ઉ������]U7*[��uՖ0�*�\�]�j��˵���[��w�ݯܷZ��j���yUeo������o�9�A�|�,t��j�i��WE~?H���4f04Y榁!���.mdf[j��;=/����]�����u]�3uu���
��)�V�$m]��2{��@��(���ߟ>����W|��%0�L����汪��eɤ��悬��$(2E噡F�u�Y���i�rE׮���̒�I�&/�u��XU��4iӚ��4��͢nY�mFW�	��`)�9�~8�構��]_��z�������d��D�[��0i�l8u|9�(�������[���wo�}wx&�5��XS�R3�����f?dnZnx\�^�,v��CP�]òj'�� g�p'1��yZ�}�g���$������}�����B쮿'�M����z�y��۝��f��)�k�{ڂ24���E���l��Q��1�����@��Bl�1��̻�wW|�g�����]]��1��4^�}�S0�愄�1
X �������a�5��Z7o�Z�X��V/S��+�ئ
�)��֋A(��cd�>S1�����:��:8�۪��@?�O�W�a�J�1Z�������ߴ5X���,��ބ������X�Ȩ�⑉��$��<	����;��M$E��&`7��<��&�S��KrS�R��"�賳������+yW[�!���z�.x����eOL��Ѹm!0��`\���#X/�%�M1-��EG��t��O
nnh������e�NG)r]�=�MԊ��H�Q�wU�"_�ӱP�^�-y�X�F�xzН�Y ���^,�{+�D$9'Jd�iw(�veЧ�[�e:0%�q���@��d�Ҵ�^`P�ؐ�Ƶ��t���n�ot��$�Q9�F��n���5}��� �R��DwV�d��	ƃe߁�w(u=��z	cc������Z�"�>�1%���'�P��U��
˃��M�����r �;�;�,�����|D�g�ep�
TI��ūo\���J>#3�ǘw}阇���,}Hsr�����hb	Пb��k�rE��(��)X����k��x���]�7d�D�
ǵ�6�m�f��5���N���1;X�2�ďYG��[�5Ĵf�v��G����!Eun�O
��,=_e�E��J��B�W�]\�hX�ꋆ�k�߀m&�Є:0�h�Ґ/�f��'�5�<˫���s��tҺ�k�U�B6n�r�Ju�P�K��ˢJ�
��Hk�z�D ���q �YZ�`�k�Wm�R/�d8oDjY_p��D�ʚ�a��-׷��l ,���#�l�V�K ��}�����m
%m~�jmѱ���F����c��Y�Ѡb ��r9�d��0Y�vG��A6��0�x�Bk�+�z�.�~Xo0�-�H�w��Ly&~9V?ϫ2j�cZ�����s	\dm����:���I�����}:����k�N!�Z��z�@�滰�f�6=�#H��L�X��/ރ��Q���U;0�P�-Hު?������ۨ<R������u��4��H@�[��@��b�Ś�B#t@�{�b��r�l�6�pl�yY�rU�����	��s��-MY����|�H�i9�ɸXT�˜�W�)�vA�{ �<�6�8�:]��-y�,EW��y�$x� ZD�I�5����r��X6)�=�*Y��\��YѝZ#�f���Ӧ*�}oz	* ձ;�
��o��4S)��0�����������ٓs��	��*P��<��O��s��
��l�)�`�^���)4�F�6h��|�<�a*��D��2굓�ԙ��B@	�M���a>�|����iu?�ۍ����\�dU���j�-�Hd�1q8[�f����a�-��UC�X���M򱘂�����A�.�
�'`kHc��P�`����oč�fQY�6�r��U��]��N�-��q��۹�0T�%�b�"[�	ŇB;�&y�eg���4���N��Md�G��Rw_,�A���-��Eћ�]Y�$�^��E��ڨ#�	�:�uW�X���������!��SM��@��n�C�B��F<m�b�c��	DWs�E�du�6h�ҵ��p��z@��
t$�&1V�)�ZV�5��H=��~�C��t��v�
ؽMW�7-�n�#g	rF�s8��We�{��;�k�F��k)���`��1��	�ۂ,�ݝ�(�ӻ��GB$�ְ�cP��-q݈�d�@�$9=ś~jKt��Ο��$�{b�$���;pJ�ȋ�g�RJ
*�d��B���SyM�q>p{��&$JD���<��&��=�X��'�k�,�D���x�-mARA��i�I�Ï�a�b��U�I.�Z&�������a*�K�!aP@u�aP,8o¹=�˪���%�q�UYZ8�0{�$�>9{ �ߨ{�^���?� W���]�)a��כF���e
N^�����6U[,�����}�5���t�l��ŸǠ�xZ`���=`?��C�R�8HUH�Y!H2�5o%Iq�X}is"��|)�;�:Ƹ/CGFNV/���sz�����rA�
~R]���@(�(��^��vJ�Y��w��8uu1W�K2�=�pѵ��V�?"��_��т�<`)��RA��S1�����+	S�P��֞=E褝� �M�e{b>�t>����	�<6�M��R��z �[0�_�lK��Eg<im!snn��h*�ެÞ">H��z��
��(��N{��t��X<��*�Ι���8�����ӓ�3o�b�=�z�r�"��"�(��a7j�(�����=�-������V�ݤsh�ZL�}K�ɔ~J��P8#�_�Ap�I�(��<��gW�П�o�/%s���Umcm≘N*�x��7�,��:[��������x�%p�m����G�NO��z�b���`pi��j��Rr��E�Ͱ��э��Km��#)�v��ɰ:2��R�n�W
,�Ɲ1I�U��7Wv�՚�6젛�m�������s��	_��F��q��9L�-�16����vUͺ!"��B�n�%<I�0S���@� �t�����u��"��5.���MU�B�B`�<��
"L{*�W����)�̦�}�
x@
�Q�Y���ۄ>D"‚ԉ�eNv{P�2N����]�"���!����6�l���,�"��`��H���9�p�-�	���z�b�_N��L}�pCJ�h��	�x-�mHT�N�<>1�L��#�l�y�K�B�j!B�،�Kx�t	+۴<���T��y.b9vr���p�'����F�5�=�$�'�6��0:t%A���#��[�������yjK0cF	�z��+�(!��������p����q9B+�XI�`Z�#�}�8-�ƄKѪl�����ng�����A35:�vd"�[�D�h��HΉ	:�
�{��g\�F��`"#�-������9���Q�P�t�I��<wHO�:"i�A�c��(}��u�����@�4G�:�>�)�A��8��X#�;��E��;��'y���kׂ� *��[����#��'�h9B�5"�;��B�M�|=��\X�Uo��[
e2�Kn����Lo��bIŷ�E�k!(���*�\��O�Le�Tgț:-
fc�FL!�_�H�C� /v1s���S��0�쟭��X���L�C�ԯvY���@L>6 ������~��w;(�I�0,�!���|s9�"<�'�f.[�ăd>�†�
,%(+W;�8����@
>"�{��I���+#k��$�%�&�-���y�1K#�%�DA�c˯��32��+8��1J���X:%}T�����
���"�cj�ӛ��c�Ⱦ��Y�>X����d��OW�bS�@hy�ti�����O�E�x�h:<g�'�Yq2Jo���yo;��'�l6�m3�?;BV_%@�>*����F�3�n�v�ų62$���Xܓ`jpg�,ww���;n]?k�"Rh0�n.�韑�?t9�k�@�֊�΃����I�u�w�����N���S��df��R�	��;��:g��б�WdB1O��9��g�=!���ӹˡ�D_�&�i�p��K�0"Uzp(R�Q�-�p�ѵ�݆�q�,���8p���C�����mnH��r� �~��J�=x��jQg(����T����8��/�7��J���u���pU�5��h����Qߓ�aSי��2ڭ.��.{���cZc8�ι�æ��j���O7����Ўf&�a�@��V��hD�>AA��mg��\���ʹ!�;�:�^_ZH;��xhm�*�Z
m+C�$7��GN;��X�t��X5/���FjL6:�R�-��۫���G,��68�e0(q�I=:�z
�(���vN#_�G�A+�{���Ѵ/;�]�Y"��„�L�mw��uYS���$��S�p�%��׃2l>���]�|�m��dƶɄ���f N�Sn��nP�����w�@A�ҟ��l/�k��K�W�[���Sے�e�I���"Fa2�V���J��2������G����a�?F�Sq%��5��bh��ID-�Df��1\#�)T��&_�$rgj҇J1R��gQe%ے�ݳ�����MVg���~�$�E��y�ou�6��v��-m�:�'�B9��'��"o-���D�bق��$7����,,����$���3�T�#c�7��׭�*��/���c����Ik�� �H�܌G<�"X�˃/����s}�1y�'tB�#{��n]W���5<v�P�v��|U��')��`z>�H�w�א����R�T���,�����&*�^M~�m��cb�g��3��N��/��@L��k�{G�NwfM�(��[ݵ��
}���r*�S����������CK�\�`=�-x�kX+�ʕ{�5���Y�<c��Ay
�j�m!���:�V)�� �p��.pj�#Y0��_�v�C�j��Tb/�t1�0VZ(8�񟛢��,��T�c��b��C>�~]cH�p�<�n�.F�=��u*7��-'��T��@��x��ݮ�h�i�AA>���RE��k7����8��sP�:0ct��sє��\"�"T1���eUcW??�v1m2���(�i��q��h��O�O���GP�{*uN���m�d@Im�����p��Qy>&�X�Lj� jBG߇��|�	��1j�Q"Qo��eU��iA�9$�D�DY)
���,��/�Q�'5�O���mz���W8\�E��;��t-[����?��1�)yO	���C�ˬh�T��f����'�����G�A*V6��<0H�/�K���ځ�����D
�t0��z��V7,��+r�I�A�A6���{S��S[n�uf���$�]��3^>?���ʞl�_N��U��D�4�{̀��Ayyq����Kۑ���3����i�{X!�TJj��SI'Ϗ��A�5��#��ya͕cK��3�Ӆ��,�<��o��	�'�+��!�FY��&�%2���[�7ݗ� �y?����U�\�w�7����=�����tr0�&�~��~��B49�BF�ߩ�ϙ���t^쐽���ցD�E���t#���x2�i�j�P��y�F W��3���hĻw{���8C�s��v6���L�azY-�dV�f�=4^��s�jQ�;,<�$�3��x��&��=S?�<*�zI�NN�ꄏ�x��R���qS�V<�YWF+Ztc)�����3!/�M�.�	~� cd+�>J�;��X4���A�A"p�L�t�
c�hf[�>{��O����R�ȓ���سU�R�}�W�:|+�=h�b�FN��]t�5{��q7��{I������Ҽ�:��@şL4��v�4X�Wv����2���0�-h
w�7{���^�?�u��2�䑼3�t�Ʌ4nC?� R��6��
�-��/l����}R��Z�c�ζz=��{�͖�{�a�sՓ0���6��>`P��b�Ơ�#��"�������-xܢ�R۔���ȳn�zг�]�,tY���>�����uzlj��?v�0�[��*<(��0��V�TPn�&O�x����{;T`I{��7���m(��?�s��==tm�gz�v���5�K΂�LE'�(@�G���t\J�I>Y�[�:w���{�Sp�D��(����'=��u�
,�X��G��G������������'�!��W
��MkC�
|*z9�b��(�4E��g^'�OjF���]��)�S�̽�A���?q��C��F=>I�0~�G��S���U�&�Y0�̢8<���ϲC�)���I�!���~w�*6S-�c�5o��Y��~?��jX4�eo��M�(2�'�|q@��E�+xG�h9��r�����A�zf�z�^�� A�9��ݬww>����y�E߼�PKEePQB�P�"B�%pip/_internal/index/package_finder.py�=ks�Ƒ�+&T\���8I��]x^�d��U�e�%'�bx�;K"���(��~��7إ��R�Jd��������4����ov]UK%Z�.;�]#^޾|>U���:>>>:�'^_K�j��榪�Ģ�ld�	u���Kq)���y�Kx�l��6��j�a�]�ke`6���S���Zt'Ͷ���\ϟ�k%��Vm�E���BT�m�v��T�z�ɂ�>:����� c�l
�m�͋w�^6m�-oKle���\T�J�j�q4Y+�eQ�M]-�u��,�r#�z��0)�w[�J�R�/�~�#
d�-!���bΎ�|)U�'�d��ry��V]�^��|U!=/w�E�=kv�~�~X/�|-�Y���<���V�-"���h�‰x _���E״���uU�U�^�f)�*�-�%0���.ѧ���U�nʮX4u�6k�=}�Gz#z��7�HS%q~�U�m����y���V�96߮l�dWlo�k����Kz6���I5&����la��]��E��N�;�`�ۭ����gg�g����ū�߽���Pw<�´��U�eQ�n�,�{�(Lf�h叻��Jt�?L���_^��x����?�����ql��^����g_9���:!�]S��\��Z%�8��G�B�y��ϳ��I֯d7�a��r-g��
��N�ʙ�ׯ�{�w��?���ȍ�P]y�s^�kɳ��R�?)��'5p>5���Y���B-��t����GC��g"a�=s�VC�x1�Ku�v�����K�b ��3�ω����B��9���vqA�l{�������-����Svf�t��5|X䣢��9�@"Nfb�G�E�{�v���U��p}��@��-[�7z��z�t���+Q�D�oM���	q�[����皃�ޫ�{� Ϯ��8��1XG�_6 ����̳,��8y�/�
j/���%��1�HKJ�U�.X2��J�x�`��%�l���'u����;Pm��)��&��x">?�p��Y�,QՂcFG�@T��`�cS��iO6UM�.�Ƣ�-C��&�)#<�F7��z3���LȮ�ԓ�#PиkoO-�J!�i�a�<j1�9x�v��o�?y
^�՟W�Î�>_���U���s$Ig�-"z��v
�pK�������i��1��(�uӅ�;
 �e��I>�v�)���L�i��N�I�t�6�g�{[@�A�Պ�NX)�ȅT�̒���w�B�?-�omH>��]�U	ZR��o�I�����y��$�{��`^G�u���3ܭ%�Ys�78QAFOm���݇�In�3%�����w�b�.[�m�4��XX�8�O V�NN����G�_�5������]�~������AqQՋ�n	FP-J��۲~��C���I�R��
L?!A��k�րTF����R\�U��	�]i��`Y���[sP\���`�)خ�Г��jQY��gSw	���u(]����e:�R�ʌ,�LC:5aCV]Q8�[c�VZ��ڙƐ�2�Զ�5@M�T#6���2�id��s�Pl��Z�y��Ŵ�W.�Ӟ��3pt�hjk��`_��81�;˱�}k������ܭ@�v]{�.+����!i��}6�U�T�F��~��:�@
"����肽Nz�䲪�v"��D5�v!��^SV]�`
~d�0鸠lt�a�a��#�`��j]u�z���/�<����쎮	��dK62Cȍ\�鿸a���?VZ�*��#Pn.�r	�°�&V���+��my�6���R�We����_��V��G��g/�o|*�K�'��O�Z�+;�����2NC,H�%�C˰LK�
U8P	��=�����vSu�SwI��z>��͞6�+� ���`��2D	��
��T��+��*���I�'�5�+il�
Q�:�@�y���͋����E������ �Qo#>�F�D�C��<��}yM�?�칤7=;�2:�h�R��
��l����R�D\\$�+�;`�H{b뭊'�c\�o�7������V�P�Ǧ�N^4n�x@�*���op��!l�����RT�W��z��5#!����V�~sm�� ��CCՓ65�*p���V��fh�����mzK8�?8
a�NZ��qTT��nF	
��-
�ϟ/�յ�8Tv�oAx��V�:�`O�����wh����j��m��4�5)բ�&�5-�%@a���\�c�)Z�?�_�<��ءl"�'�QyDҬ3����&!r#C;?�2�^�M�G=��R��%��A����o6|��6�ݫ�@�!�.
��Βv��y��'ذ��i��#�����s��.<�*-�
�8}����c�A(/�݉�ا��J�����������6Ik�'`-Q3y�6�im�E��?|@�M���cB���j;�O]I��M/�!�	�7��ssJd��Ѵ���>�T�)
=��q��f�I$�Z/.�Q��P��'��!4oܴ
1�Ĥ��Y��_�㬁?�Gb҆Ezm�)�i?O)豥�Y�F�:S��B��4E�"�ݎҕ@����ڗ�V��Qp��5;P)�u�t:��L8Kh�y��!O'͋�Ӱ�4`z��^�c:�U�0���������k�b�F
�o>�i����z�k���t.t�ۊ�[m}5o��l��X7�F��G���[&el��п�#���G�󞍶�Vzch�9Y�5��ؑ=��l����{����-������҅x�ʙ��#r�~��[d�����Sj���߂�r�v#Anw�b*||�yM�������A�m�|�.ZbzV��h���X�G:�mд�n�1�35x�M&��u���Ų�uL�����4����z[m� �ɾ��j�8�G�a?�l6�>S���d��0�1��S �2Ů־��#��lΛx91�L_aFf�j��(2�x��=�CA�}��MH4��w�\7Jj��q����1۷�H��������t@�!�|�i]�d�P��,�k�k���f�1�(���	���vB��n�W�[����D���{�TJ�R���	�h�I����Ĩ��ȝ@~
�G�0�G7e[k[�Obإ��^�J�R�P/�(=rn��:��
J(�Rjֶ5x��p�n�-F�1{�2YW�9�qC'cȩ9��K)k�A�$y_�!lH�u��4�Q�4;5hR�&6��"������RU�^�i@��y��`������R�8�/�e����(r7YVjQ��u�<�������e��r=&&�u#'�/β�K}Y.�zܬ
"Y���G��g��i��)�ՕT�8��E��t���`������-�
�{C�´���A�Q���3�e����[:��s������lJX@��q�-�s�ʵ��¶�!����4>����sś{^��U/�CE�LU�����D��s+��L�N�;�c�q�南f/��$K��Mѓm���J�4��GvWb*������ӿ�b�W�z+m�	v��YȚ�>[�����'fR2M���!~��Zn9�4�T=�LPځ�右(eRZ�H9�bΛ��?�R|�I�C��G��3�dS�J��d4�Ջr�vk:)�\�n[ו(̓�!
j��<�
$�)�é(���=����t��iʮx�كN&ca���ēC�>jA*�81Mҡ�2� m�,zv
hD�(�o���E��'B�����3��'�M�瘯�?�%1�
�hՐ!���Ԡ�`ļ^��*)C ��j��8����YxI!)���{������s�UB|�Y�$.pw�N��abc�#p>��=�B<���͎,�,\�+�5N0����ɧ��y�U`�DBJp�M�<��334m�	�i>�1�oe��O�V�Yd�%�3_��m�8�#��H� J
2�E��(��PZ�F(iF��7�ap��y��۞�	��ȫ��_b^���o�RS2��fwu�x���'�ų�ƸZ��P�o�q��,���ߘ<��ch��+���`b8����GŠ"���� �rK�E+Q�;��V#�}�R��{�/Ф�ū��w�
�RBh˘�i��H��e]�=�r���6�%�]f�ό>�����E��fZ��sL>a2�Ml��螯أ���r��3@0�mILIh��
��%g�v�nA��C�~�]Mfw�VvQ���T4d�ˑ�!���&@��?o�e o��
��ݛ)҃!x�!�����#U{{C=�w	t����R�Z�F�?�v�i@�\%��\ w0�KN(�u��y���8����2���-_��
��%�4��o|�,�CemD��%�ï˫��tpy@��sZ��H�Y��S�C�����}�[>D]���,3��n�*h�K�_�<K^d�Z��Z�MGL��#lT���.b�ގ��q���˰eR��mz ��?P�$U��l�C��1�9Đ�M�J>��dT*��"�t�V�
/�؃�瀡,=ӊ�#d�1��͹`Å�m��M~eo�f���r'LלO�~��=�g�M�r&pm���;UP$�R�ݗ(���p��яY/1��)�nہ�Q|�ofv,�$J����
�F+j�o��V�t�����rw��蒻��pS��U���U�v��$vV��e}��
{�Iy����f�L,@���
�F��w��2��
��榞!t`o�la��@;�Ǵ�ŎkC�C0���g��y�T�_���'跞�*
C����KE����7
�in�e�Fa�)T�S3"�,�we37�ľpg�Oa4�"c{�Ӿ��&�*��y���)?��uA��{�Ӛ���V����Q��w���hOJ��r7ܓB�ٮf5��Ѿ���0x��Վ�Ȑ��db$���n�%�Q�a8��3���7�nq��o�[Y'�tE�b��%˹�c*sU�����$�-:F�e+�`���� <!8e���S��*7$��%j>��#H�е�!@s�%wx��=��M
�f�(ƪ2��<�/�d�K��!w�3�+��̝&��$<�и)y�.����9b�� `�3�KlP��?i�U@e,��ժ�u*M�5�39�D'5f�P��䓵���9�����b*J���a�Վ������z"��:s�<��7T�@EП�:;��"֣\gh�ϻ��Do�.\P-�b��҄F�G�?�uަ��W�lB����:&6WH#�Ѧ��5���h��^u�pl�V _MY7WՂ"��7~ށ^�fV��JH�;�j�*(W;
Aؤ�ھ]ί!��w���$e%9�L�H�7-��Ի����V���tT���릴�kHkRxr��x�����A+g�ZӖ�y&���h0���� ��I8�U�ҩ��?�����8KV_I�{� B��N��}�K�ҹM!g܇�Q�&�0D��L-�àն���Iv3��=�P�>��4���1�1�ĭ��׬��w���i��f���,��'�}UP*�
3�S������b�.��������n�$���a���E��O� ���+���$)��P�&���mcx�\�O�XKy:�k�
3�3�w�5;T_-�fH����4�(
~��Ӹ!�E�π+�4����i9Q��kC��5Q?ω�j1�-����Y*y�[���`n��> 8��b8l�>�
&RA��{ʨ���o�������D�a�Z2��[��C��h�R�1�i�O�?Ą
�G����1� ݦ��Cv겶��o���>4d�n���%,����wR'�6^[�x�9C=ؔa����9�m@h�pq���a��a��q�;��Z	�Vm%�D����V�q�
̅/�@���J�s�Z�3�L,�!�t�<����.)O�Ft�~ʹ^���&O1����Cc
R@M�|�񈘁�K���J߮sAMm*���c����Ta�Ǘl�L����q��v��f
��fʐ$�?6O�J��GK�M�F�t��'��� ,F��O��?�w�?��G�i�$j�q�?B�����Q��C��V�DG9�
�"�.;�J�Շ��/�`�us����\!Xp6�g�b-*���_(���=�(y�CQ��Y�%Y���Lf'��4&����)6s'L��	�h:�r�V�����éU(�R��O�:3�Q��Ȳ�s$��
�I8��I@9 �&V�����?�ޜG[u���PQLL����b�;�D�a�1|}�����,�P��mwk�[0��t��01���84�_Rz|���to�pM�b�zt���:-咈̂G)�<����^����#]��#{�<d��$Lj����G,��1�w ���)t�_7���.��&%v.te��eP��������+�oC�z[I�����~c�h�M`=I����|����	�=h`<s�� ��ħ�@tWɟ��;`�q���)���.3��Y�,7�R��c���*�g�@�C[Q)]Kĕ+L�2�>g�2���aI�H;8(�5a�)�������#gr�|?�#+��pn*r(:Q͕0T2��/2��e��4�{Õ�k}�YiSФj��..�U��[1}a&���9�FX@r]m���ݰܑҿ�����R�/t}f�3\Y����B낓\c-��:x�
�D�|���%Eb�5����dn��a��R�M�tw�����H��ʱ8��5��~�F�R�G����$5#���U����%�.���ۘ�R�r��h�l,,S�+.�@�PzǭX7~���w�W���m�W�u��DWw
�W��s�>(��7ދ^8rg�x�3�����`���pY����"�^��?}	܋"U]�՚�Cpt�"���Y��a��p5�O?ػ���b�)��W1����*�A_?���$��S��h�Ç36���q�Jx�pIQ���RUaC��a! ��*�nƞc�:S��Q#�<f#:u��2�ݖ~2ZsHA�n�w�>+��1S#�w���%ERF���̇�J�;�U��xq��l%4��l�-X��&
O�e>�U?x�G�=�:+�T�P&��1y��u�k��c�1���ۀ
��T��9�G-2T ���_P��˻���O�e��f���D:�u�,b5��	0�h��%b��{5w�&?��M1@B����{٦|��j�s1;�o������v��@7yT
!-�R4^Ix���*�������8����Z�\AP|Mpe�4�AƯ�RtX�
���V:��� }J���r�p�f� .���7�V��p�\T�P�HZx���2�S3CG��oI�7�At"xR��cD����-���}9"��cӟF�{�¢�xZH����eX�A�[�
����<�
%�s��s��o��
��6��\	���;��>u��ʃ�#�G\V+�X���4ZZO@����n��3�m���J���&\�)o��'w�o"���ɾ����ԫ��)�*��UT�!�=Z�
&����xL��]{aXr�e{HX� /����8��~u�;��m��>� �3QR��◮&�Ѵ�r��~��7�?YK�a龓�!)���ה�$�b��J͘��JZ|�f0�ņ���{�e��-�U��=<����-�c�)��(uWO��Y5nқ�e>�����-�1��{�k�1�ё���]�L�񨻸��S�g�����\��o�'.��j+4�l�3
���8ˎ+ex����,�_α��Xd^�1gA��y�@��۞Jc�<���?��W�r�DBP���v�B~C@�Ma����v�Ò�-w�wòW��q�A#�hXl���(U��i��Gw&M��[T�!���}�9��H3��k)��c���ޭ?�E�����7�'�a��p�"h^,@��8�o��\O�y����/};��D��)�x���qP��gڳ�"��jCg�>�x��S��i����
БjxX�X����Է}3Zzk�A�i�nB9�{��i`k
N��~(��1��k�/w2,�.�]s��`N����U�7\4��+�+�)����[�Ŋ���"Y����Xhl�[�aHx&�t@t�"��Y��6^��#g�rMT��IלذU�a	�cr����ݛ�on�C՟`�I�������*�G�,��Yma�a�=�A5}8žv��ur��N����N��~�`�ʶ�B�L `i�@�;	CW̴/��H�,>-�p�(C8�Z�H.=5&��O0�8�X�B��V�5!%���K�EIR�g�	x�t�%c=�
&4��赾~DETE�7!�{u��Oh�	��Ne�d�V�Bwy|���c��?qlZ#jr3���ι>�"���A��(�R5NI��s���	�v�F�iPK�i�4��uLQ��VI��X�(w9:�7�Ou	�Ǐ���VMS�e{�00�-z�{����&w���f�5{����l�
�_Tހ��/��ɍ�	�i0�rabSZ�X�Zs�bEm��SbƤ�Ԩn״��κn�����J�W���X����C)��vJ���+�݆*[yj��c�'�Q(�|�o�˥4�O���FĪ�s�:r"�Ox��2�2,Qa���z(\]�	�=_�� y�<&K�%�A�:������g	�ly}d�!�8C�G��}2#���&gb9O�-L��i|W�nA*7����u=��U���`��-o�/@�k�3�18��QA�PKEePQ{�(�;? pip/_internal/models/__init__.pySRRrT(HL�NLOU(�H,QH��+I��+V��OI�)�����(qfIfj����PKEePQ�,�b��!pip/_internal/models/candidate.py�R�j�0��+��!6���P�Х�!�-�R�X���$$m���6�.	�:ȃg��7�yۃS��G4�����Nn���G�AY�w�Gp�����t��2����ҁ��E&�5>ˀ���ު'e����(L�ۇ����eu-�W믄�n��t�wk�ҏQ�Zep��n�ݤ���2�2!J�eL=VҴ���%������ǀ&��lL���f�S���5��d��� 4��#e@Gy9�|�cq�](��U@�1�c=�\=������=��ʚk�x	kk��f<�J4�g���n�;S�����(=ߛ� 9e�}��<`5/z(����f3���`�f��_jf�b�x��nԯ=�iУ�K��&{K�c�{���V=�/Nw}IyZ�^ƹ̷�e���?�=�\�,/L���1����PKEePQ�׿�-�"pip/_internal/models/direct_url.py�Y[o�6~���>H�"�{��j4^�ɂ�	й��Ht�F�4Rv���;�)R����)u�s��ᥞ瑳�����y^�ͫ���(=�כ�rN*VE�Y�I3'���\�h^.��<�ٵ^\%\P��ȱ��e����H�hQ�\D��bō�>y�>~���͟�������^�M7�{~R�+��������1�L�s������=$�UE��˄����
z���Y�y@��ߌ��w��p48����d+��q��1xa\����2����8�i�������?�}��N�{q��A<��Ã����5�q��q���6�Hj��v�Iβ�r^rk�����s��[R�t���s��y"�&�ޥTF2P��`5petJ�Z�YH�]�4�k�[
ـ�d��Ӳ�
珘?zH|��XԐ
H�Def<����% ��oe�罥5Y&��*Xd ��I��,)gӕ�Jj��� ����	+Hvh0�i��[���>��2��Xg����	�A+ҝ�KNX�ц��%�e�A'X!�H�/��D9�O����u2v�?�2Ú-���)4����C�E@�'�+�D�ɴc��2蹣&ĒقP��0?��X9y���Ή��{߃�����/�U*)&��(�z��u��A_\N}+���n76�bac&�a���@�Yp 3.Pj�T!!��NL��ޜ	��d�rJՕb	�f�-S!G^:`AN�&�y��f@��z��kt?ʛP�_L�Xٙ��:�S�C����ϟ�~J��Z2�2g.�u�;In��t�4_dLԪ@#L�k��=$K��[ps��F��s�Ӷ�f+h����!m�,�9����E��s@`u��4���X��Mp��F9N�m���@V&�K�e!{�����&�(�嗳Ɇ�8�Ռ���P�_���<.t�.�	�5�܎�Rl���ޢ6O�\����zVfm�q��~�C�3+�&d.�;�{��6�l��Z 7Ug�
��!��mFڀ`���Ymb���,�rn��`�u]�v%t������X�]�*���M��ֲ��8�o-7�d��"ږ?�|���+�;*�	i�^���koIOh�p��=�W!(��O�[��J�N��F�|KK�&z�}�ڞU}�xBFi�j<�Ora���,����P�OV׿v�6Xk�H�^൷,����`�s��.yU��|��Gsȕ|��+#�X
���n�-�FԂ�[�Z��k��{����V�%_=�ˀ^p��dy��K�
/�֧�,��,'�z��\�:/S�ސ��Mi3e����{��wŻ�j��(\b|�
�!���*g�*B�2�������&B�98��u�6s�jom�eO��-�}�3�7�����72���P�5���e���.�y"/倚�k�nA��O��I�Qŧ�g�Z�o����,��B4���%i4�i[o�d�,��&ΰ��u���l�`=��yi
�╬�+��ՕUVpۤ$M��m�&��"�b3�L���T,�]H-zT4�>pjk9�Ԩ���7�ZJ��R%A�3:��46��z��\�W�xʓ�]�Ȃ���R����L;{�t���n�z�߸��빛@�/4}��Iېݢ�;LuO�Nu4�T�
k��}*rV�o�F����D�Q@+��{�{
:�٭v�1ǟm"��C�yz�$b�P6�e�l��f��&��n.m�ڑ�m.�X*bܶx<INt�K�9ЬUp>V��ĮMr+��*?��e�	_n̥��;x#]���Jt*�-y�ҕ�NY�PKEePQm��?�&pip/_internal/models/format_control.py�UQo�6~ׯ���PYC_
x4k1,6C#�c.�T�4�ߑ�i�V�PT�D�}w������vbW�T�6��7��N���wBZ�N
WZ��K�
��f�&�
��(.k����	��߅�:���h3����qG>|��3����w������W�e���,�2�'���$���t\�
}fY�Hn-\j�qw��3Z��?l\9��y��
l�J>�����[�l��@zv�A(블���,|0f�v�1X�u�4���Ǽ�\+�x���[ܐ�P�1VX��
��J+�`�V����S�+(\S��֙��
��JX�"�16��9n���+ʩ�$�y��?�r�)~�NMR��ߔB�	�n�f����=�Z˔G�3U
��3ڈ�2�͠덢���n'�Cj�6����~�i=�v\�����g\�V+�;t�93�|_�z������÷�=��I^Ѧ���S������8� wf3���sO����鹂��2��YM�Iύ���1V�Ŗ�ٛv�	G�R�8�t趺�mI�$��w=���Q�-��˞��qs��E:�ҠaaX�_�S0k��8�n[,�����b��)I�ɗK���l�˥��𯃀�_za��;�
z��u� �L�FtLn'�+��MR*+j���w"ٟF�F"7Eڽ}�m�-F�t�E�#]��U���ho��Mb��%>u�H�U�=ž+NC+l�M����m�]�-,h4-�]�8:����P�Adf��Z;.�Y�M;k�������_��?
]�B��l���_��A�|��O�d،SBˌ�{l�xюBㆠ/�H�xɇ	���
���kuo̟��F��8��Si����ŀ9i3�/�F�ys�9ŜˏH��{s�x������7��/о.��^P�$ϱ��T�ϸ:�{��PKEePQR�
��pip/_internal/models/index.py�SMo�0��+F��Rr������V�U+ˁ��ul�3dÿ�1$4�&��`�߼�zn�?B0�R't���su�'���֚�c�!�H�`�V��e��D���~�������f k�Z����1��"a��v
��O�A�d0��kJ� o��ʔ��Rd=�R���\��א;d��d�dlQ]���d�����F��>JF��Gm\�{
�`+��3�TAh�u�|
w\.���<�BA� ���O�p�P0�
������A�T*��T�t2O$�)XÅ�����;�V��B�]qi`�O�F>pJ��rӉ���#y1�VfϘ�����=a��|�?�8bm-%�~ؿ�0��Y:Sw2� ��ό�i�Z ���0�'��;RA��
��z����ã�%�_V}g�Ҁ;�7�Y4f�N2�dT�|�È�G��T?�&W=\���p��;�@��&M���}��U�n�$��λ�c��yVf�H�}T�m��z~�/PKEePQ���U.pip/_internal/models/link.py�Y{o�6�?��R*�b�>\���Ũ���^�۪����%��z�����Z�)�Ebk�y�f83��M.�&BMR���>�T���&����y�3�M��L��̲�T�T*F�"v92�]��k&9��B��
�i��.g���������ק��~��ܤ*���	��d	�uD���-�F�Y��Lg"vޱL�=�D²����_T��؀�]���q^p/嫊��/��Doޞ��1��pqqv�qN�_5���Z�\|6Q����3㛑��S�S*r�N��"�X@>pXmx�֤<aa,���Z�J���w�t��جk��Mxߚo��$ΨR�<�w���u�����)Ƶ"ԦWB2`�)���A��ȩ"
4e�|�:�$L�C�LhEdNn̊ym34A\g��=�L򸫒},R�.�wz-��jG���������k�F5��|��v&l	��6�j6Ųe#�$A��c�fDiY�6��/gA��J��7��q],j)G+Q=)��0� h���0�>>�kY��n��y�$�P/C�~OP]:$A�<�t���K��<T��1���	�-�����-�Rtg$�JS����l�L���l�2.E��&���=ȁ�aWA�yo�@1��Q�oW%�ᥡ��%~�4M��d��,	��8��l&����7'!�^��l��2��v�E	
:��:�f����B3��!�eMW4������N^���J�Y$|6��8����6 ��UK�0! �R2�D|�]��%����f�R�`bY,�9e�g��,T�aDž��k@��r�K�[������ʥ�O�Q��j-�,���<����5򞵡2���2T���Lx�Pܧ��Ĉ(S#6����w�@��<��+��C7e����16)o[3�.0C�V����A��w�6Z�i
<��$$���3b:1��R<E֊q&i�� b����i����
اbS#l�/��aي)G�)�p�l�^�E[�ք�}@BU�ZmS�������)��Aisw���?i���i�@�wfJ�ʲ5V�ע,}�DM���=�"є�v���8�����u]�L�KJ8���v,�M���hx�|iu�,PvW��&q��Y���Z�㊜I'���a���nnz<��Gf\����q�����ޢ;\��%F�@5��!��!��Y$sP;%^�3�>}����"ސ�&c�!�Ӟ!N�m�3]HN��>����\��m���W'�t�`�^{��a�Z:�}7������0���[���	}�K�jE�s��Q[<&��t�Xh �F2>��Q�M�:m�E�X���hx���nFp�
y;/�;zͪ��e$��3F��������	;BRgL+Pw�mIc6�v�V�΀P+
i�$����Ӧ�}��r���H������w�P2i�E�Sӿ��8-$E���*�u:�|	6@��|��f�K
s8}v�9[Qӊ�jԸ�d^+��~Z9cZ��=I�{�0#v�r\�%_8�6f��}C��~B��M�_^���fn쉲u,����l���&£��eAm�s��S7#��D�a��f�����Ե�
�ǂ�̃���:����
n�.o�N*�"�Z�@�13v���'�7/�Z�ܻ����K:�#g?���q��V��Q��^�-��}��F�r�P�+)��;��P�m3^f��ĥ}�A��1�����N�9���q�;�8>�����u|�7�urt��&9�;z�|u���kߎt� ��?�Yi�~���q�8�?��LJ�?ه�g���m�%�X5��֔��i@���W�j���hJ�0�c��5��t�u��H2��J�N\��!U�X�þP~i�
���+U��������]3�ܣ����sݿ��+���3T
�타�J'�P��HB8�GvE�1̞�����F/,������b3����}]�;�<�ҩ�ؿ�)���#ɢ����!x7^a�}��ܴ�����s+M7�%��H�쭨�Ɲ�I��`�1�Z�'?���� %�f���7�Sm�мz�P�0PO˃���(��pL���C�i�@���Sz^��'�PKEePQK��q
pip/_internal/models/scheme.pyu�OK1��C{�B��<�T��Dd�&�M4n����wv��U�K^��?��F�:e����9ـB�A<��cD	���^�+3@XSK#�
�M�-�p�!�*�~7`�@<�6�B�2&2^��l����*��|V����{��5�1
�Vm��4T���7fyu��[Է��%\��S�j2�I���HO�(s/���� 
N��5;,�'i�LVN�t�#��O�1t(�a����/�>&��	\�z>����k0Kh��ߒ�z�}�5U�g� �c�k
�#�:jtCh����L��~�JS�����鮢#��v��"�о�P�u�*�4]Q���_�w����:�š�qoQY?�OPKEePQ@J����$pip/_internal/models/search_scope.py�Xmo�6��_��lc.�u(Ȱ��bY$-��TZ�-6����oX����w��0`B_,��x|�UV���zc���jA��N��4_Ʃ�B�t6�Z��B<��<1�"���K��cG�X�&W���O�"�cM���K�K���Ԫ��N2�X�����*����N�v\�|���W��d�w<6�Q˦�E�?)�)�¹�YuBbͬLD�#Q�4"�=m�
`T�������//_�]���|u��l���g3�'X�[�P��f3
��켎�I֖Q�=�V��p��Ha��&6�\�����,l0���/�X���K�|*a6^��ހNƔc�ɷjW�
s�,o�Q��.��ۻ�!�����|��!^���V�?3�S���DnYl%�X�wzb���Kkq��#G�P�9oo�v��b��F�Xr�W��]��+z^��
�
Z&�H�&k(t���|��#�c�t�9!g��L�L�]���3���+��Ok2�āmddž�Ӱ�%RU{I�,5�d��p��g7�y{�zڱ�"O�����%�ӔD��:�	慨N�*��Ui�>P�8i��;���j�z8O��C�<����D����S4�@�}B��
P�Q�"%���rek,#I$M�6;B>m��"@�.���=���صOKZ]��a�8N�ByY[�0NOm�(Փ������`���G.�|Ad�����a2-�5�8g�?��$�z�E,���D殟)H2�09i���4T����yӏx�
�/��;<�(�M$���6����a��S��8?g���-N�ȕ����Izc�I: T+?��D�8mh>���X�n�%�,T�s����(n w�z�؎���-�JSt��� z6`��6m��͉���o�s>׺_DM`�;1nD�J- BU>�ڍ����\�\��=Vi_�B�j_�ӡWG["�%,ԙ�$�)�3��ʊ�:����z�w��C��k_@�F)LiY�%-ގK����(��n���	j�����#v�B�7���,K�Z��x��`�Jh's4+����=x;4�#;R��Ib:t]�,�(j��)�U˔��^�%��̡S����'���6蔱-�~-%���ӯ�~�ͺ�����z��HF�0%�8��]�OYp�Д]jJ� V(''�ȇX�Q��Q����/Q�x�z�B�?���TVE�r���#-e��c�?Nj�pD
k�*�y�r�/��;�<UW���E\K/.���!)Hw��{�+��.��v9��j�٫.�S�MϏ�>�*�[���,��t:|��:����ep|է����)�4����˂`ю�����n�5%�y�Đ	[�_�2����E؜F%z�0��VYL��Z��{uLg�Jc���km`�ǁ��8���w�h^�쎔�&�0�a�D��L���?
�<��[��X��F�,{�#�S ������j�@�dQ����k̲�W�4�~�7�L'~@�{0�W
\DS��s
*-wi�">���
-�Ϩ]���uqa�D��)}�F�W {�<5�*�K���%�Z��M`T��;T�vB��=��
Lm$Fze,��1�t��
�d�
S�����A������h.|7�`�ng�PKEePQ
�0��'pip/_internal/models/selection_prefs.pyuUQo�0~ϯ8��D3i��Ĥ���4��m�TUUd�K�0�g;m��;�I�)��}w�ww��Q;�\���d"o6w{��#�V����]��r��V��].�.?g�O�2���Q�?����Sԝ��`kev����(�9߄�E<̲��Z��Kue�F��D;Q�txy�F��}-K�m#�Cn�P2Y�^�vA@�рJ=K�XEI� �\ZDŽ�y�\��{��(�P���~L���3��j<���>�2��,Z�&=��X�3��5�����`a�_�
�B��F��C$�����R4w8f֬��h���R-����P}�hYNU"j�Wh,<o�
h�
ԥ�\V9��p:VQ��n�Pn�A��z�	�����o۞X�D1%HN�6(tH��=IB���ǖP��
.�+�I_Ojv}��qE���^��J��͠g��
Ϲ�ݜ/���ӹt�p�h����4�FI�OK�#�
�F�vZ�O�<��ˏ�[���M�`'����Y�1�̰]R��i5F�`����45iU`QZLfAհ�^���.��4�w�|������Nk>d�vh���f�g�í��CB)�v��1%Qc�=��{x8	��E�-��p\V��

�־��H�PM"o��+A�^7a¹����[���ۃ�玸?~yZZ	v4�G�4s|-�ލ~�Η��<�����y�U�Jև�Ϗ�w�y}�����%�gl�"K�C�l�y��S����{�S��|���8i6�&���DO_d�PKEePQu��	�%pip/_internal/models/target_python.py�W�o�6~�_qK,*��ۋ�l+��A�=���m��I��hE���Q�$Jr"�-������R��Q�7��,Y*�F�UN�e�Tr'w���N?X��^��p��J�y���R+D����T�\�$Z^6r�6;�*mN����t�sY�եT���ߟ�>��y�g�������G���l���5D�KZ���ҡi^$p_���zi�ãP�6���?�2��(�
n-~7���������rՠ]]]�����Vw‚;
(�.�q�84���]��A+�=:�o����𵲎x�\?�B�<�2֙�_����4�5l���$�0-����^����O^��P�S؆oJ<:v
�:�݉���{�����\��RI��q'oE����o1j	�5]�XuW���l{�Ћ�J���c�#�:Ka�^�Y�:ճP����� �>\-�h�Jn����
~$�#YH���=4���&;"�H-�l�D��nt��s6����P1q���#n�'i�I���3~��q;�J�ݤA�3�Z���bp��yoF��&�3�Q��K:������Үw���N�&qف�T�ۛG���EVX0s�bL(�h20֦t���U�p�i���X��/O6��Y��~Y����"x�
��?&�6�K~OG���<J���H��9VxP�k��^M;+�EH���K�W*��6������]p��n3��q�M���o|ٞI>�O�w���
�/�XhG;Q_��xt
�*�r�&��(��]7	.��:���`_�T�1^a2��Y��.�>@�<���vH
�7B�H��z1��?\z�;JV��X4=m�7W�����"�}?C[t�3���
��A�k�Dì��暂�x�4��#�,O����wM�l;Mi=�-��Al��L~.0zTn�̞�v�
�|$�����eۯp��9�€��N���`
�/άZ$!��Hph	�G'��#�ϐ�u�:�Y2�(���rpsa[|�������`
�b<z��b�L�����"�5v˞���%jG�Y�}j�Ct�g���;������2�(�*͢�>������if�M�S���0M��`��&���{��L����k7
�X��O���Ğ-��pG?ZVX?���ғ���ͪiDV�?#�k�[�L����b2G�����|ymo�u�(К��Pa���3m�V[F�n|�ƺ�L&�� ϧr4��v��Rt=��ɨ��fz}D��E�PKEePQ%sٞ9�
pip/_internal/models/wheel.py�Vmo�6��_A�,o6�-0K��H�`kd[��IZ:�leQ �v��;�z�����=��8�o����N(�]b���Ee�F瀖,�7�/Al��f�D�,F�9-F�Z>(/�jb���BFqGzU녅(�[���d��27VV*�����‰���j�ե[�B�.��kS֞W�F:����D�/r�u��W��1�՛�7鋟._���q}}u�c�y��4����h�(�
��0����C�!��b���u^Ji)� ΐ��U��	��g�]rq�=��{~|>��\��F����J6�ֺ������d���j��h5��KU(�ou�;�]��k�rn�_!�Q�����~�풗����"EڵO��A1q��	��0��v(���ڔP[�����*�P�}}��%k�Ш��*��5ݛ:4�*�T�i�\)�-�}�)�o�7u1/�o��c8�>bJ�D@ݨ�Bd,�D҃#�~|�j��]����.֬�d@��PZ@!d��Hƃa�e[�@��1G��|ȝ�DZ��@�!`�TtD\����D��r��d��r=#�O�}�&xR'ӂ�<y���IM�Y�'�5��	�0�8^zS��4�O��9��f��U���@�����D�at��!Z��-^�cW�P���L�*��0������O��<r�ħ��p�&��؏��!����SZ:䴯��xZ���Qau��fR,��A���ă�o\𬠡��}�T߂_�0���\��{�ᬆ\H�Ƣ@�l�'���C��뱒bkܹuE�6,�]��?�=v�)��#�\
�P_��0[@��6\�8$�m]�P��uB�-5�49j���mx���*M�Īa�VU#w�ה�w'A��Ђ��dh�%a�\G�
7�Sy�qk�)~T�g�����x���*ه��J������(s��F��_9s�a3�����*�pi��SqE#��쀄�C����V{O�Fja'��h�[�$��͌)z���R�[$c���5C��;AT'���|�-�'��H���S�N�PKEePQ�J22!pip/_internal/network/__init__.pySRRr��+I��+V((-JͩT�K-)�/��rKRSJK2s2K2S�������PKEePQ��k��-pip/_internal/network/auth.py�Zmo�8��_�Sq��S�]�>�r�v��n�H[,A����"�*I�5�����;�b��;Mm����$��r�=���me]�f-��6�b��d�,�V����o����o}#���U��ĵ+R�)�`e]HZ�m�SR���
㋎�����-)9�p��A�v�Y@��$lCZ���z*��I�,��c\��m�@c��p�#]�e�m+�37�^���|�4%���ֱzdu/kdK/�R�?�̋�U������e�i�]�\P�ù��D���.�բ�k��Bܧ���z�v cQ�G8E�9n�Þ���Z�p������<3�С�;�����򗗗�����^_���L�P{*�1���R����hR��PțZ��E{X��1;���a�gM����
�����ڼ��c-õ���_�x�������],��(���2��7jl��m��y�Z,$?h)�
�遣 �ҲOł~.i'�k��%���v�9�b-��^�����`L�՜d����D~�_
�Zq_w8`�'�%����W��S-al�
e5��bQэ��@Y����5��+���8}A�Vb+��N�7V[�j2x�5�=׎/Q�D�,	R�m
JD��j5{gp��a뢱�Z�3�TK�~5O_8�p��>8M�~�M��>H�@,���(�BJ^�{I������?6Z���.�����@JC�J����`8ft��hHO��Aѡ�b����̒I�O���Nv�co	?��n~�.;|Bv����݉�58��a��=N���󎔰(`�L��M���j!�}a�G����A��=�Au[�ϘI�9�_��X�f��a��=���[���=2���}���]a��1�cԃs�|�a�q=�G��?����zFuh@��)�FD:�Nw�⡨�b�	nOɾn (m6�Ȉ������͊�,�P�w��C��	-�J\�pR��>h�
��y����Ƀ*�dGE�	M���J�
�}���D|�@�,�y85�,W�)z8S�m`q�N�����'lk�bT�v^e�k���m��
���C��s#$�4<�|��,�;�xS��k��kK�B��*vŁ(�Zl)K�Z�
wJ[���AC8Oc����0�Q3l���h��{W@̖��%e��`��!��Ӣ:8��đ���m�k0ɶlz�ɀwh���km*I{��m�+7�o��S�=k�3��Q�9��e��a���M�;L200�q��LT�cz<�ѥ���3X�_����Q��2�!Y���o�s`^&d�����5��|��3�Z�}�x�ն��`
��FG�ц�GO7�N-��Ȕ萏�w:�(�U�5"� ��8L�@�葡v��wXӌB!��c
���[��g�����d�����2��!��R�*�IwkZ�D<�#�l�X�BS!v��<��!�+�aY� �E[Z&�)���B�{��Js&���YC���'���ܓ��s�2m~���=�
G �S;�[��<�O#C�4F$������h�>$�~����J#�2YMJY��7�o�MnҾg�"�[����������ܡ�Q��S!��PHL�kϤ��C�Q:>��G�:�,��4�N?�$���t��Yl�p��ԅ�`�C 
�����z�M^�@kǸ�*�F]pA]Ō�M̓H��{nE�u�	|���1N/t�i�<i�0�Mj�'i��Z<Q;(��:=G�������9��Y���"��c���Rc�Q"�_+쩊B�ƮxTq��sZ�p�	<�,Gx���I#�	��2i���+	�Y=��K۩��b��ضoKզ��U���F����4Ԏ0U~<gƁ)P�쓷����ag�S(\Д�����m �aK�����do
�d~�'06�9�姾�a�ё��'��lmC�4�fA�H��R	��!s�Qcߝ��d�0������ιO�%k(��@#�2�{8)i�`��$�t��O�����͖��DO�K��ց�k�ɲ�W=Ǻ{p��
�H��ف��+�)6`Z�M�9���Y�j���[�z�F�lR?���W�j�����W=k�r����bS�f�~q��z��m"�`����@ǡaC�А2������(WN�sO�3��OV)I.U/�5l�Pn���5� �@�2�(�
���aCH��
U�T�3S*�]
#�'�y����&
S��d���J[/�l�2�MI|b#�T	a(�t�y�G�`"�Fo�H���a������("1\H	���{<9�Ȫ������b1>.��ZH(
p�2�����J��sX?�&X�� f�N0(]�@��4Oq�]eM$�yz��I&���D��|'��1ԥ�<{a�]Y/���Ff�|}A�+���2^u�&���nWj����(�������E��2(\���G
Z����.r8_xy�L��+'��F�dd�)���[��!���[�Fr�B�,C��|���"�#���ox��n��-о9�puRI�Mr��I�ܮ�9�_>�z�q!Ut)y��~_𭘎����O/ڃ��z,��$䶁8V`f]��#/O1�I%_��U=E������>#��n��z�'|�-Hǰ!,{���f�r�OJ�.b���hF^���{&@4��u��:���p]sS��z�Ŵ,�+/�՗�:�0��p��@�|�Vc�;̕��oS�O3��r7j�"������r���]�>�	�%����u�ł�Wz�I÷+��\dR��T$���8&�XA��p�4�0D�3o����)4�h\Ä���J�s�u���7T�B�mPI(C6�ƃ��g��7]�����&��J�]��a���
s�IP�o)���'���#!6}cYL��L��ܵJ:���å����p�vf��%�����5h��qu��tH����[�E9���������z]Չ�7RS�ڔ�yfPfV�;�$6Z��( \����tэ��e���J�Q S�6=G�B�.J�q3�8�v�)6��%���w�=��a�Vo^�Qو6by�Mϳ���EWy�Yy�
���"#�|/���ʃ�����̛-}PN���z�-�̪ѽ�0�L_i�ϻ�7�DMU��9���y��蝽�D��lys��Omg�~�
M"|i��*�<|�k������UQ7�m<T/p�PKEePQH�@�s	pip/_internal/network/cache.py�UMo�6��Wԃ�T�.�qc��$=�!P�ȢM�*I�f�}���v7�%�H+μ����(M��?������=*ǝЊ%i�&	��Ɓ�Ikt�V�:)*�'�M�D�La�X�C�h���2Z���O��[��/�'��Y�B��2�ψ�Y������ms��6�K6:!-k	���~N���I��C�08Hzw����Q��`�s:��猿�|�R^�w�g����ۛ�?H��?^_$@W@=F���,��p�iI�-[��2(���G>��Q��Y���Jk�
��(xD�3Kr�
�p�%eR��^8�׷�0P��f�/�ml���Py�V+|dś�HNUg4��&0pF�ғ���4Z�Y�̫�U��>'2�l�,�.a{n=8*^Il�\8ܝ9L��� P6�~�qp��}z�	��w�!_�NU���t�O��ſ��>{�oP�q	�;Qw4F��N�hp�Y{�^	�
��pX�z�!�)��(� n�
�p��J3<�a�dS��2�(�bܐZf�	3�ZN�)�m'Էo��m�m�~`�I���|�&;R��VΖ.�5�؊{��ؐ#����Q��E����	_o��E&p����VP=>vhh��mrFK3�x��禱��;Q	)�!���N��,M���a���7X=�NG��#]�K���i9f��Ƥ��� �uٔt��C?���a���@[�dOZ��X���|��T�R?�7�4������>l:t5
����\���g���U�q
83�Y�B{����G�7ن��R+`��x�K���?懰[�@�<,z��t�����Wo
=�I��l�|?�Y�|�"PܨF�g����ď���1��]���PKEePQ�
{Jj!pip/_internal/network/download.py�Xmo�6��_��(,m���T��$m�vNФ� ���ȢG�yY��;R�HYN�(�����;�L��}�Z�o�"�\��F��dJ�ּ�ZHU$��$�덐�TK�>�\�v�\�5ӏ�܂PI��bM6|S�w���,$�g˔V�ZԬ3�����x~Y�|�(/N�:ey��liST
/���
�^ޅr�m��;^39��=Tl��h���{!oE۲
w���������������j-*Z��;�U�GK����V�>=iB�����O��CR�X��T���V��@`��V��1Fw�檊
��5ե�2����.�V���[���i�f�I����/P�������}������j�5��vzӰ����&��>u�J
�����|��}�]� �����$�$L���b��G���eK׬,�$Ij� %l�+�7��"V"ſ2������.���z�q�]�sZ>Z[D���\���b�(t���Vi����K��^gFĶI��͖�F����}]�}������P6�m�de�e�љ�Q�r��<��i۽�VZ&ÜEa��Pru��"4mJ(��T[t2�%�q#*2��>/�*�ㄤK�nMy�'�+�bj%�[lJ�FO�g��+���.�Pk��.�ٱ6L�_�j_o)R2����_�e�¶y���a秡��71WJoI/.D:���g͹��T�<p$IH$�U���X	���b��}�>�;֤y�;�t��7b
�o�yG�y��^tߑm��S����r(ߒ���3y}pp��@C��qͶ�	���!�ݸ{�i�"�;=oU%I���*N�l��9YӇY�	s,K�fǍ��\8ˎ�J�C���}�°2n���/:MDå<q�r�tgI��Î�8�Lq�Wbi���u!Ul�^7T
���.T��u�5Y�	��m�9[N�x���gt9�mF�j:o��f�֡���a�~�3S��9N�>��ki,p�
�̬��6O�ny�9t���/ȟ��XG�W
p7���I�%P���p]�;�ih�n���40�"����9�s���̆���B�`���u�n�[e߬��Ku���LC�	t(mz���/�Z[rryy�n�4��7�������)�	���#ȓ�	���7�G�]'P@m#�-��ڏ`����
�0�%L�ʲ�.�:Jt󐅙���s=�F����3�=���n��r���/�����!]�H�U�f�IG	����gd�}�@�iN�]"?�/�ٌR��7�!���U���;Z��p1�v`�f��L;a_�Q���Ǜ���v�YM%���<C:}y|�]\�ykm����y�h5s�>l[F�3���G`7����Z5�w5���o��.6�x�p]�=$kypݻ���ä��i�96�g!��z��+�W�pz��=:�#7�2ճs���C��P<�$�yy(��ci�=�f��$��ⅸL8!�#7<�]������{���;[A����
�Fl
����z<�L�de
�wC%�y!ؘ�gbn:f�T�~�!�ϑ�Ja{x�f6�H]�;5��G��8L[����?�y��G�`�Y�PKEePQ��A�
�#pip/_internal/network/lazy_wheel.py�Y�o�8~�_Ad,����cn��\�n��&A��5��h��L�H�����f��Dɲ���!�%�O~�f8999�ȿ����;��}x|�;99��gY�����=Wkq/�S	S~R�*�\�"�l�JS�+�o��Y\�l���	[J#���-.w��L�ʰ���zS��I�J�RfrY�'[��Zh���b%3Q���[�>
���=����β��}2�@���BQ�U�4ב��h��"3��������c|��������}Q#_@�h�4�̷!!�x)Q>�)�J��F~>\]����搣x��ؔ���{*L�+x�l*�'C6HwT�
�ֵ�?���b���=��tss}��aI��Z�xZ�`6�t"L����劼����\
X8'���u��P����	@�,�2�!��Cv[�j���*p�~�;N�Z�y�
���{�վ��M3�P^����>�FIƍaG�Kp���nbS��b��Q��!�O!sv��O�Mq���֓	����	8����b������m�F����1��O�#��Ǎ4�g(LrV甕9�U�c+Q&�R�5_�7�ԃG�K��؊����!�R��	�W�
`�H��������*�TF��z�L��L�%kR���Is*����,7�������`�؈��}y~k��)%�I�4�c��H
F���/�=F���~�%Hp��e`#�y��-+t^�I�E�4�^L�7�-���\�\���
@^�-st�ċ��H����q8�+�dJ���YQ�ݭ7�"�{$�=�0	���Is���a����;��S��-/
�"|x�m��^Pg���Ռ�M�*��=o$�M/c�hW��ۍ�0hIK�M�(�2B�����`N+M$�d)as��v?���`�8�%q���2�,����l��M|��,�P�P ��U��
�`��D��(�$����7i�ӫ��l_"p0>��8Vg����Y�!Fq���"Əm��w.%��L�5��#%�"�||iA1�HKƋIOԝ��%��S	/E��k�n
۴E�XE��ע��z�W�B/w�0c���^�e0�H��M	��@�<���l��j8�4<:��cM6"y��' S��@`���:�k�I�j���m!l��=�<{�;`�eT����z9>���9p�G�x�+9�v��d�v�!Kʍ�\7���̷�Z�Z����R���ض�2[G��<�j�5|��d��ǝ�(�D��_;&�������e��.��4Fi���vQ4VrG�D�ӳ!jv�c��
`Ȫ@8т�%s5
��
<ݺ"�?\,JйI�4�f҄N�B$r%��@�2=k[��9[�]ݾ��d�@{/�)A\�{Һ��;,u�z4�:$�6pl�������*�yZ��q��=*(����!`K����CΞD^�B'Qg�v�� �V�����S��Yv^���v���U�2p>�����,~HUS�����]+��#��Н�VF�p6;=������!�.�Z��tO�B��gƗ&ϪR4�<�?�Ct� o@2�~�k���K(uS����7��=Ц�Ĺ�]�WY9܃*f6y���_g�����svYi
徵9%w"�X�K�����
�lmZ��Tpw������Jw?<���8����ܷ�O��\�{bO�g�o`#"��R_�����-��6m�hڋ�e9e�ȃ�0j�-�*��G�m�Ҩq	-""9�L�wL��}i�����L�9p����b p��n��.bCu��4�x�/�]�xI�쾹P;��@C]Id��T���7Tl������c�9Bx1�b�w�~�f^v�G_�6/,��e�'��ϖ<��}��p��o'RH�6oJ��v�;)��y�B�Yo	�!f����Z;#z���k5��ę(�E��TLЬ{񚲳6�flm��@@�[`��~b2�^��Ig
��}���2��6A?0:��31:4'���im�aP�rTzc��h~�'�2�|	~?��3���#�N4����Gz
;S��cQ[I��n-֞Y;�q�혨{)��ۢނOd:����Q�;�6�����^�g�=���q��ru?���w���7Q�h&
�))8	u�V/��:Ϭu�Oi�x�=�
^��qI��o�*��D�#�B��6������96�K�
����U�-GJ��=p�iFq�����צ���tG�C<�x�q
;HOn��뎭���[~
��XI
Xùd�*5��w'+4����4��wj�1��L�UQ�_�hW����E�O����e�;\���e�����y�0K�x�����[k|>=;�!�	��:V���=�{�]�>�P�c2d_�g]pች�J	(���7P2Q��5;ߝ(�ٔ�����L[yz��ՋU�Ҿ��7<���2�4g���R�ܠ�'n���\��t�_o�&m��6�<t�:����%���gMD�Js������ym�'
�_GDm�mN:��
����p��[�
��$&��PKEePQ���h; pip/_internal/network/session.py�;�o�8�����)x��u����}�dӴ�lZ�i������׉Ro���I��p۽{�^
�?f�����y�{Y,�R2��b����Jf屘�oVq�aOV��D"�kM2Q���⟵P�]�M]�ʂ{[�$�2�x�7����`�<I�F��"����u��T�?��qh�S��\B��X��.E`�}�?g�TA��Y�/D|�������Lq!L�\&A]�D٦�T���$�l����T �fl�<	��y��w�o�v�D��d]�)�(�D�%3#�Ԍ)�<cu�$��� ��V ��<�s/��R�]ļ�D9�h\�Pv��\	3k�zw��� R|����3���	�*�E�Z��X��L�J>��2���J[�vr�K%W�M!��&�9j\�1G@έ&�W-�V:v\�JT�0t��‰2�I`�;�u��S~��J��A�2ଌ.��KsI�v����(h��h�J�s(H�I��*�5�#X�BSȳd?U2sAO�x����J@e������g#;��S���R5��	���Z&q"
qR�H�hF]Q�|U���J@w�������F�X���?�˿^]�=��ps��y{x&���	�W�_ É\��9'�X�^%�-<�r��k��{G�ȓ���<臬Y�t����m.Hd�hQ\ó�$m~WJpUl��ރс7���0�L�X�V���(a��t����0�x*��Be�dy)�/c%�
��n+2V+l993W��m��`b�^��	�¾��$H�������
�.�.?�^��no7K �V|Ċ2��(6"6$tƐ-���?a���-��cz
{P�fˉ_��K!�ٶ�����Y���?���S��{ة�`���L��2���|�������X����ӗ��]�1a�݀%��#p�i�;�Wf!��}]W8w�sR�{WMV�ۢ'f��I�yF��/%H�[����\�I��bP��
�\.p��D����&�}5@fz�n���S^tbv�A2dKԊ@a(NDD��~\J���EB�,��pBG�V�E����a����������@\{���Ȫ�I�B/�Ћ�!
�@��yȁKH��OU�5D8�����W��%�#�3�i�ز�"w_�-n�O� sS4�=nJ��ګ@}7�����O�}�O���J���N����\.«����w7�\�܅/n?__�a�F�.~G〰O���@[����~����ƿ��,���^�G�G�w)�v�<�S[Y��[Y%��a�
�+w%��
Z5��E��Hd��6����b�,t�<�G&�Q�����6�N���j����d�� ��DPB���Y��"�@8b�
��q��8n��C�G����YU�/�M`�(���O�҃�8��Ģ�R�{S�ad&���B!YV��GH<�2c���6!i��,����7<��t)�P�
��6�5+XS�
�ъ�����5�8"|A^�TFS�l�y�A�?5��g��;g�<$
<�!zI[@��}����=��mp�;ڟ:�a[N�%q�5}�o��Au��
%��&�w�dz�אWl>�yOP��(�&��ü��#(��	7����&���b�pU����I$44�'�L�L2G�ݟ�jfB�$�E8�a^�������˜���<�	����1��/U�Vr�P	���P��^�0������@������J�M��U��7m	9tҎa�-a�+�F��W��W��Mx�s�|Ξ�_�f���e��8Ne�fE@��"jm뎱wO��l�o�\R�{F;�x�C���2��F$&|p'��zH躟��C�.Ԙ�;�yS
��)7+�?[�ݜ����0�ݲ��G�������Z��(Q���a7
�>O[��7~�@73�0C��-q}�^T�] ���I�smZ��=�y��JBר�=x���f��?^�.�n4Xf]T{);F���
�Xoڨ�p�	����_�p��n�<1����t)�P*c�;��ט ��`�T�$Ni2�N؅��c��	�qփ�������Bc�x�I8�02��,Jj<
@<�@9`�E���a�}�P�ē�Kv�0��N�|��@s$�ʉH}���P��:��_0i�Ib�]	�� Ʀ]�x�yI��	��X
��!����mx��Dz|}qwъ����6����m↬�'�D��{4����A�ф�g�	s���@�~�Zg�#��uZ(�zA�
N�5�����hr*��Q��y8m�?�(�J�k�(�Y�T���h��@�G�g6Ly��9�h�*������J���%�i�8l<<K��˱|L�Q\?w�b�A�I3�84�Umb؟vz��W�
�|�^��u�4;�[�U���/Ji��Gߒ�b��_�nyU�x�R��2B�g?��|]0��f��r-E��‚Q��ɀ.LQ:3��MZi5��,?J!�T\Sy6WQs�^ؽ�W0���)8u�5��
c�>�~�����.5	'w�6M������"�T[�,U���&\sU��b8�-�C?;�Փn7
���o:%��Rz�npՕ�v��Ecȸ:V��Q��tj&���*[����+�2�2�5Km�.Up	��*p��'�7�]�2Ə?�i������?��������M�)W��4�EA�(h�GMZ]fժ�Bb>%
^�r���;|r�n��w��D�L=�d�:g���D"�m-�����^�u؂�F��—��aA�����3��E��F��S݁�fӎovH�����մ���rDfBP�R!���h���՛F}A�S��
�U�Hr��G4��B٢�c�Պ
�WB��,+J��DP�;��4����H�Z� �����9p�� ���ѻ��]�EUQ:�.1|-��ȐX$��w���=B���$�`��&��L���8ѡ$bSZ]lT)��I�V���B
ⶵ�[P�=��-����I�����0��؛��	9������ښD0b#T]�sĖB��U���@`��N�x�c��D��.�z���I�6�:7�f�����LP\C�,-P��d�R�3�F�o`��֓�0]�ACj*-�|o	G#�ed��;�:X�4D�<��H�� +	J��6�o���v�䵁3*#��{�J-�*a��d�M�h(�H�ﰨ��ٯ�0h���O��`.���߀E���Gk7�{�i�<�!|��i5]��P)ޘ�i^gT�Ī����k
$p�nLl �����g:����ir��'��
��p�#8��ςW?:!��ށ�ٝٽB�j�VF�*eLN `��*�)9�̭!�N��F�Xא����0EX��ڱ�#�X7SA���N���b�5sScz_"k�p�Ny��*	l�z�������g}������Ui���Z
����0�ϡ1ck�N��ƥ=u��7B����h��t�M�<>���2���R�:]��qR��3�
�鸲�f����Jg��d
���Z�X����v�&F�E��,�6]�8Q�s�r}�K�Gd�D�e5x\�M>K_�h&��|��u�w`�o,�]мs]ǧ���3"��i� �'C7bѭ�O"������߼�}9�N#�i�g��{�-Ӄ��>��Q^e��x�#����K�Lp�E�Ef�(��~��3#'�	����19���1�� f2DM�0ɟ$:(M�*���wN��gT.��9e�씑�b>���qpnOp�
�ǘe�
{Äc�)�0��у�Wt�.2�M�)ψ�f��!K�8��N;f��-�#�&�x���Q��c���`�5#>���|l3��Ե�hk�G�.�����}�<m`��]��zW��:I�F��s��GV��E�.#�<2*�E����tԪ�A��uAM)���Ͼѧ8�NO�
9�/W݅�_(D�P#�x�=3P��z���
hY�7,�x衿aIzY�?���fX�Ohu�؛���bv0��U�{?�˷�Iܝ2��޷+����8��
��E`���P�Q-b��2øG��W�lπ+xò{CHw���TfB�ڒtY_�v!!�q�)S���#��r��fLu�:]�!��SMv�^|4
�
�WtW�4�@��O�$��soR7��G��g��uD	a/�5��O'|MA_DF�#�"W4mO��O�^�u�x�(��l
'|��md����H���"�0��-l֙@�7�Hs�$t�/j���y�nKP�"���(�����N�����֢Z�0M{����Z��ʬ��p7X��\^�!+v"�z,��WJ���a������p��
i�(��-��t̷LG��V]M��GL�V�q��ž<�4���_���`���n�XŐY-�g�Ai	��<��>|��<}:�u"��e�c������)\�t|g�t0k�b?���n��i�t�5�����Tg�ҹ�y.���>`2C"�됺ɐ���,�<�5j�d���̛+�*LI��ߕO?52&����q���i>�kTt��!��Q\�qx��Uh>�Y�������!0`���o�K�>�ۏXƘL�c�E3�+���\�Z��M���c0����1�Z4_���0�[��tBj�W���Sf�ڬ��f�:�Q��[zЀ�[�ɷ�/�L�O��Yn��0M�I��v
q���Ю
~���&a���#r����(�
t��ym)9E��`KO���83�7(&���0I�N�ǜ~���xw�H��_��������
���k��҈��%���6O\&�Zx�ܤPa=h��?�l�������!��=;	8��J&� =HD�eҭK#(�l��yT�:�~�<8��1č7��1T�͇�؂�Ik�8\_O7���E�#vA�+Q�mp��U��L����^��Tݛuf����y�D���*��{�*�8��hfm�ʏv�_\��PKEePQK���Lpip/_internal/network/utils.py�Wmo�6��_qhP8l�M�&1�]�5A1�hR]1�t�9ˢFRq�a�}w�^,�n�a��آ��s�O����|8}�,Vz����5å�15 ����~�<�L�W�'�w�����\e� ���̢�D:�/�V�yeb�v���JeF|r��һ�����u.�Y����Ot��ջ量����m�d��q�㬶-\������
�a���4U+~-R�%fր�b�}xxs1j+�J˙$v�Dc�L\+zý-�Ă�`&��D����W�/�/īaxv���xtr�/�G�g'Ix|r����d��_
��&�
n�H��j2&RҮ�
�1�Z�&�1EJ�"#¡Kor��Q]���ci �(��
xZ"W	��ڐ�s�6�2��X��A���,��BcL�a�jYS�d�B����`�:l"S$dֳt_EK��?!#�"�)�GlP"U��vN�9����:J�DŽ�R�f���d/�>g��"�n����j�AE��%���ܙ�h�U��V,�		��5TCĬ÷�
Tkb&d�w�
��>I��5��
�riXUUe�*�m������\�>��T.�9����DOܪ�"��+4
�/�pI�8���\Fs���E4��p�rI��M���Y�����,�p��F���>�u��7�IVB$g�7C�x4s�԰��#ܑO�bN�=2��.!�2We�S���dh������͇{���z��WE��7�O3�)��X���{4@ipJ|��
[�Cn�#?	+�a5��`�L������|�<��K3#&E���QidF��A�
�(��pmє�4���ܜ�&�2�qf��9�ZS�����Gs��Q�"�ʯ���%�J1�v��y�o����ا����+тmJ������Hq1n��6�����E�)�\�F0���Þ��wT�������k��[x�a��]���
~6�r�r4���/��K�k8�;��U*���z�a+tʟ{�;>���CU(�pGAI����%��ib�~��ĈV��� sk��.�mP�޴�����,N�y�-|o�>�SC�~�����o��u=\I�Ϯw�?{��m9;k�� s�i�����AY�
���s��H��+Ý��i~�����j���S���4N�[�k䫟�V��O���-~V�'n�T�%;7my�;�?�>�.��Z�I���V��N%d}#o�W��ߠ���)�`���+~!�|�^�._�`�zN��E���B�]�`)�H͘Z��}��;P/
�a���p�}�J�a[5~[1n���ό�/�-Nv��m�.��8�+7������OH�-�]i��,��-�Z���	O(���lW�r6bDV-9�[u/&1�m!K���m�1AY�J]ۂ�X�p;j��Z"��覠_�^(��$i��vE
`R`��^�RI�P���Ԭ��]�x{֖�ʜ��f
�428n�m�ܤ���?PKEePQ����Zpip/_internal/network/xmlrpc.py�U]o�0}ϯ�RU	�v/�����i-C�ZM�k��ؙm�4���IHBi��{��=�p	�p�g��3��sͥ)��D�E9H˭P2�0p�ej�rgd�e~="w���	�d�0D*K��'��!��`R|�(I�^\^
/���W�ME�b��k����XI���|�K�)b�$��V9)DA�d�45bGs��:��U��dE�<̨�}%��u�Z�0��r���A+_HZ��.�©u�0�U��DI	�;��Z�S����k+�C���[*�*�6�}�Ұ#u����Mn�'�������#�nyb{8�=jὈmsv��c��:e&���N�"�ɸ�
]���{c��X���2|��:�k\�/	�gZmD�}!O'�td_�܅6�<�Z�ľ�4�/	,	�r�e,2�-��v
0 U����$�o+r���[��"c��%̀,��d��L��C���#�;�����T�mSge�*h�$e&NQ'�k��r�8��֠�K��5[�L����2����B%�ـ^(�?�Ù�{���K��uG�z��p)�g#jrB��,u��M����[)����O��7�c!��Y��7����N��4�l	K�y�a����[�UQW�^=�x�׭�=����Ժa�e�7$]��d�Z��^8VC0������/H7m1��4N
�1����윗#��ZX�,z�Xx3���΍��ɀ�\�n���h)�U�r]ꄟ6�PKEePQ$pip/_internal/operations/__init__.pyPKEePQKw�kx!pip/_internal/operations/check.py�Xێ�6}�W����b��
�l�lZ p-Q6kYTI*[7ȿw����\
�"1�93�9s8�r�����������Ԭg]ͺ�3��{Z莩�r�\,��R�V�v��-)��m�*�W�=���z�[��{zޯʏ,��"��jмm*ډ�W�?�D�3��])����h���5pɎ��o�T왔B�ny���h���Ғo�$�lA�s�V���FH�T��-�]���9���U�qwL{{V'��2�>������ͯ�n^��~��}q��b��g�\����+���&ke�C��3�ks�3��x����_دQ~@��!~~�N�+�mYA��J�M�ǦmA�|}��(�+H���x�G�n`{���,���8."m ��r�O�����{��5W
#���v+Dc�ވ�ia�#l�Q�Y�cݸ��3��ۣ
�dϪ�;��V�QD�)f�ȝw��)bd8I� 0�M�W���G&��Y��,j֐J2�Y�d�T@kd@�v����ʝ�׮�@�&���ɓ������Y�BZJZȜQ��U;-�aXyS��)k(f�
�Hc�\d����=#�4;[�=��&�>�G&�U�i�
P�Rt�i�&�i���Ku�=|��ϖ:Q���]���0��6���|חTb�W�`!k&�Z��۟ �f%m�<�I��z�)+,��Ea�]yfdy�fW���sgD�8��9���4(D_R�Dz�F� ���֑#�7ML�� 5T:[p(i
I�2��A��oY��$J̤@��`�#�d������~�{"Kv��ں�NHv}+:6퍸�<n�nnPE�]�ܛ�|�\B�R*A�qr��d(�f�&���T)V�k��l U.h
��"te�oKA�h�&lZ���.4��RGEv�P%"��Mc�g�g�y��@�Gp!5 [1�KS��������X`,Sj�%}4�b��Y,�іOӌYJV�8�<��x@�q3t�$dc܏m��]�	����-&=:R��+�ә�g�W'�����
�:m����<�|EHl�9P�V�#m���������K��u�eV-<���K5I�1�]akx>%;��B�3)����e�q�[���
��cD�l��^BЕ��k�w>?����G����q�RP�$e(v�u0'Ć9��5�-����:�?��b
����ERĐ�����?W�~q*�f؛��N����+�shm��ц0A�Nd'i�'^�����N������;oH��7��4�9ݎ���D8�l:��D��ܗ;lw���&�r��~�,?-ºU��Y�&Jo�2�������Y���gM��t�C�=�f~��sۑ/�BD��Z6�\D�H��'�_�Mfc¥Al:3����u��c�#R�_��?��H�"�
��"�9%L��~�p#���E? 8�F�
MF�G�%c=L�`�@�������!���=�kQ��SU��U��n{-��h8��N�s���!�Kw�ȃDѭ€���!�o�I!��AD�o�e�H��E*�����%#ܤ�����|Y�d.��7S(���w��ʞ�_��'WI�4e���Y��+o.���!/Գ�������%s��fu;$���,�PKEePQ��
)`�("pip/_internal/operations/freeze.py�Zm�۸��_��E ������Pt��A�M�l�����neQ!�}I�����H��R�ncS�pf��+�|O�tۨF�4%ž�B���lK��̎g�,Y�
^�v�䷷Eu�~�r6�"Ѻ���U9-UY<�%5��(RHU����ъWEF��K+�g#+�nS�$oD�ܺ��sS�g�zG�d/���g��-���Z�Ү��/�~O�|A^URѲ�8��!!��$J4����g�?��8ey��d���eQ����Fz^Q�v�˷o޼��N߿[���䠊L��(�+k�g�{OeZ���_N�`[&X�Yv�B��[3���z_Ȭ�P(dO
HҪ��)�Ŧ��r��z�4�o~�{z����N���zu�O��vd�Bo�������}(炼��傼��W��)���?/2�{�� �Y�b�������n��v�$?�+/q�7��;~�{:[�`Y�xï�-'+�M+�f�($���pn5�����l�F��֟�)��cq��5Ma�Yζ 
c_��Vt�WW�N�9�p�����(�-�N�����5R^�O������D�i$G��T�N޳wI˧�=����'�v80T�C�MΜ�LS�wE�����T��ln`߾��$���o�fV�o8]�x񛵁�>� x0oƅ��S�ʜD�-��-J`�����}�G��]���14(����a���nst����YG��E0�j0�`�>�H�_cl��x���Aځ\����|��n��O��P���
��'p)�ƌ����T�h��Z�?�y���
�(��Y��^��D�hJ��ɛ�Ԯ�,��jr�FD�%T7NN�7@/w�:�ɞIIoa�Z�(����q������N�@E��s�'��
���
�R!ܙ��Z�g�<��b@)�1x�̃o�
�M�PB}3F5!I;pq��o07:�h�#}�k�����<�:��Z��&<�Er^E�E ��X���6��GCN���"l_(p|�� b!��D��
�?���Rt<j��`v#@�Hŀ*�s�X
�,��-�Q`|��0��n�sǍl@���S�Go�"k��$��Zu�fh���V0I�."~�&�n}ފlg� 4����
�#s[�#(ͲF�ӂ�
	Ѻf��&�*�r:�hsDd�������^���s����GK3E7�r����&�Uq�f�ު���
'̒��e����-����|ln��s�_*�D6��<:u�[3t.�'Z�h���F<�p��,�p����U�Y����-k�N�e��X�<M
 �!E�˜
r(��C�%{[�^i �-��b����q��1�2�*,"&'��|�[Q����&��&'4�1�aӻ�c�&�79�E�)��6Z2���6�DT6E��o�z�N��AR{:��KȾ�!)͇hM�DR��M�
���f�r��0=}���*9$�;�~�7Hd���h�	�[-�E��i�đ�S�������b�}�^�^0�<l��<�k�������3+!⚼҈��X�c�xvX]A \��{1�}� $�C�����n��+L������u�}ϋ��&`>�/6%�OO�$�aF��K��w�&�����-�����^霰B�W+�]��-l�gǎЂ�Klm������M�r��M���a)�9VC�=g�G�+3�	���2F��f��/TZ��#&�>������\a��>��pp<�3u�	�U�K� ���E�qD�[�z~<��'ge��"x��=QO^I�	L��
oTX��N�FKޫ�h�P�"�*ٰ���2[�fW#��+�HB����r�xL
����N�K���A�d^���/��Y`��䤠h��M�0�uJ�'/�XrIC����	�N�o������5D�-����{�(}逿��¥uQ��E�f�>�L��y��0��e�$8(��V%�orJ/ȣ�U2�E6<
�x��cx.��Y�i�c�SG��F�5|�;�����gg�Y_�}ݨ�O��!b'�q8���Z��Vَʡ6��u���^��!_|,#�i��N��ڂ��3B�e��T\�3*Y�Ѝ�5�]Тo��>s�-��E�\�+�^��ͥ .����x���mH;��b��,v�>��b
拋�f�J��=�i
7g����+N�s�N8�g㚏~V|�+��ض����u��g;��'L��야h���5����>1&	��$��m�n`���zp�r-zF�A��(�ӯ>)�@��Ao�0�:�s��s:IW_�
�%�ơ��
<�D�'�
�ȉ����2�;�>G��<�6oV��ʬ�v�4w��
!��xC��R;
�i���vt���H�iС1*p��
?�Q���*�̒�$�WeP�a����+�$v�F�)��X��(Rh*�G���‚9H��5A�j���׆��=eL��ݴt�-X�e��x�|4�<^���Yǥo*����H5���q���,+����
���8\S�JSHV���f2pD}vu_}�f��Xo7�[�:6#�n�آ8(0���"֫���;�`�h�$��֝N��(��Z�{�v<w��"~VJ�d�t4HMG㭹~��-�c,����ZFF!)�2&}r��߰�Z����k�(��>0p�����,�=2�q����}�3���Kd��zhN
�k��N�FL�BZ�8~�x��߽xG���ώ\[&a��
�
�8t(�ǩ`}���z?��f�����6p����;�a�֛��YOh��D$�Z�L�@�m,'��0�x�����e�~���/mS0�������<�c�^���QG��Y���V��Ë�8�s��nN/\�7�=�PKEePQ�Y6���M#pip/_internal/operations/prepare.py�<�oܸ���� &�L+��p\��ɦ	�d����"͈��D�(y2�� )R?v�'��D~$��KY,���Fj��,�m�o�6W��R��+ݦE�⃓�bqr�D\^KxW�W{�Se)�V�k���J��R��L��P�R�*��y%Z�ص]#cS���v�q��ؼH-ON�VM+
���"���K�k���~�k�tqrrըR�y'���T�0c.~����
����v��D�U�72��'���`%i�t9�����y���+��7n
���������V5�M�2��*��^f
��or]�����c^yD��iT�����g
F��gns��ty�o�W���N&q���U^H}ԭ,��v�>~�\�_d6?���pB
|��O2�dg�U�K��2׻�@ҺH�I����y&��)��'�J�8~ؔm#坈�0���]½#�ӎ�w�7?_��<{�ó�%�>�}���_�gvU��n�� A�Lͺ�9|�O�ѫ����4;�#�g�k�BF�5p}$~4��ˮ��4p}�BM��/���/��	��v�7����-<Lwm r3�C�Ĉ�t/1p��s�O_��9��$2^^��y����E.�ԡ*T���ss?��"��UM�WT�@����f^�9Sri����>�����o���k���ٳ
^�p�2
�~
�h|��T#���>~J3��O���c�X"�4��*U�#����j���_��^��er�U��ǧ�CF⭪��Q5�@���p�O���o��T�� �{پ�g�$��R&	�:��H�UR������;�}$��X�|Nf�@+ ބ��U�7v�5�ڢMr����C'k�"�l��Z���&[8��>�.���oj���~V����>�b�K�{Y։
q…��K��MW��j�o�
��c�*Av[�"�O��5�(�X�z���x�*t�2�}B�лk�A��7�,�Z��tr-*�N7�xe�	p'6֯`��c�L�+�xFz�����������I�Ҳ������
~�#�;�U���B(1���������붭�4����v�0s�{;�zv:Iܧ7����)#�3;�-ӧY�B���mB�l�S�Y0���jRqLʴ�6�Mgx�xu��h�:9yZ�Z���c���i��4;�(��]#�g��I�61r�C���ٹ	p.�?-�JL7�}d0�e���:�F�{�K�vc\�B�x�I����[�ç	�D�]��z�e���*.�#&��i� [���4���"Q�Y�Y1��ڒ�E�I��J7;X^�v��Ӣ
��t�
�<m5T���mA��`SP��I�^ڍ�s�B�䵐j
�0�l��k�s,�=�H>=���B�{�BZ�.l�V8]P7
U��X9��ڭ�9�{��G1�E�\A��ώ��0�h�i�A*��P!sOڭ٥j< �z^��E=��g␲��R�)���J��I�P�x�v`)�,�����b	d,�V�pK��oCE�+�tu%En-��eb{�;H���V0%��+î�1���S��N������/B_�x%��A���g1C�K�����W�$�p�@��	�#F�)M
 6OV�?x�j��7�>Z��i@�,�d4�9L�H5�ӳ����p�7� ����?��|8��l˜dy".�� &CAW���\"�U�V�s��[	<�u��@��.cI�Ӓ>���(R�v�X�Ҫz���� �J�_S����x0����]�1�iN�
���l��ۂcT���:=����s��������
H\ƭ����2��o��!�dkDh�#�6p�
�v'�BS�����2.o��P��n$�5�
����7�_�#������׋��;�i01�����<9�E�@"zLCi�2G��8:��y{�@2M��NXϤal�4zAn�x���w`�e`Eo�R
�ɼB�{@�M8�$�����c��q�"��b��Μq��"��1�����{����
��� f�%@4y� ���
}�_�l��M�ܦE��?�C�ٟE�'1

�|zjR�6��~q�g����{�p{��f>B�\�[�a��S"p��\���bʬ�DPE#��H&�%f@48F)�.LZ�|�B�Ja�s��^���pC�������'���=eqトCX-o�ؒ��{\�}�l��S̯�������X�q�ɚܫ�D�{�ʻ���OVY|��
��W`��#�ݑ{r�x/fl��i������&�-8!c�+} �&`oTv�^1/`1�J�x��4�t�md	��&`��3;v����•1�KhA^�N�U��H�g�q���:��7�!�\�M��6%�5	Z���)T����5$`.me�tK�1M��=���[@ʸ�J9F�)��a>�+��h����c�'=�Ğ��k|7H�MPeo5��8��ODfj
e��S�8l��yC��?k�:��"S�C�#�<�T��s�J�&�V���%H���-��xKya����@��U��<y6�q`p�2<:^�
Ď
�%��"�Ǜ�=I�=�d�7#^�"���C�G��x��=V�b��Qg�P�&�j�Tz���(\*��'��ҬsQ>I�k�f3>�9jL-)����9t�`��Tlˋ����j՟�N$!�ëY(�����a�\cJ��f o��w��.=ѡ���LJ±
�}�G8vc&1�v[i��U�e|-ST�X-�fN�br.���+����h�%�	��A<#7އOh�MoI�I
�v�A]N[q8#�߾��`(�T&� 	�bToA24tI�X(ā���B���Ȫ�U�3Ӗk���8�����F�7��j������q��^F���s��Q���	�x��3!Ļ�x-/�O��JX۔ݩX,����SO���q:�y�v�)�!�c�CBz���f�ՉMy�	Kx��oX���;:�_���rX�sw\.����!cA%���Pd�Gs��T���r�CL^,�G9��`��wK�&ѠۧMeZ���]
,1�&Qw;��c�
��2��׎`���{6>��a=�C2�R���?Q�<�85��uƼR4�`��	��#?��	6�ˁ�f��Bl�#/K�:�V�I� F��-�>���{���õ-�=~�8.������=r��`\0&(�ߔy���xGr�c�Lk^��
�"�?�������`.�~� խl���%˴j���pl��%�-fH�m^!!���FRPLuE��:F���ߠ%u����q@0��k��L���b��z�MH�w���)��Gm�Z͇����)YS<�Js���H=����=���*��
�E��qQ�
�����
�j���q�dVOP��dJ��n��q�F7��M�������jf�3L��`���C�[-��p[����1'�^hN��Q���9������	�b���rL�AF�g�8�W��~e�Іi�P��'l�r����-��՞�%�J/Ei�q.�n�!v�N'"�2.��'��Q�{�(���a���W�wyNf���z���-(�يĠ6�������c;{t�T��HH�'K�clG��\L��ڏ�DZ�İ��p9�
���fS"t,��P��4�����:�d�?������$'ILf�"T���S���A��Xj�#�C�{
������O�hl����o��;0B6<�5�	�:t�ˆ"�ZūR�q�|��fp?�s�q8�E#�J�‹8��U�B�v4�b�ЛX׶��a'@�39oE�	I&@yq?e�dU�慫���Q~�������]�o��t��0�Z	�W��6G=y�:R��:?���i�X�wu\���Rܓ����2�.Ńը�`����O����?�bF#O������֦1
���w�	 �K�4�.*$����m�V�&L2(ߚZ*R�o�2��$m<颐���5NB@-�����/R�!y˜���Uf�F
�ݛ_d�^��'�/l�ڼ�Cq/~lE�Oҥfk���v���Vg�<�F�r?�"���pC�~PWA����At1/�Wq%�]��B�a>�4a+�P�P�}�[�@�%-�#��8���h_��|x�ڃ����d��A��}�s�Z�wN�XHjC���t�؊��
��0�|؈�:|�[��I�<�:����4��	�ֲ�	��~6�����?����8���+L?Z	O�W&�U�`jO^�����1m����l"{־5/B�-W�9sū����O��f��j�T'm�:���S0�)�6���%��P��#�=Hyk�7�J9����'5T`��&'��S��<:����C~���2<ힴ8�?6��x.�r"�*�r�R`���O5�>g.��1{#N�� ϝ"����jh�o*p7O�J��1�de*\����i@_�%��,V
�a���3�̣TZF�T72̟?!�t��x��%�����B�oQ����)C���eG|���A1�z���̇�r�� �υza������g?��+���ۆ)*�m�R:�>�s�{[�^�d��s��S���ǰl�ͳ���=}W�cמ��k�Ѿ�+N� C'T|v�ϡO?H*�,~Gl7`:)E|��;T�������^mT+!ja�Ab*��^��`*�
�A�u��I@�x�����W�Ĕn�����/������p��*_X�~a�>x��////&*<�M6�G��~.���u��S�*\,�F�ʉ8���ʾe����Z�,��:Θ�!
�{���ܓ�ﻳ��K��|��-�r�����&3�!�
�8����^�����kci�>���m�
�]��-�{Џ��a3���Y��qixr�x�;w��gz����]
X'oz�y��G�	�k4���!���5���D�Io���Ƈ?_��_�����5���r����T&R�C�f�1*���Ul.�V�y�]�]��;-�dn�:��9�X@,�\;/(h��`-��_�r��&?���'n���w�X	��2X�o�Lam�92u��ׅ<����m@��dk�����Ϻ��15�r������g��S�~�x<��3ǵ+�������z��y��ۡ�&�_%~�*(�y�y��p�����v��0�?5`[:~#}b4�i/�P,�g?ق�_���rs���1��Y�,�������R�&��f5s��I��p_��&��7?L�f=��K�v�ϱj�T�MM�!M�;\5&j��#�jΐ�m7��E����aͲc��%8��f��-$��1��*�� q��;0E3P($�As�)+yY�捪8�����jvj�0?��x�N�8�B�7�0�	PKEePQ*pip/_internal/operations/build/__init__.pyPKEePQl�KT/�*pip/_internal/operations/build/metadata.py�T�n�0��+ʡ��(` 9�5���a�!'�Wk�$Hʮ��KɒIS]������$y� �6�щ����lT	�q�M�J�|p����Y�$����x�*gZ���\�N�&����}WXgJ���]�I��U�����hi_l��4[˥r#�}W�`��؁6#��u�����O��k���z��w���y���T#9��H�-.,�N9�[��
�C-��-�/���{'�E79����.DӠc�I���\�I'���i6�x�!�!��c��<��{�{�pT�Q:�j���V�� ї�9JP��5�&XO�s�C�q�W���M>��q����0�.sL�C��*-��H��vD%3�4��n��{q���]*�W��������I�V�L	�x�O̭�h���4├��C+�)<N�|�׈͌&
�4PF
P���3|I���Zk�W�jT8%�Zy��"£���&3����?�4Y�EƸ��&��l"n���7^�ɸ�ğ�ҕ9�?��gIzAr���1f�_?���濍��9fvQJ�PKEePQ��v��1pip/_internal/operations/build/metadata_legacy.py�U�O�0~�_a!R����J�a�1�QM�= ��_R�ĎlVM��9�������D>ߏ�>wM��
�qR�ÝԊԺ�)�!5T�X�;S�:#��w�4I�4Id�j�|H%U��M��膴��L*F����M����:^ס�1�
Â��\�:�k˖��E���F�PUZj�Me�I�-[��K�@�`~;�A�2!Mx����@�Y��n��>���-;�z~��]�\,.Hfy�<O�d
,0PO}�O�p���Ѫ��?���C+p߃-cL��$I"�$��JD�2�3��?"�$C	L���7\�
�`$�P���h�,�D*�O��ڴ%k�8,b��`
�+}���F�a�A�J
J�g�VY����>	�R�
5汀���k�e�!`\�QKC?��_��oJh��[L1� �|AL�)���H���VȱV�Ϡvr�_t߹y��0�@}�݊��R

N>�>���n`�v�l�G�N�R�w���5�Gν�6�݁Ki5Rbt��U���ۋ�5�t_�ێH��߀���ْ[����z�<�6�C��@��W�Ȏ�E>w�a3�T�����;��'��i~�j�'6�LˋG^9�'���m�H2z�3�V�w���<Oq	��MIU�%Jw�����oL��A>�~c�wwu��h��LJ�Ei�Y0�Ъ�U�1n��A��(������;��Y�#Y����L�-�v�V����>z�-���l�j�9����2I^PKEePQ����e�'pip/_internal/operations/build/wheel.py}T�o�0~�_qBI����x�61�jB��\S��6�C��w�#i��,/i�}��绊F+�VU%dED�T���Q
h�)ҡ�������]i��h-t馕
�	�eV���s^�i��gV=�ׇ��]�g_����f��9��Od3�
�.�N;�|�!+���T�j�o߼�;õFsп��k�g����@W�1�Bwc9c�7�XA)q�V�%�mk���X<d]�
2q
֙^�strR=�5�x�g�0�v���q��*�l�΃�}ҏ����3t�l�C9�����}����C(J"�H��{��zY
J�
w��|#It#BId�G�iAs�� ���m�i�����(�y6���g:��W�����֢��S�@X��EH���Q���~��T�P��q$&���t�$
Ec�ɳ��:N=m��׶����G����ƥ�|m�zo��8D���:sf?}���U[��G�NH�L�2O� m\_?�/�q>�őM�}���Ȩ�4��c�ïP�_��?���ULGEӊF/��m_~�o������\�Y�,)�?k����=1��O\�X�����R�oeiX�S	�w+<8P�PKEePQ�R�C
.pip/_internal/operations/build/wheel_legacy.py�V[o�6~ׯ�\�PG�^
�M�,���Z�HB�(�+E
$���wx�%�N��^$���}�6��1Qה�u�B�m��QTIѠ��)�\�s�������P/����3��L����B0�Wee:�<M���HI�ƛ5!�V�(���n�JQ�B��|u��j�0�E���b%d�k\���yyޚ�B�uo�O~—�-.���n�n��V'��Θ�jXB�3t�j*���M��(25!e}qҚ�]�1�yC0N�(*Iu�$�c�e 
�7�4�[��J˧@Ht���H�z�8��8M�]�Cp�nL&�k�@�Q�<�x�o�@2�WU@�'��{H�/ <��F`�k�j�^v��4uj�rH�9
��B���k~;R�Н�dj��"���"���dI�	��n�������)�..��\	�����<��t�t?%�T����O��Z� t֩�e��;�d��|b%�Ur��C����b�H�lډ�A��HԤiqI�H���9xb��g���C^d�2�3�6L��1Q��-r����3�
��0ߐ�$�\ʩj�!C�t���o2Ʊ]
ި��ӥ���/*��ܡB���:TQFT:�G��J;o���MX�0߃
ϠM.9p%�Þǒ�ܞ��p?0��'�FH��:�,��୪kXue����4�J��lN�j�F��)s����Ay<��:��S?"�dt����*;�q���=�/:Y�W�Z3���>��ҹtNʄT�O�}����x�_�װ`k;q9�x��A�2�(��|�\���
#Vu�9��݃:��
�*�9�wǾ�k
����g�yX��r��� �{� �Y���LMM�ݦ��K���3�<�R&�0Cl~MG|ۡ����dz�M��
.��Xi�r����%Yuu<�������3��E��S1;�
��$���h�ؔوG�>�̿C����kAZ��ᄮ��ie��:�)��$��ό݊��9��;��MN���s�w��� �.��>�aj,%��S?Л�;@��w�1�Ƈ�py�?��*���_��}8~ǣPKEePQ��{53,pip/_internal/operations/install/__init__.pySRRr�/R��O)�I-V(J�I,IMQ(�W��+.I����KW(HL�NLO-��RRR�PKEePQX��*:�3pip/_internal/operations/install/editable_legacy.py}T�j�0}�W�/l���!���mI�C(E��c��-����}%��m/cs��h.g�$�*�1ܲ]
�cY]3˥�J��YcN��W�UDq��z%(I�%�ŵ�*.*�J-��"�Z����׆��;pQ��ԡ�]‘V���]��"�6�
���gD��̕h�/)��]�t�/�ڣ�������}��F�m���/��|��{B�y�
7v��+�gV��O�ۂ���4B��!F��q�Z��5!�gq��	XJ�`
P�r��8g��s#*C^n���B������厝��2F��P�J�y��eW	��^M
�S���>|m�98��#U���ع�N�P�9�{b<iyHN(��AA�lu��r+�qq��B�RB�
�~�[) X�.=v������8�f#��O�X�t���G6���l�}e%������i�pQ���‹r�ٸ�47���U'J�[N[�V�S�i�x.�l�����a���@�F.Eɫl�@��*`/�,�n�f"����
���'wW��u0
�q�,n�tf��]���{�]V،�B�PKEePQI�MU��*pip/_internal/operations/install/legacy.py�Wێ�6}�W
K��@�t�M7E���@���̬D*$���;$u�.k�vm�3ù�3�v�WP��B�І�53\
�*����)P�I��ZڎB�h���7�T�Բ����G��_���RɆ\���ZS������
2%���\�[�qa@	VSxȡ���A�e��RRm���z�M.
&���U��A��d�r�K����ٱ�u1�6��`��Z�T��X�}�;�Tv��閻��Y��1д���;|��+ȍT�+j�6���|�=���ٛ���^���.7��E?����+����v�c����/��Ia��`��`�g�p+�r%E��{L�����'h`P~랢(�0E����ʭ�Y&XY��X^3̻�B�����v@a�-�$�M���_��'6��	����I㖕�-S	z�̰�F3����j��������ɸM�m�G'W��ȶĆ�O��h��P�I�$�*�*(��U�NC�*�܄ƎHo�˦�榯b�/�� 2*k/Y��)��}ƴ��Ŗ]_\�7�F�{���D��{(2-;����Y�aԞW��w	ZH��B)u�q�J+0���i��״�Ma��{\��'��]B�&C/�j�ez�Z��z��iRS�`�Yr���G�W��쓙��ס�k�0�)�+�ڞC=] %�`P�d�Ja��t񼡀�J�V[�)iO��T�t��!��L+W[3��s֭���%�ґ)k�r�MgBI4������W�u�woP�^���R�o�w�f⁶�‡��1a����0Q�ٺd�ϵK��7Et�'u.��[�Je�0�E�4#�����HK�~�{�p�x���+O~��b);Q�K'+KO�[^a�&Fs�c�XBsb��G�B��X+!�Ll�v�X�+�y�j
S�~r#��9���@1�a�ڞ|yB~2h�k�bG��8��@t��i���z �<�]�%���������/=T+�K>��0q��1��6F���Θ��r�R���+��B��I����44����N���:�x~B_�CA������Q��E� V��7F�y;�\���%�A�	�m͍[�{|���-�@[xoMFx���n�){RX����D�	�$���`>�3A��)�m�~r�����`ygAO�F�W$����V4	��)�C۔�{
Uuc�"
\ws`�ϲ8��u������;���wK+�Ul�<����M}�n�7:�D^D�غ��3��j�h�M
����O8#[;�CA'�$�5���~�2��5Ŧ1"���X�`�;a��xV�	�M�H��<�ࢡeF�(km��4�;�ab<�0���c2�j�p��Z�u-\;�n[΂��4
Bq�T�Ypj1��u�/�L�Z��G�A��	yJ�r_О��TѿPKEePQ=�s$Nz)pip/_internal/operations/install/wheel.py�=ks�F��+&��t(�v�ޔ.ʞc�Y�ƶΒ7�*.$�"@0�d����<���m]����LOOwOO�f8�LN۪*�F��Zd�j�<ϊ�+�h�|�_�K)&7�R��Ȋ�ފ*]^��m�&ޙL&;;�܈$Y�M[�$ن@�U�m#�����/�<��&+�m�,���{R4�m�g�D]�����.//.c�Tq�6��k-�'u�6�Cm-7i]�sY�J>��̣�s��e�x�,��Jr���uS��2햗iV��hSq�wY����&�Ȫg�U��ʪ8���
y�
������l�T�V�*S8�X-�j�ȧ�yz%��>8s��B6�|�Y4���KeoM�hG���O��A
٬�:����H��4o��ﵬ�LI��͒f[����񦼖vf@<��Ns�/��^�$�.�<�o��"y2ݎY�S|xT�e=�-/�i���I-�d��kY+x?�wb�+�m
����O�_=9K^��>y~t�����ɋ�Ϗ��)�}]�S�K���r��GϏ���t:��b/�Fn�[��.��I��|=T9<����2�2�p9��ѫ�m^ô��e�.y�Z�u�!IC�v��vѣ=���&��oɫ�/^��n�g[���:kTۺ���T]iT�M�\fE�,*�-�P$�M�.���4e���́�����[m�m҅�,�{�d�[�I�3��dB/4����R��E�$L@Ś����]�ZI���V50�2U�<ڂ�HA˵E���4%,�+�
n�(�Kz]c����,D�9������M�P\���ry�r-�r�a4�;���Y�^/�I3XR)�[�`�W�*��ſDž�-�=�eo��O�e���>�a[z��|,q�^ț3�]�K�;i�eS�瞜��Z�8��ăy�V>
�Z?�+����%���q�.w:l�:51��<I��R�o�s���^��:����_I+��~%�e�:�-[GS�t:w��A+x�zr��W�
t#2��>��s&�9�G�߼��y��@4"ïف����@1�T���B�҂8�е]VR5Í-⎥�iq!W��0&v<�k��k)��=����fb����`r;;;h����Q���,J��$�Xvp�Z�&�*��6�+������_�����vT�����L}�8��ڃm�J�R���(� �\䲸h.gd}�Z�K� ��2}��G��K�tiz�d��Ŗ�G�vSr8��-8�<.c�q�Y���`��C�`:�k\)U4=��4�"�6��BT��,†����O�L�Ez�3G��L���m�����*�uץ9!B�6c:����JnA�@i7�#*���
�o����f�LVОr���8nl@��5�}N����O���@L�XLcv�l'X�>����i!o�� 0�������6뽯�4u��ۄ-^�8�hY���#v?c6	�	��>��o�}~�u!yV��M��&Uf��t�?���K�嫧$��Yo�<���
D_H�V�ljR:�$Δ��xB��zZ/�3�&xގ��Fs�ơ~�2]�-šo�U��1:%��Q��Ԑc�Q+�O��ڶ/��A]��mU�L�X�$|
�ũ|��h6���Ei�d�wJV�$U�,��<�E��X϶G����75Xq��g6������BK#�dI]�
ڂ�à���lR�w�Nmń����>H�h�
 ����8����I�}=��b��yp�U%�`��c����S%���"��FÀ�HE�`�Gc�mG|Ô�LV����yU��x���(W�J/s5u|�h����~����-9�]�ز�C�A��Te��*�ax�q�� �J��i�����>��?^�ȯDUyhW����hFZ|�����m�Z��,`?���؊r-���"��BU����������� �ѽS�
aCS�1�v�&B�*��&���%jx����h�lE��$N��-�ů�)�5J=Q��6�6�����۲�ݯ�ܸ�=O7�9La4���nР�E�OÛc�@�7���|&����N��5�Ϻ�ո��7��d����S	&�U*�iZl��	��$���a���C���\���)�XXl-�4�yo�H�U��X9d���l���,�\�쿫˶�#-�$d‡�-(M��m�̾�N`W.�����b��z�'�����4xb�N�!�ђg���
������
u_dzv��D=j���|��po�t��<x3C�$h"�C7)�X!�K���|d�ӚKd?�P��ل҈�q\���+بpAe�YC^�Nͫ"3��}dq�լ��	�h
{S'���gZ�5z��6���V�2Ӻw�p8��d+1r��� �����m����)�5����v���
L�U�#KWB|gZKD�P���+����s�uO 1ƢTh�s�f�J0+����B�b3�[��3�i6^�f�.��P��R�g
�K�ٚ��<=;��1rg����[��96M�8cQ���5L&3��a��6r�Oob<��l��4O!@����?\@�v;�{���bB
~�:
�}m�b�F����3X8QOۢ�7�7[^�M ��-i�l��}46y�B%Yo�.��X��J�4.O��mi%�q[��\C�����B;U �7��hA���>�c:�,����H<
��SW>z�ah0��mz��A(wv����^s�W��#O�-`�d����@%M��p_���H19�O���$͎(d!)����k�ٓ! f�xyvt �(�MA~�� �d �-��D)����/s��ew�nIx�?�o+X9 �`k�� �����8�z�[��
�� �L�k$#/�W�Z�N~.�BwR�M�5z�g�`uÞU�7*�v�G�>�Hِ$mz��V�3��qpMM�m���z��ED�@]hIF�6�Is���W_��Ⱥ��*�k���k�9a��F�
bƒң��24^��kpJBG0�ˆ ��e	����XQ8,څqhƟ�CQ����şQo����?k��.�G�6G#m�\yB��K2g�	�g��Ebd6U����h����M�l��n���oi4���aRE��Q�zGU��s�Ti	�I�4 Ԁy�G�]d.9vȆֲ��?���-g��{�]���F�i��LX���R��7��e,���*���Es���Ȯo�ڹ��~���j��uF�m4�U���Ja�iP+�#ej�L;��"��LC�x�T�g*�1g!7�H��ߍ����0�.t��`Y@�R���~��X��+4�H��{{��e�T�`��Y����նJ�����H�z�?�d�U���̘�;�Q�/��մn����6MQ�qg`5���VW�CS&kE�|��%SHE��=7�� |�^����5fu�.�%wa�j���d'���}��A�A\�?d�
h�lIM.aM�J1�i(G�B�%K�*[�	#?�������RCF>��r�m?V�sϐ��M����:�e�C�aj�v�ֺ)LJ�Ȳ���4�����I��8�3�>��g���M/�i�$V��W��X�p�Ea1w�k�,k3�B,�}?�x%�5�N��9�8d~J�}�N:9�uAϭ��B�;�v�c�gv��{x��%n�Ό���tlK7nN�1V�p�8������1��4f��v|!�D�h�-����
"H�
�"�́����3�"\�Q���B�3 �#.
��W�!a����
���h	&��d��	��B�t:Y:�UYE���(a��wo��p�a�����=�9����Z��7�?�b:
`Q�>�}���Rb�.���5�(+k
���s$���
��f5�ɏQp=��A��2���E����GF7���4�x�|udrUɥ���~b��89��ǹ����A�
�UqݐM�Q�	����D�J��xm�B� �B�k]?%t�6�u)��Їrhs	˲�F�4�~�
#<���Oa��w����, \qE)L�ӣ�sqS#�t�nW�BߘLB�L(̫�b�꒳&N0[�5��B��E����7���-Q������1	s�{�a�g
�|���g4��o��6�X|ےy���EСp
�y4���ә�)��Q�����9O���n�)/���
-���u�]\�c/�I�}pnj��b��%X��,Q`/
��(P��߰Hsi9�h�I��u�Zp/�}�bA�J��eӸP��s�a|7��g�2�&̮W�L&������.3t3a�k�,�Rz�c��Յt�37yWn�J�	3$7�e<�a`qE�y���f�F`�[�L1��-+�Z(b-Z�,"a��,��n���甚��i�ո�ⴜ�?���.��j̐5�?�	�:[I�s���i����MO�J�J��NJT&l�K���F��4p3LU=�1j�D��0]
�j���z���n�|I�=hb���Y<����118/�+ZF`A���ы�ׯ�N�O��'g�/_����aȍ�>�uZg$U� 8��\?2�ۄ�1g�̦`��!Ӽ�mu
�%FY�㟈3@֭1�����r�\3��h��xң?�?y��T���4Q�$�t�\^�?���a%��\l�������ѳǯ�?�;�����B2�\�g����̈́��zc��y���m�hO�
X0
0�k�����'&s�b�N�7�����so</
��|Y�Oav�١�8RO�B/�8������p��z�Y�%�h��<��:�И#g-�����HXs��<�x
	�+Qg�L��8gs�U�p�'���q!��ϫ�����/������̥�lo��idn��_q_XG��o�ԁ�B�틋?�������K�++=�n��#��"`P��!YȂ!?*q>�h�����4 ���oE�B��l�M`vhw�����jb��An�CoѴû��t��7YK��_���U߂�!WT��U`ڃ�� L=k��
��ݢ��+ɟ��*�����k^pX�����hq��@�I��?`?�M�#41����:B�r@��=)�0�D�[]��w��	���!������Ru$
�����-�<
Z�����	��&�j�c���d�D:!7C�y���Z6`��h����������Ws���k1�Ր1R��W�	D���A���S�������{k3-O�m�I�`�s���G��Wp�
l�I���X���g�M�4�Ut,d����-t/�g���H;�X?`Jp��	�qʶ�چg�i��9if*�����ϊ���g`�.y�T ���w��c1/{K���J<���%2Y*1?Ⱦ$xS�-Y6")웗�<Su	3�a�%"��X���4��1D\��k���h�<�_�K�e-�
�o@�N��X`50�z�v�g����0P
�;�X�.�2�
4�.�H`��г\�DW�B���.�T�S�d�Y�J�I�s��W��WNF���+^��*�h(�ޓB�1�]�Դ��Z��p�a���d��K�
����A82X�7�	��ga'���4ā��9^ѹ���N-J����	�7_>R~��wlg�e�4;]��Ym����M��3�ߎ��}��ll��͟g
q��i��NQ�,�8'��
C؛�h8���u48��0��(��M���4�V&��Y�X��'�h|�K|Ta�����n�'k[���L`�	T��b��7�>���6�.h�=����ZJ�u��B3����S��Lqѹ^��w'
��M[�3�{�1t�XW��{����#hX�@؎�{P�����.���Ϟ�aɖ��}L�:���ʋ.	�#�Y��:��6�p*F��A�-��KE�'=�8��8>�`�0zeߙ;>�{�z��\���wG�����O�ym�2*��I6S�:���SA���"{=��ւ����g|�Ft�4��d2ъ�D�u�.
@�бp4%��@v���-��N�T���~�B��A�UwfJ�i/:����YW�o�d��և$I8cC4~q�W��Y泦z6Z�a�z�HZ5W�x�-����扶
]�P�a�����4 <��Ag��<!�H�T��]�ͣ�Cr�ӗ���n���A$�q	6U;�r��F���6�H�E�d'�{����t���u�X���*�؅�Y�\�bsr�������s6��}�9�O�UQ�bݖu~P�o
�<6ի�������^�>�I�2�ڪ´J�Q�:�&��@U����=5� |[���l�{�D��kb�3�}��9(0��\B€���[���O��n��yS{�=�r��(���;rk��P-mMv��&�������1'��x4��h�>?!��o���>O���)5R;�/c�'p`�nš�+_�=�} 40�W1s�s���2�1�͗ЏF�p[���#M�"�v-�$��5ϝ�u�^��\w�Ci�y@�n�Z1���T}���x!)U��Աl'�V�ζB��%�������T�j-�-�̥���
���$z�X�8q���
I���C����]b���M/
[�U����U�!)J%7�s�$vtXi���Z	o~�o�u���Ϝ��J�yfU���J92E�TՅ�&g���.e�
o�D0a�0Ǧ}�;죪�a��&���.�I?R~��n��
y
&b�c|�[�k�)9�W���y�-�:������gY`e`��Hn�OQ�j׃~~���<+*��n]^ޢ�n^`aR�	������.�2�r����_vc��\=of��:�JnQ�yw�l6Wa�����$�:����t� X#i��#�dž����[�@ZE�@w	�)���/1<GJi!S�B��
�r���p}/�߱0�s3���M����u����0���8 m�G���?����%X��l�����O���!����q:�L�>�ِJ�.���l=kO@F��	�u�H;>�"{�:�����a��q�5�O���*ʛB8�Zϙ�ADTqm�Йf��\�؉5��¿�<���T�x�E0z�av����௜@W�(��
�����1\�wܥ�����UWC�6����v�w��?�CQΘei�X���sU�9m��w{m��|�I��^L��;)�!
�Z�;�ݟ��������Š1g�p����(��l���K
	��3�ܼO��[1�� �͝F]�?�E��՞Ӎc5^�O�b�6W��g��>u�#+��s�HUI1�S`\P�mĬ'1ݥ��+��5�b�ϻ���Ņ�؎��|�̕95:̅�U�n˿O�v�kx�V��8�'�I�]�H�k��@X��k ӻ��d��M4�#::љ0<ґz:��������WE�-�\F��c�������=u�e��w/(�������}�L��Cs����t�`A��Sp�~x�n�(��إ��Q�Wm��O�9dpN��Ι���}u��.h�߸
>b�*aܢ@[ssc�f:��_��O���C�
��J��ux�S�v��*J�n��H(��1v�%^&�V-�m"�H��HL�Qmo��*yZq���- ?��
�I:Q��n�2��g>�S�?b�w*�Te���K
�U��*\�E뗻�u|��Tx�Rt�WY�ecʡ��4'��#w���Y�������mM��Yh.�`e�z�賾�f
��@�5l_��0��Pl�r�vk,����v��7"x})/�xx
+�i�6�؇�o1�"Wx��*�U��M�N�I�9�s1-���}e>�g��ۛ����Lb�	KA!%���j��(xW<�)aL��Թ���g�|�S����4;c]�Ώ=D|�.}�w3?��®b.@Rݛ#��i�;�m:�믧}/�^	���iB��O����L�?�_Lb������!0�WFW�r��U����R��%8�D�sZ_�#��65��Т�~��%Ub��܎�OEKS�$�
}�,p�1"����Z��ю��uը7�[����+m�a"͌1|�	������Y<ݰ����6Ȉ/�m^����ޠS��UA��\�h4���c��_9�6�V���w���W��;l�e^.�_��j����W��S���쳗����v�ۚ�]Q�U`���r�����Y��+�P�!��F����ş��	Xl��􃙁�075�Awe����+;{_+l��w��?��Cc��z��������?rLH����
�8x�ywP�~�����9cdݥ��9 �ˡk�*���;��N���#�v��;2�9���>��U�[��ơ�?~	�-31���C]_|��s+����H���ѣG�?���6�B��r?�돛��9��д���=��Ѫ�{���a�Q�?q^��{Z�!�h{�>�=ay	��1��h����ƞ�G�)b����ޅ�THF��Bd��o�	��U�M�_��=����WS�G:l	!�ܣu`���O0,� ��Ŵ������<q�xP�у�:O$^��^�]�x��YC��
��{�����,���:c��,$U)�^�i:�W��a����=�X����>:=;z�|��
��B�Gw&vڡ�	aᱚnč~�ht^a{��/�⻘{�-aj:�_�>8����h����H��car��p��r����h�[$�C���0"����8t��9���š-�y�U����fX.Z�a�&����{���D��Lg�4t�pY�5H���f[a��o��n�4g�?���I������<��	t�9�j�~K?�z�rF����D?��^���U�|I�,_J�~:���1�����A�u:�'�-fn����C�m�x����[K�M�˨S�>v��m��By
hK�o����F�7cۊ��3b�oX%���N5p�c����<��K�{~Kb}��`����B0�F>��K�'�	�M�����R��,�������ї�-i�w� �]%�
������~X�dߍ�D��)�1�5�{�/����9���c���o�8j?��f;�PKEePQ�=���=pip/_internal/req/__init__.py�Vm��8��_�K9�����^�.m�Ƕ��,A(�8Q�H�$gJ�{G�ֆr�aI"=3���3�m�:J��v(%��*m	�%:���$�y����r%�x$�~��>I��mA���%Eg�0ŀ}sY��O�7��6�x��O���W/����n���҆�-�(�v\�Øȥ�L�{����րq��R4B7	���/��b^�*����؜�o]��������|�ZIB)���{�,#or�Ys��=v���)�=?�t�x�l�ĵ4FzS��g)��Q
Y�$�`ƌ�b��=�N�T�>��>����R�MN����=/\Q���\�A�֙����$�Ճט?��N7P�r*T�ٹ.���d��Q��l:Ev��'&x�첒iһ�O�k�ú/�d�;q-�����������^QJ��84��s)�A�2�K���O�Xu���AP��7��x�M��Dx�oCi�R�oeq6�/�ae�%�q{�v,gg�j�l�l�������o!�LKj*�[��*���`���G�45�BО+ulqq=�|N4a9Q��6����	�@��o!I��o��+���T�4X��$vr&�z�B�ڝ˚t�e����l&[ĵjڭe��(��4��ʦόV�#�zr�ag����Up٨t:t�Ր�c?�G�#��ʗ9�*>+.�9N��&Ͳ9��&�?{����`7
K����á2�&42,
sP���`�Z�jr��E�(Z,C'G���([y��J�L��-���,d'Du��a*%���G�A����R���,�V���!닜��(�ɒ�b�v*���^��T���7S9,�($���躊w7\X�r}�)���W�
����*h-y�?�ɺ//���MR�+L*KLWU5J'{�3��q�3�V��OL!n�9��!Կ��bd���J3n�t|��D�s�6͖s1�
ֶ �4�Ӵ3����4�	PKEePQ3��@!pip/_internal/req/constructors.py��o��w�7z�Za���ꚥ�b�K�$�V�.{"Oc�Ty�5����}���؆	H,��޽{�� �ʳ��Z�b�+�VT-o��b��ag�lyY�?�BɮyS�{ɲF�}�֍��^o+r��F4�M�v�[�OH���"g�m���m���W��e��zζ�5� ��W9��ݮnZ�7,y������R�[	 \�:+����(w�j#`��3-Eۊ��\4�}��eQ�k�lA{%t88��m�Z�s)�^�����|S���b�b��jKV����W��y�Y��OV��5�<��|k�l�j�-O�kQ�u��o�'[�\�a���z�mA�a`W�U׼,r�9sn'w"+V���+�fd��:����;���MS7s��碑�K��FV�L��L�Ph���I�	�ز-0��I���,|qxq6g�A��-��dX/���2�C�f�?�al��k�7"k��-��}��x�[�i��ܣ�8��}[���5"Sj���W"�^�*J�v�|������_�O��:�������Bff]!
�|Y�4/��rJ)�ނ5l��	�/~H�<;}���wϟ�=����}SZ���i[��nl�u&,aҜ�+���Ȏ'3��#�~W�9���@��%�����{0�s�]/�4?��`U����l��@�4evN�M���h�4�#� �0�V*M��g��Z+0�c���h��wQ�V|+�4��;�p�0��$���+q�Q��b�$�M�)��-B(����T��|N�|ɖu]*܂�h�M�^7{�NJ���~B'��K�[h��s��7H�"4@�Ȝ���eR�7p������2��P�9�O9�	}��P�R�p�N��d��:i���K���ֿ�6Q�%�qtq~�������e��pN��#�v��y]	s�m�8)BU�v�6Y7�~=���g6�Hd�\j�3��&p�Z4����ӧ�G�(=��Uu���#E�y�_8j��gbS� 4;�0�$ĉ������:t;O=���!��	.�X�N����� �mݝ��;�2�V컗�8/�9�f�Z�Rz��k�q�p�����7m�;���e�7��F\��z񴮗�9_�_.�(�K��c���+a�T����sY�� �,	�؀�1r�;��=[����L�ʛ`$���#�� L�u���Pa;_MaV<3�U��K
	�<qG-�f�x[�VF��M]TQo�$s��P �8��r
(E�;��O��YЎ���܌�8�x��:-K�N8�U8����	{�>L0z�ś/%��:���O~��c��y�=��_��He�u<F/:�E=�f�$m�-%E7\*���r�v�R� !�X�oP��`����[rL���̓x�?j�H4�k��҇�#p/�]P�Ѣ[�����
:�Fs�Y�
�-�]����}�1P�F���&�f�JԳ(D򝄱�0?
�&$��'`& ��k�Wv��6�F��!K�}�Q_��n����@c���Q�Hz��>�m��
7=�F������1Q�V;��[C��¹����dlE���	�@��h�q=g�w�����w�Y��ޗ0-0�dV ���f�d&��r���W�������B"?��l��E�o���
~i���R������u����"�(���Ds�(>��nt�Ř9]��@ni���(F��g�/�UBjul�Å���S��$f�#�ȇt+�qD�Oaу�X�w�av1j����8�B:���2"�&!����a�	9abF�&���E6xBr�PrѢx��-bH6�ݥ��c����>4:����I]Ă��p�0.֤P|��|���`�}���n	MᯟQI�W�C���T^���f^�n�q���B�
;(N�ŵx�[�pN\,�@Ά�W�>��	t@�ș�RV4)鈏��ƂP��"�H\�*g0������R�#��UD�6a�y�%Gz�U�Ȗav�P��*LA���h�Kб�+�kn
x,��f�'QyCy
YqޓJ� z����	�BW;���jaTN�����B�9VQ)$4`�J��t�:��k��� ���o�Ry��*���G���ڑ�b�_�<Q���A�(ʀ')�mӢZ�[&�h��Ӛ��X
LO�`p8m`)X*��������*LRE�����(W~�Ӹ5bkFlJ�lt�����>
֡����|b�*t�KL`�/�������p��t%4oU|t���_؆�#��A!�^%�>'i���Fi
!]�-�ŭu�.&A��2,�L[=XP��Jf}��z`&o���8!ɷ�N��i�B��\3#tnl��:A��Ah�����լ�C��� 
(!ڣ9��9UvU��GD���g5=�n�P*�χ%*{�z��t'vz��I0XR�3Y�X�_P�ҙk���H4	kܪr��:h�xQ��p�&Ő�,���E�$�#-%g�ܡr�x!v��������Ǻ�ݰD者d�rt�kͅښ����Ҷ���i��}�-��gH�a����K����_���~�&���z�'��c���r3
G��@��R�~k���	�Ӳ��dZX��J�}�O0���f#(SŘ+��p�!���uE30J�ي��_o�"[w�BUdq�h�!�lL�s�,ٛ}��jHmT���:lI�
L����	����,b"�:�j�"�'})0����T@c�N�M�S0)�uIJ�7�N^���M�m@w��?Q;^%��֒�����w�X���3�|���(7��"Np+3A���CX�:�)�9�o�&$��<���U�(�s�9f8�/���L�W�i�v�&@�H�	¡J�-s��S5�g�:L�)I�	+e�m�ef�m��m@�$7�R���j_eԬ�g����;a����WD���,A��+���������n�F�(�a��z8n/<aRm�^�X���q��]��&ܫ��u�!��klE�!aϵw��~%�ª�_Lu�Fk�|B�9�:�.��;��s�3���~K`t�8��	�(�U���bg�(�h��}�`�/��ݹ�/|�TN�ek��%���i�V(����&�M[�9�t�6�%~
�'��Թ�
o���I�>�
�ܖ�1�s`��2�n�HU(�|�mM�JY}^�fJX7���5U7�F��I<�9)��m��Υh�,�B����sB�y?p
{�,��]�����n?��]B��(v�2b0��d������*��G�C�p�]f�3r�=�]�;�F���lI��I'=�	��3���e�M#�\�w�a>|�G�S'f��ko�r'���}��4��B(mc�r��~m��A�j�X=�D���!�=�.>�(������=���"�H>
UR�7��i�e5�$��rڀ��H���~��
�V�h��Kꪞk�]�3���2M|����$�,�85o�/�I�����.�Zx�ї�������z�L�#��TJPlГ���S� Q���bd�+D1G�ac'#2ym-���{Ut�r30�3Ge���� ���t�zk��.�O�=�h���\�h�EW{ﰩQ�I���L�UYK��c+o�.�
S&ް���<�M���	ʰ�nV/&�Qc�+��p�B+3؇�~ru���A�9���ˇ��x�x�~��,ī59�Q�:8ھ�=����f�z�J�`m8Z}Q{���9�O�Q��8^T�
ڡ���|���ir���c��|����'�Y��r�(yx��\= T�:�7u¸<0�e��VNgL��ULٷ�X���*�����ҍ
�k�kɯ!o.���(�|P�ZB���Cf�b�WS�&��a��i�%�IW�A.��6�>u���ػ��@nI�t[au?�0��Y���1u���]6G���H���>gk���/��@ ��T��Q�
&{�i�`OI��XM���a]��H�x�Iض��V�qW�/z�X�^U<�敪$n����"p�`tM[�2�9�sW�;�.(/���E/VBj�C��mF.d�K�jD�BM��?�;��}���ͮ����E����h_���D�c"S�G��V�Q&�ΨV�댶 ��[w�l&;C��!M�2��3���z�8�6b��i�>���V����j��qw<�+���n&���X"L!ş��7i����Fy)����Vt2b~�6=�X���\݇�L�=�+�л7�T�������4��-p3+0t�I3�x���[DP V�J�/��t!�$��e�����B�Z��Šm��	�~���f
�$`���-��P��8�,��)3=v���Ǫ;η��;�ogԕ?�[d��~�����k��&�X9�j���
�7@��6z����™>�{�W�n�8�Hw�ҽ�ő���?J�;�mg3�����
�����"��6Y�%տPKEePQ�$�~L�Kpip/_internal/req/req_file.py�<kW�F��W�	9����Ύ�=!{�0k֐�d��Ew5�XH����[U�J`�͗��1H��uߏ*����[��.o�/[�Vy�Y�5"//'_A�d�TW,MW]�5<MY~UWM˲Q]�S�>���U��pnޅ��1�ĺ���F�E�N�k^.�&��䪺�"隢�/�47���S��5>/[ޔY�,�\Z\-��*E�#���U��&��R�YQdش�4U3��6�^����濪����Y�X�bQ�\/tLߎ�Shd�ۛ�y�tm^�,<]UM
�]pK4 ��Z
ɺ�J�>W���Mm
y��ѯ���?�����o����H���)��n׀)`�U`�9���\���}���>?��{�T�(�����XY�`�r�o������C�sV��	�-']
�h�xү��./��CRg���% _
ɑ���>�M��(��������D3�ӫ���]���0����\v�~�{
t�(8=�.jg��$H\�I�B?��=v:%|����S�rz���݇>
O�U
0E��Ѻm�O����Z"�Og�� �<?|�z��I`T�Og��x+���)`x���Z`	�xy�7U�����m�n@�\�,/��돯M���?��Ow?O�MޮY��0���슳�/P��Z��,6��k�,2ં��M1c�2-W58��S�'�x �
�v��AVEQ��ttx|�w�V.�fɖ8�/����}v�.��GO��������̑͒��_�^���{������>�︅N��G����o��1��磣÷'�/�ã���7�H9�~��$��͆-�
M�����l��0xNxm6�+��I�
(6i���1�E^f��kA*���
_�f�U��3��}k�N�|��+���D��7�ghg�sƶP+�9)�S#�I�̌:K��A��bj.�V�m��F�b#ԧ80���N�)U�ėEu��7#b���%�d�Aq���<}�|��Cߨ��G� _
�P���PS-
�#���,nT]��m,M�"x&y��i�����̼Y؝��4�C.Rõ=:.��0]@n�HQ�[=�9zy�B�}�MU��h�t��K�k0i�i=D�������|t�(��vPd2�'��v��ݬ7�[�#�տ����i|��h�9������\���삖
���q���m�l�S	���#Kf�&������z��F����RX.��\Q�I݋劐�o�fH�uO���Y|�2+D��;.h��@@��Q�?����ٲ*��ׂ��UW�9�pl��7�8Q�-��>:��#��l@bj2Ai�}D)7�H�rr��ϕc��Uf�G-���nx��56My�j�{���h)��Dʸ螝��B�|$�U��� �I��y��#�^. ��1��+��9~;�;
�z���=RQ�Z1%�2�{�WF����FFC���=�`�����X49�`�3VO���V�4������S)���Y�@�5G?+CN��,�w�O2*���0���D=1�4��Y�&2�`M0�p��N�#5����3�}�������j(�
 �}.N�D��[̜-3���%���l�?hs{’n|b[�[�A`UV-"WI1�{j���@
D�n�ٳDvI��Y��.r�������[�E��P^�Fb]��d�n��_��L��y\j���@����$��>Q<��i�v�~sޖ��p'����~�e	qm
'������oש��
g�gE-�wN,$��L��������I'��H�5'IC���1̅��^��f��3���%�&0�U��5�^L�ϱ��ՠ���f*e?�E�^�#i��0 �OͮU��z˗�ݽ��3�c8A:�:5o�C�	R�!+�Ě܈3)��܉�Q���9�n
ݣ��љ�����p�nO�;�o����f��zJ�$�4��^䂐}��S�R)th �f��|��.���0�!���˚/ާ:��!��#C]�xb��l�eY]/�`"탱�����c���"z�q=����B�4%=�>���<�d}�F�8pc©�VT�?���Ε���u��P���Y�~���Q�rK�������Â���g]�ƞ���Z'{�a��*����ꛬYt�0M9p�G�x�Wob��D���O=�	c^.#O*W�V(��NJ�=9"��3(֖Z�V�0qB�X��R�E"��%:�mu�y�3Mg�r�<�&щuty1ؿm.� m/�Fkr�>O�
�˃���Ql�MՁ���(U
��=�5�X }��U�6w�f-a|���nKB�"+z�����Xh��5�r�t�����~M;ہ��e��Y%\3�7�K�~�.�4�U&�@�m�����7z8:�Ze&�r'@ԫ��C.��N�vPo1�������
+�fU���s42�ް\�3�^����s��
��_'���>��IZ�[V7T��^��	����u���^�it���+CF��"*(���/qI���HO;&ɖ��^2�2�Z`O���-��qys�oX^cx���n�̓�tP
Z��O�һ�Jh]������ݡ���`
Sn�����90;i��5	O�Љ�@�df��h��`��ϝض�
���d�>��i�/��&��* �Oa�ʋ�d~E������
st7����c�e0��eed�	�wd���N�ή1��j��0���F0��y!�lCISQ���p;�e��Z�+�geW�F�*B^t-�-�J�,�]V�B=`�2��=߲�D���Tz�i����=�+�q�dSİ]�(+�u�]�h-��N
�Nh;�Q������h~�	>Ib�=�r��3��w{���`I����ŊVڒ��$�b'���֏����dg����?��Xm�%ߨj�Hf�ޕ�;Czw&Mn�M�G�L�/��ޯ �j
�dž9m����A��ڨA�L����}7��zT���(�_��t	�cIk̘�h�9�=���R�ܓ�b~�������>.{F�g��1�
\�K���Gè�Z�(%�����(�d�u�����>�S��"�`a(���C'�f�Y/P���;>~-���-��gm*�XQU�P
��Tט�m�:�:s"R3}����ʲTnU����àwm�>ތ'k)��V�����x*N��#@�\�l���n��['�v�g�B��>�b��b���ܭ��|��AA�ԍ=N���ܢNI��nz4��ڧ,����4�"���jW���V�rEW�T&�ྦྷV�)�@�A����Ee;��RB�:��|���ɻ��8�g�.^Qp�A �*�ZK2�����28(��"w��}�|V3���)p�}��F�u����W�	�I�c��{�{-��Ϙ��,�ȱ�Afa$cA1p;�Q&*I�9����:�D%����#$��<[�%�-�@���(����=��喛 �Ǹ����v�sl#��9\�1AL���<��ާ�a��:R��@ɪ�,���r���AĽ�����ZU�@ ��Q�c}�b���ɓ��h�94kK6��teN��&w�'b#�PcA<���,z<cOg�I<L��]����%��]�ȝz�m�s��7;��ʝ�ݧ߅�2�+�M^��ѴkW�ZGAd�m�|��,ץ=ٕ�|�RNH��S":�������O�8�t2��zR�:Fױ�>�\�e�󰮶N%V$4��\�<��0<vIY��,t�7�p�H�Js>���3��N�H��l��}d�{`$��f��d�뵨���UnMb�d,�g[��T�'�Waʦ�DKF_2��r��\�fI��@��f�O	8(�t�Mr���z"���{)�
U�����'uUG���D�I���k�]�]|�S	
�F��J_(?!�$�}a�h$9 �2����Q�f�9�',S���V�?���>��%]��F���\��E�$JkU�^%�V����J�~���p:�0�3ɦ/���m�#�*� ��(��P�>��*��F+��� �j���s�k����e���jM̑"���d��g�Z�&ʼno��zس�$e��
���Զ؛Ó�9C�͖���3�h�o*.`Pu�A�/��|���������텕������Æ���+���+�$�yK��E���f���y��2
���}��X��ë�8�>�'�~�`�"K��c�ojԍP�W��T�&��X���_43������+Q�6��P:��Lj�Rer��&����K�i���ޥ�3wd���&�`��f��l�	��A/�r��܋��nц����Q�Ct�N��āQ`C�	��k:T�W�P����<��0�YoΈ*tgj�9Fc�i�����&���'��s���ù*�0Qg�d+`4�D)�[N+?D���cD����R�	g��n7v\���+��Qt�T����,�9gt|�c6���k?aoy]a�"xC[W`�ͽ�R-�k��y��U#I�N�3Ot��L& )ⓡnpv�ru��j���ߡ�����7X�Ͱ���~ �����8;_��E`����u��q��2�9�l��ES�#
�kq��v8\�XϠ�r�}�M:�&*C_`��:��_朗guW)x�v���~Ǿzu�S���n?�K�PZi��p� DAt;��x��{�f�a���I�販�:��� 8�v���ٳg�Ϟ>{���2n���Uު�@��-}sI_`�]�ν��pQU���絚��?B�>�'҇�9w�9=�sxǾPeRw_�#���4ak�F�ad���]3x�Y���ByXT�CEA�u_���U�[#�?�V��d��\�:�Y)b�m�~~�
���4�Y�%�ϗDxl�U���/�>W��BP	�DUx� �b��l3�7P�[ \l23+��5�-��|�5�y)�.��r���u� ��]�=���
R86'T'��t��KD?��܎cԩ�z}LT*x�r9��K���r�>�K4��DŽ8�~k�a$�To��I0u�c���ʠu��Ł����>~:{������x9���2���S�&'oMp�%�}�O�y�/��Ƨ���>T��Z�<�gg��L�;�,��:]6xj��**p���[��"M-F-	i�h7g�	�1@ݲe�Ϯj�����"�ΐ~j:h�+�ɵ�-��t�XZ��C�$�&�����U��]�/kY)�k��2R�Uzpؗv>,���l��t�����P��ߦ�'��(��/������o��l�_���'�{�PK�mWڭ(;�"�� pip/_internal/req/req_install.py�=k��Ƒ�W�r��������tb��N�tzėө �%����~�=��]%��J+r0�3����܋�mXt��u{U5�h�[֌Ѱiwu�XԳm{��(��vˢ���y�D#6܍���'���۟E��W�x�vc�6y�|��;99��m�e�v�Eնk�1�WC[�F���''��n�k����۰ٍU�~�Ճݮ*�_�e�]ե�%kʶ��v�gC��6$�P}���]^\�8��g���	��ABx��5��6E޴MU�u�+˚|���d��m��ޡE�����.'��ۇ�K���렎l���jۋ�y]��D&,?�aq�ծ�ˌ5����U�#>m.��m����s��BTϛa��r,|�mjV�En�Z�1�
�p��oے�CZWͅl�����0w�O*ݲ1/�1�=5X�e�d5[��^���>H\-�P4=�]�ї���U͂�J�����ew�����+�,�j��_H���Ӱ�6����
C�}׷c�)�*��v['�6�`Fa���0`�/�5r�{Y�Z�e�mA�"-Y�3N貱,b�f��``���6�6���[g��&�p6��a��O�k�����%l�J��l����c"�|� �f�s5�CB�+�l�.����e5tu����d�\a��P�N�,�
��݀qd�؋c�O�j�C��R�����G��d�Q��ge�w0B1=YL�@�m��b-��ȶ����~B���$���4��e8�f�3z������=�����޼���?O��>������^��������B�|a�J��qrR��
�	�I�@#�J����;��-Hh��v�\��~D�yR�n(���HȦO:�h���б�:���V� �8�z��Fӟ����	nJ�GK�G�@]/�,�H�ȲT+�y�Iʏ��)%A-�Z�Å`gQ�ZD����fohvM�ۺUjV%�'�x�%l���*᧺M%L�_�䗑?´G�]��:�/-�Y��~�BƝ|“hl�4:��LpP����	i0�we��1�O�D��Q�>l5�'�q[5��T�=N�B����l!	'���q�R�^�V�y;K�Y�:��[NU;4k�YO�*,><�H�@�b��|;G�ebx��s���X����,87ѭ�^3�P�D�~�T=�����9''E
�:�a;�|A�*I���~ s
�q�\p܀���h�)����=����6Wx�W�n�@��R�9�
QX�jv��)g8Q�Ʃ��s�yHU��5uH>"
yU����9p�j�2�ځ��m�:�LF2��>��`���$l�	1�@&I�5��r�Ԁ�j�Z�B-i��mX�+�#4@��'ksƬ��q�k�	E7��LF���č��ᠨD4(Y��*����.m�š/��`�*�b�6u��xaT�
�4�gî��~iwTB.MSr8����RУ�	a����ؠ6"Y�f�)�X�4<�?�JETI��+)�n�Hܮ��(�/�,@�,���U�p��,��m4�k-�%��'�A�����LyV&��]�*
+SضQ|W���7D
c%�,`�#��2 um���{�%�j���K�g]޳>�i�8Xk\�_;B� {���j�ޝ�2S�q�l��4�SοqD�C�B�
ŗU�f��ћz�Z<cr�+fm�
,���n�4قf9�²�2��F�H�ۀ�/��?�V����]�ݶ��,N̙p'��{(�p7��S���qދ^?}}���7/L"�j�%��bf�l^���}�40IQhaί���$�CV������zh��^�t=]=�5�{�?%��[��U���H4Ģ�^���t+Uj-g�P��)��9|
�`)5��(�V���eT;���;�+:�q��^�sc�a�^�=^��TV�M�6Y��0���5�7�N���6m]r�{��&�9[����	���˼�m��w8����2:IUf��~ـ�ʸ�W�]T�������_{��&�o�3]3�Â2[�g�rN�&;��/C:�ѐ' ��fPF��+8ȇ-���0�q����9��î@���jQv�RbSe���]ۊ#�(��H�ha��!�uK���"�!ч�6$[�@N�qJ�`Lu�X?���\���	~N���A��	�.���@�e<Y��P^T#(��
(��W��TPPc%u���g���&hg����	:�ۮk=���������E�u�HZo�b��0e��`1b�G6T_��A�5®�����
�p3wݫ'��8o�A�m�C7Z�AĖB�������WLA�!������ܓ"�\a4�g�U��}�M�bA	�H���(�y�۝��k�^y�\@P�dEU2N #��c�Q�A�$][J�)��0�-�H�^�]�z�����6���}�ɛ52YXt��,�Cf��Sq8��+��ծ�ݯ�`1^hN�yf�	=4���wIPo�brWJO$IK�yנa����i�#+���f������t����qfY(
�fؑi��y�j��[�D��q
g"�.R	u�zX8��;F�聖f�p�Ǫ���71��Z֎�#똘h9Lwn��!��Kx�ź�@\��"P��x��j��m�,A��1����z�놽�]
\P-�I.�ɑ���sw#��@~ഹp��q�-��h6"	瘢���ɷA�����Ŀ;d��!�I�:ڽi�#W�(�S��p���f�!�f��v�83�d�0וP�K
N�wg�lDOۣ����ݸP�
	9�u�6��^�VA��%Mݗv��E��a�,�P�,��!9���gO��c˧��k�aC;����<^q}3O�[7�cm���{!�j�n�v�0��|_�s3�9!�,HU.@�2Hc�f�7��������T{��\��;�*��ho4�|X�kc9�\7��;��cPSZGDS�4P2Z(��F����VE�N{A��w}#��3�W;ݯ����^��7����%Y��Xe���"�]Z=P/+�j���`g��
���#W�y�q޵`_(YBE��&�%��J�2�>�gC�X[���.�
�؈�]��fm�61:��_?rW~%ōwC��Ax�
�U��Q��L�E���^Q��%�,�[[51�^$�hN��� ���(�����@	
h������?��%��p�)�S�����I ̊�,��x(:�GJ��R�($)&��@e���*`H��`MuV
YW5
P�άH��_	G����p�?d>H�H$ͤ�Ÿ�7.�v�����S��\.������ߋg 7›�Ȥ�S��M\3�DU-��C+����Ո��/D����|��'�]�o&W��"��f%q�"��<�̋L���td�7A1��@���G�`ߠ4w{y���I��@&�3@3e��#�%���n��Ǧ)q�r���r�r�<�U�iVE��?�aBH����9�>?㣸�C�#��!EK��	
�?3�c�nF�^4`֟�۶�DJ �e�J��y�zs�A�Y��X]�z��
�}*@`J�$<V�c��y��C7e�w|p���\b�yhlޝ����Q &~�q�(
a	��D�����E�D.���D����a�9Ŕ�c�d����$21l=���ۮX�����q�`B�u �ACj lAL����8=%ۺ޶�uG�ۍ`DV,m�]_lq%|�q,��=t�U[�5���T�K� ���&�jL�m�-�Sm�G��!J�:Z�Bw�	
1J���4�]�띵 s�Wy_FD�y�nt�����zCz�Z�5���%X�
/�.Ƃ��y�ؙ����&�(�3[R��&�к�h
KN`��D��Q�1^�w
N6�Y��v03��aV�aOx=w&�}�~���*�H�$�g35cP�F�C�Um�^}��H�lBS�G�˷Jl�4Me9}��4>#6|S�eU��G�i�T�ȒYU��,�_�dN{����Ԥ=�~�%�F��̹�V��<P�<�P�O�04�p'�~U�FC�h(�	���ٖ"�B�
]�[@7�8����F�_"�㕏���-�����l�i�����P���ι.���۠��P�=����B�f��O�!�f���gyyS� 6�+S��D��
�JژK+�>}��?��?�$��z�t�H�����1X�Po�/�'D���H��|��?!)�a�J+����a�6�7�P�	�B�?�`
y��2�(�4��g�Кih����xx���Z�1䓄��x�n���y�_??=��S�uޑ��r�SrӘA<�1�7�-�~5�(*�c̀�&���ϡ�
��y~}�}M��2/MG_��g���g����@s�OPX�+GE�_��fcn�p�~�B��HJ�P��;J�)��j�à%1>;4=p�Ҧ`�]	h|���]a1�,�{�r(���3�,��24�֜�+v�]Z;�ѱt1e{�8����~|p��jJh�,c7����J�a�Ò�'`|��(�x�8�4�,�=��p0Xy�>�KfE;�RU5f�v�HF@�")�Un,�����XgVck�f�,���"��b���v�i�K�_9�u�3'X��t�$}��Lx2?Lx�0_�Μ}L�jm�M�Ю����*�k���&�V�t�d�]��j���a����b�m���lV?�~��{��:`T�j�-�9W0��9L��A�LH�h��:"Q�F/Z�"��Q��� 
N.*�+=����ȅ#\��壹ݢ�9,�S_dv�{�Y�9�îr��c��+4�5���q�KٛظL��D�V>Y[���yV��ӘBO�8)O�����=��LIc�Z��H@Ɉ��S:��b��0i*n(<���M���I��R���ۮ�����/0���[��t��)u6��?5�;�{�g��v���
�=���T���]�	fL�I�z�[���'���E?�M'�'sckN�tzu�����0OY���O�L�3ƉA�yJ�w�A8O?�_0�k�|FB�4A(�E���d�ʳi`�#_��F�
�'p(<�@�ox�}�y���8�8�TT>�.�e	�>J�Z}_�>qk��sO���d	x g,�4@���~Iffjh³:1�#[-�	5����au���8'���
&�sR����3
�6��A8��AO��s��e�����⁣�n�ƒI�|>*�cGY���3�r��^��Z��K�7���k�B�9VSHN��<*5�l�נ���#�%�d�yԲ�#aU6�%�����>",Z^N>.��ģ��������S�.bd� �)ך�]T������J�xj��{D��$�����J*a�F��ٵ/O��s��F�g4ֱP�+<U�����h�	� �Dڤ&�� �P&%�aR�$�!�=�dU��O��r#aPuMY�+��%O䖧�e�K%�*8��-�ۋ�``"�>��b!��#��:$%.���v�T<)@��Z�q�}z���S|��Uk?O�	����jcIk����L߄[:�<��gJӍ��j09Z~u��y�n�ph5�����9��������8P�)��ys�^`�_ڿ����)(ژHsN�K}�e�SJ�^���$^�>��;�|]X�SX��Bc�,��j���<����$��N[����r ����PK|�Bbk��N6Q�m�C8�g��C��h�<H�� �-�ٕ[O�X�{X�NQ�	�{�v�>�R����D��t����:��:P�lТL�S���M/�����Pi#�;��m<\��Z��Z���vU���$�y��$�s*mP���|�!��y?���-&]�G�p<ʝ(N�(��r~;���ٻ���*�6W���H�����Y���]��zϨ6���G@�,2v�a��~�N�|�}e�3{.̃���Gfҥp�j�A�2~�oT��W���FӋ ;�hbТ�K�;����>�B����r#��A��"=&�c�\��rs�$�Z��-'���#���U\M�G�HZB�Q(�C0�R�g�"d��h�:�)�1k�aq��mSJ��ܹ�
3#�t��G�s�!�<�N��5�V�Xt54�'*F{����1sF몒7��x���㶣<<悑�/T�f<��b��ף��qt6�B>~���u�	w �<z
�L�v�������v���<���ו(�e-!r�
5dzc�\���Üf�8o�1`�)92�?�%ѸT��{�k�Hga�)����:�S�xw+<�	���V���9�>�^�?���n0��ՠ-�-�8�?W�I��K��
E����Ҝ�ڪg�0��o辗!6��]�IK��u����A�I��l2&-�"�D���3Zx^{���
�}g���*̘_�i"�����-UъQ6��sϯ�>�-�L,�m��\&C��/�|�Qܪ�����O����@�	mƱξ���:���u��ɡH����l�]1�@�&�����T/a�i"1ѐDk�rln��a�`���;��ݷ�~c��T%�H�zy���1Y��JqꯅA�)��jB����O7X��P�g<;}{�>D�J$:��o�P�ֆ1zܷ5I�(�x���<�{x�$��,�q��;��%�ш�啼*HH*��[y��k�B��_��e� i]�m������nl
3�EQ_������}���A���W-`�۶�x{
D���~�d��'d\(�
�oO�%�4%�)�f��
�O�(Bܳ��3@;UP��n�X�YN�G`D�Thu9��Խ� �$�5�@��j�yŴ���N/2�t<��˳��� 'N�Y~����Xw��UG7V����^F�
S�/����	)6��'�?kwh����g<ᔂ�j���b��һ��'ᓩ��h��W��&���E�,?��}��.�t���D(�ĵ���\�Z��7Z/3vS�,o�_��w�S8�/\���
�B8������b�-B�sFf��m4<Ff���8��*�䐎���H��>��W1{�ó�S5S!(ccBI4�z�ZJ<3�^��XAacE��E��Bq:��t\Q�8&��G@.%NX��	"
g��t�qw-��\�3}����kȉ'�s0;~B�X��e>\n�˽�F��-��u\ߜ�2h�[�~#�Pgy^�D[\h�͓4F�v�ɰ7�9��A�㨝�C�z��4�i�*���,�M����բB�e�7�Wz�T�+�E���b����X�£�W�g���S�<ay����y�BŽ��� G^͟�d}%=�f�A�U����xdL���J6�����o�860��B�7�:�ǰ��.I���oQ_M P�9U�.ш8��<�ET݀����P����pf)�_P
��
�=Z�W�3��Ƴ=z�qU������g/~x��I�����~㞜P�H�鮽�C��xE�����ǒ[���z�z�.UO7�$�_�.�~]�E�2 ӭ#l��	����2��hG����m�LK5v!>�Aǣ?o����H7_��#��+v{�1�^��х4���O�D�}=�-��-�S�%�W}�7��1��P*\�rq��\�0�)���.��#1�F�TWV�D���X�ќ��,�U��Pڕ4�4;B�\k\����uo���2�����6V?�v�nW�kǷ�K���nT���&�``%�~�A�Ǜ%`������r6ޖH%��e"�/���	���.�E�?v�mrT�^6�O/��e�HH�n>�>�j<�3��U����}��	�b�G_��/6~t�ģ��MM
�;%E-|�]��e��$�p>�q�\��j0�{gc�u�F@Q6����w��j�˥���i`�[�i���'�V�"OρZ��?�1��Tm��ȭ�k5;Sqa�ͯ��PF�\ȥ����K�@��9�//�e�a�+�7�"v慕�?�����'nή���J�̓���\�h�NY$���P�<��Fio*qT_��ɼ����D�6��a���"�{􅏛ֺ�]�Ij��dq�
�L*:I��q��[���<J�W����)�˺1�\��r���.E��ﲊ��0	�)VP�r��c�w2!���ƛn)�w��cRsB���yD��I�ފ;aH�<�������r\�d�F���|�0:T�q a'�|����ь�Rn�y}?�/��eO>��.ܫ�
������𻼖����w<(:Xl��Ȕ���7�����r�s��x��D��/2l�<�8���;���(ކ��� $�oxuT��T�9�� V��{�y2��)Ѩ��W YDN�@`b.���ub��o�b�_�A!p|���U��m;�u/zL'P��]j��tB�]߂��+�D`A�e�SӋQ�}�������{��=��"�|���f��Wn���.)�c���<����6�x��71^�:�1&7���.֗��3�WdzQ�n�d��t�\�R�#��+:EF��v&4o�2���g���>o���7�4����ki�*J��6�BW���_��	��+*^�Ҵ!Pu۬�r�*I�8z'��ٵ�
��^W�ߏH:bn�[���dx�e��#��Ԃ��-��O�Sh��,��F�ۃ����\w�e
�<�?PKEePQ�n?���pip/_internal/req/req_set.py�Ym�۸������`骪���ևri���Hr8���6�����n��ΐz!%�I���M,�3��gf�}�N,�m�֐eL�*U7�ﴒm�}����Ku8��p�'�\I	y#T�{��u5?�i̦JTi�e���='��m��r^�R�\�CV����l�.�L�c�w�u�.%����Z�!��*@��� {�_�!��K�*�R4���H�6�
��)���~�^�����7?��\�
���\1��>2`®����������F.���$�ľH5|�?|a�31��ЊNP���ȡP�m����O�]�_dY��rɵf�[h"�{��7WF��H�M�E�>a��L��Ef�����b�:}^��a�N)���nT	��j�zYo�����jx��I�~�F휸���Hz��M��sG�J��oث?}�G�}X3<(�0�-ɲE6�n��~ʵ5
ޙ:dMcI�2�LN�F�hX�O�{�^մ��rn���42�x.UCSL�b�x��ἕ��+8�����K�C;#(�l���{%����؎])]c�@5T����-�>|E�N�!*l�/O&����3{�U[6Ϯ�7�	_����SSz\S���7�5�f�y�ei�����2��o"a����83
y�Eȝm:�������4�T))�n�M���Wֹȕ×��/�L�aCU+�#��,���2�޺�C�k�������&�ҁb5h�k|���-���$��@��k#h�jC �K����!��ij|`���X'��R��b�}Q�vA�2��kT���.ޠe�ij�
{wfܮ�����#�x(���B{���"�f�ƍ;�9~aX�Jvje#�
��	/�'8�M���$�&�D��G $�S�P?
䍙�ڊ=���D�e~��IQ�k�A���0�6Z`��q�\c���e֍����8�f��7���D
�PR@w�����_���F�
	{��%zl5v!�S�Mtc(�h$��
�hA��Í��I僨Ui�{�=��9��
�64����5b9EA�K�7{�i$�^�MN��kEl�u˜X�ĝ��Q��Q��,t��u����ym��S�ʈ�.?"�JU�u�s�ȫkg\4�Y�/���A��gN���/�F�k:�
��z3H��Z�Q�r�I��]����)H'�
g�,���4��M�~�
�MJ֛C#���SZbP�Z�C��hr״���|���B��6&&�qmB?�v?TG=2]A.�g"/�3��w}���v���[��7�$�Q����{׊+&��/S�m?��lk��hFDg���>4NR�͘4���C�S��ѥ���&���t�B��IĚh0>����6Q��<$�����Z!�+�U����m�<���|G�KLB�(��<�$Gγ��ѧ��u6`4�ӤXg�O�r�,�{�δ�{��#���2A����@ydH`��~��e1��G;ps���cu���e�aKm�%�3
�|�Yj�����V\��"LS����#�M(�)�[{2E�i�����&.07���5��&�/J�ˏ�(�U����<����BX�w��.���
8h�b��x�%Fi�*l�Ƽ{���,�
��|�b`^��`#�ҟ�<�T����`�x��f��sb����W�s��q��8\�ypM*����P�[���'�y���Y2�>N�����.��Ft��Գ\v�_��/�b�
ֈ��Nد������&]o8�gS�=�{�ۓ�[kXS=1�G�y&b��k�U�a����B�
G�A�s��$n��[��jw~��

t��2�a����9h
�6c����
҅���Y	f�fe�I���n�k:�4���--O6�\?=�7l��+���IC$ikI7�'@:�a���:��*
��￙6�v�MjGF��E����3����uW_8��z�Ễ�[�7.5|�D��eI򙨽��T�͏��5S˅t�tm����k�^%
_�6Q�&f�1K�����
ص�I���Ǝj��ݨ
>M�1�p$
�h�`o,�x�v����w�yQb�	/�_xg����\���EWt�n���#M�.�0ͥ�N�6���M�%�I�w� P~�^�I��e��<�/�K~�%0�>�w�}Bo����V7Zݨ�D{���{O�/vM~�T(��⸓��HY�Hu�wm�
R\��e���r��~�$�����PKEePQ{@��R pip/_internal/req/req_tracker.py�W]o�6}�����Ş
dX���.���0��h��L�$����w.�OKN�m�X$���~jm͎��z�V�)S��X��ҙ|�e�G�r}e���>W�jEZ�M��n����f��z5n4Z�}�*xz/uf,�)~�>��j��ޫ�q/wE��Z��o��+o��	�C��o_>~I/�]�K�?_]ͯ�¼�����B�t��V��R��n��9Ӻ�Z�)���)�Pxei�>Il��}�Xk4t�[�������J�<�^˯{X��ڟR�3�����w��{���/Ҳ��A|#������;�d4��8��?wBer�E&!Rߧ�nZn'ϟ��Bo��D���X⼝�?ռ,�����0�8�ʂ�R�����^�{� R���y�3/��"��T>*�@ٻ`�Y��HI&ሃ�,-�^���nP��@Z�g�K���K<M��Q	S���B����=�f�����tѢ�Z���+Yx�Nf��j�o�������t�A�<��*DS��:g��{��6�[y$4��@�W%Аֶ��=H�c17deW��0����ɾ�pN"Q�i�W2���`B�Q�Cq�8"�+��lj��N=�
�K�s��H�zp��֘nRQ�'��������8&Ń��v)�G�?y��m±�l�[�r8���Key-p/0V%"�թ�ɝ����(�.�Uτ�o;K�;��LGv_�I��Xy&��Mr6��+��?eƖ{�g,�J/<{�Φ��ɨ�H�#	Lj�Ҳ.a!ݪ-�*G$����0��F�V��������N֣�KΪwI�������.�*TH���4����V�dX��K+��  ��@��m�.�F
�l��s���}�:~%"�:�����Z����k�U�_P�_�"�������N���0$��^���=���C�q�O�*�B���CJ�W��Cji�zl�.M�����ۊ�/LH	��<��1{���ؐ+��+�.�d·�1S�U�n�%��?��I��iy_�Ȳ*7��!�@�svv�:�0oL`̛���rMm(��vd}�[�2�:�*����?����398���V{h.j������oՕ�Bu�I�]"�jVV�����)L��a]�`�R���씉hsK���N���l�tfp��1w�"L1t�
�d���H���B�1#��u�oۡ�kO�j]p��
�r����C�Q�:�fF��
��0
Z�-�`�Y�Mf$M%7T����m��/#��E�DⳫ���>� �@�
%;0����R[/%�#�W�_�<�J��V���,u^@�vOR�ىăDgf�C�LbY�����H���#N>����Ӿ3N֝�t�ɔ�ƃ���yE��2��;P8U�o0u����;J|D�3;��k�o��R����)d�,Iod.}��b����j�EzFwW��
P���T&���)�K��rA4?8���o��jrO�iڧ�
Q�ܣ�m�*�g;4=��P4�����
�S�Zm>��PKEePQ$@����\"pip/_internal/req/req_uninstall.py�<ks�6��+M�$N$:���=_�.�y�N�f��Iv.�qq(�S$CP�u��߯��A[NRu�`K �h4���]�cY����g+wm�,_���<����T�J���}�ꛦ��j6���蟍y ���US�����gn�6�ny]4�����d;[q�v+�wu^��n�۾lj��\����ʱ�E�5]l`լroܲ���8��{����}Y�t��ڼ��޽z���wo�l���<�Q��x����d�"�X���ZLJ�J��gg>/������~��F~)J�gjE���*2$B%��f�Ue}��Ҷ���P7�.���N�����c�w&H���͊���wů�
��?/;L�x?�vl�}�ˏ�d����߳7?�~����#��-A�!HB���x�<����媟�W0��M��9�r�~ B��~��o�>$v.��S�����VW.�����w�R�R��?�m�eH�,K���
�f�Xue�S�����4Ǎ���D.�	��_��;�a9K��-���uM�4d2�<�x�s�o9{U�o{`�u��s�f-�
���[i�GsP!|H|R�
�1�!���>|@�?|Hi�*D�WЎ�4�%4N�I�'���%����6q|%�X�Vb��8�Z�"ߧ�6e=S�=2˭�>"���]s��4�k���v�`P��-����������#�]^�k.zg(  ���"ą\m�<���� u���P���m�g�:�a-�Wi�Z�����&F�����خ���I����ռO�n#���ӛ��V	��&�0}���,�#A[��P&��w`غ�Wo"�����'M�a�d�X� 0��%�UT?S�p�*Y�YT���p�	�����$���8[��	��y��7����6�~t�j���rd��R'�zl�^T&��h�V��9z0	�W,���`'l�…�N���8?�찭D���`�A�Q��v��RȧUP�g��
-@�k�N�F��x�y���u?��O�D�X\����0�#��
�㠫/�-�
5]�A�A��lJ�s^�ֵ3�h����W�qO�ۺ��X|s=� t.
A�D���"���$��{+�2��
����Q�=�)��\":�lb�+�ڕu	����%�F�Yڹ��� ���B֖|��X��Z���ϑki�n������w�
0�d��9�x����C�[pL#�r�l孻���}�f�k:CdQ"j.������~��x�p@�WE&nJ�3������ x]/�����P;�<�$���;�
&����aeIr�.q5�7W`��2��MG�䢢v�⋌3�����]�'����I7���v�rbM�b�#g(m��x�栂�	�\���R~?mKAcw������Ր%(�ÖK>�������^q���؂�[�)�:Ս�$W ��.G�(�7��43b��gm2gm"Y
7H�F�t�(�T�O����
 q��;�,U90��мxz�W{P�Ib��ʪQ�'4���e�Þ�1Oz���P�ЀB�Jpəc?�[ahq�2
�I\I<�Lv�,9�O$'�ʶ9pe���\<�A����aȱe�>�n��I��"�}�~	���[:$��԰��0�,�������̓�[0�|fw��-�b�EhY�� ��\�Ӄ3��	�Y�7�������4{p�и -��#j�T�ΙHz�s�T��}�"t����@g4$�*�D$Q:Ι~�4��r��"�iO�r���LҌ��f8��7���hA�<E���4��C<��F	��S���>������)3q��zn�;bz�[�5"-��a[��l�kP�m��_B1���`@]c"\3r@#�F���
�8mL���&�H��7
H
�w7�o�E��r���`�6���T��z��+�<`,�
D�G�2r�O��kX-�-y�9t��C�Lq�]��(�Vh�[^h'+_bD+���^X��-Ae��)�Ѣ��"%u���9а�k�D)�ʝ��6W7\2O��}�I :F��2��>�`�$��MRDe�n&�R�P5�P���QL�JV�ֳ>�"R�5K��n00
k���8?�R�%�t��#Ĕ�����K!�Z���_�L۹³+(ɡ%T� q��Z��`;tT�Z�dъ���TA�P�*��r�$��\C��̸+7۞m����l��K:]���V֍�,#310mrP����NY�QÄp�z���4x��a<�0_�t\0�٭R ����g��1*�r��R��w��
��\�Ry���0��:���0*��[��r��>(���F:q��q�<���0���aZU9p��>[^�Y�Y��T��	(��\?@E�i1CDG1���v)��Ofc@+CP�G�)R1�.�a�
�~��Z�|d2��A8���妐�!��
E4�Օ>����&,�$a
>�F<D+��L��?Y���R��<��D�Fe'���["��̗QfKyQ���0rs	A1�	DÁ��յE���@�I��R�Rf�m Q.�;1N�M�l��;̯��Q�(I��&�F	P��0Sg�@�m*���c$V%8�8_5mI�Z�!�4���c�ď�1�Ն颇Z�Y��H�f��ұ��>䛲..'F*&��]
�dD����cW�V� ��0o�I�)�Mz��
�u){�ˑ3&��C6'�*�X�4
\�Ա�T̥�)�idzm!�"�oN�!��
��:j7H�L�٥������&#�anb	���Z���#�&	"���ڱ֎�,K���g-���ù�Ql�c�B{>�s�ʏ��� ��ވ@T����Tƴx������?��W�����!{�I�\CJN�?A<=�b�̩U�h���	m�V�֨��6LwX[�n���
�(��Ӎ�#��4�H]|<I����֥��J�"r�`�B
�F�&
����L�䐘��
=
�Q�N�bY��>2�;��:�.p�>%�P�@���#Ç�w���8*����`,�:H�*�}mJ��U�9M6w�Ը��d�"�&�Q�4���Z�����J�7��Y��K£b����G#G�dE@�P��+h���^�<ڡ�x�ly�xS�L�82�u�-�hF��)���RL+�Yw#�U��z��Bw�z����v�]SU�|u��'�,=�p���o�	g��~&Ŵ�l�
�x_K7�s1����#�To�ܞP��5�jڂ/����
o�|�S.��y0I4R
UÈ(i�V3��'���~�A?^ySz��*����� Ѵ���Ɓߍ��c���e� Mҁj@��F�#���䅮���]��� ��o���?ZA���4��j�Pq`��a���Џ�Mvi2���K)0��b���iw����sTO��v�>.���_�9�z/���[2��`�Ү߾�{��TErIk��œ[�e2'�i1��˓�S�*�\-&���n�Q�m5��=2Sy��#3�k��ƟKj�^�h���J�FTuu����0�tں����A�9R��ACW�Ҫ�˗"݀U��;�ש�9�C���
��0/������˜�5/
:�2W�<ͱ0�\p��U�9�H�H���C'ݏ��'N�#�8ɚ��"���5�:��ȅ	rIG�4I�q�Tzp`���k<��*R�b!]����"�*m�+��>�n��<��w�C���Z�)"֭��,1���.;gmoB �qP��&�#�M)�!��G�'ɽ{�;
J�`S�'�]��O>��C0V�h�F��DEI�G1�o�@�E���o2���v�����w�Fp�3FyԓN
r�1�����%�[���ySSJ�7��;9�\�`�-������j|ܱ���Y^O{G�L��Ka)搼���fJ'�VS�� �	�bn�_S#��ꢩT��,ʛ
�u0��M�k+gÉ]rLvS󟋋�|���sh��u�0T�Zg����40���^A�:S��V�kt9���c%SK����
+�IttX�f�4�0��Lcy�F*X��R�c/)�4����wS�G��d�w��o�+�W�w�Fc�@nUdW�22�>�sU� k���dd`�� HWyx���(�S�=�vb3gn��;2%�*O��Gi����O(�!����^�2<�U��Np�
�K-Bm�E�Q�0����6
(�M~U�I1���0ůO���~7���T�"ew��3=�5�1L3}GL��+�s|2�	�P�Ƀ}��]^�s3:�O0��4P@pJ�a&�򎀸��sh�[���p�DJ��5�N�rq3��(������M��wZO������f�ިQ�#�m^o�K�۲�\A���8�|^�u\���遨� �c��t(��F�4�"�3=�3���,( ��ud�GH��'�%5E��8e:'� 2=����t�r ��鰢3�h4/��u�Ij�~b�ϋ��컟6��Ύ�ۦ08S�����*�<K���<��w�cP����˅1d��.K��&(��aQZ���sM�h!o�1�Ĺc�~�"G�Ts7"˥y6����ck3��}d�fCT������$���@�r�5�O�`0��'mB�Gr���=x:yW0@?n<z?N�9��w#�v2S`Ag�f�2t��#?Н� �`���~R=�4]�T���m
��@vi���CM��4��%�ff�Nez�n��ۖ�ʼ����if�avKa�6Pw��fy�wr�L�H��9E<���K�]B���X�h��Q�un�����_5B�:[݅S���3�
?�F��f��a��CJ<���D���^=3�/��z.2v��g�Jc<
�`TM��)�x	�3�/9�x�)E@z�ͅ�$8�&�F�5ӗ"��zH�����8\�nH�Gg^b��K�����������|��B����K�^���c�%՛`P�20[,����%~'�jP�҃$�� �ڜ���(k^#M�8����6>>���@�ћ �e���F-z<3
ml�E���7��f��}�FyH���Q���1�8(�,�i��]���D"v[�[���z�K���:aTxI��ax#�	����/8A�K�V�W��-/�b?�>��yLy�K��M��佔=�ZI�9J{�se���7��^Ġ������tU����H/�t=�N�8����a!~�-�Q��]`~C}��\������☩���;C4X������<쒯�,,�Ө
�@��ܩ�ʔ��wٷ�:�ŗ�_V_}�h�_�A��V�;�i�wS��%"��@��W_]�o���?��NN�g��-4��d��FVNh!��d��S��p�!=ʩ3w�B�r3���⡍2���w,�l����B6�iy=p�@����#'y2�i�F���^��e�k�Bz��T.����.Y�l��/�w&���'FuXV���y�7��tf��OI<Ί�tQH��z�5T�G.O���l4�'�	
��b���q@�{�7�/(���T��R5����=O��K��	<N�Ks��yӉ�H�]��A>2n����7��7H����I��q76��)�c�^=�������-�~:�n�f�,�c��	��`�6P1ލ�m�f�^N��S?��o�0�59�X�|��,�
5��d�B.|�/�v��]��od1N�?m!T�T�R�g��ya����&��k��)^ic�1R*s���Um��?�r꓋�l���XR�v����+��<��]{%Gj�
A�c�@P��P�w���A��Pn�/��{��+�<���H�\���鰀@^#T�9�Ȓ�w�:�d=�s��
t�}Y��ӀT�(��࿾A��4y>tѕ�FJ^����Q�.z6b�_.�B
�z�W�p'NB�8eAwywS���
�b�4�y�@�WxP(�]�X
s8�k~�L�-Q
æ��E��ր�3�k6y�^�Kpދm��I��We��]�Ë��Cgz����E/|,o���;�:���_�c��w�~xg��9CY����]q�՗ABCs4���l��=�O����%iF�����FJe�Ԭ�
�͙�S�&���/��]�Z
b�_B�w�v{ʥ����<Q'N�OZ([�8��£6B�
��Lژ&ʘ��,�A��O*��4��}���J��)��}�uz�/\)X'�	�i1}L�]Z�K��
��J���_TCX���_*��q�ݮN�'�D�.�*���j~�.�w-D��j�յ�~�$аj
>��⯓�L��d��_��ў���O���[-J���X`�<lu�j�k2X�Oty=�Xp��8�F�8�Ё��,'��%%^ՙ)�uY����T�L���R]�B���$�KT���u�Ύ)��$˺�Ɣ��r�}E�g�}@��M;t[�PKEePQ$pip/_internal/resolution/__init__.pyPKEePQ�h�'� pip/_internal/resolution/base.py���N�0��y
K\:��&��i�	��!�4EY�n���lo���i�`�,�'��/r�T�j[
Ri�p/��P�+[n��'���l��w��?'�4�U��=푂���z�06Ι��,�׭�ل���K-���v;���X�i�(����	E5ʟ�3��!��u�\
�d��G��k6��R*u�n�ٻR��/�ʠM)��=�]y/����-����Uxf�m��S�"�#�B��^���n���td,#$^�E�S�&D���:nP��0b}�=�1u�m�}X�3��H��PKEePQ+pip/_internal/resolution/legacy/__init__.pyPK�mWFR�30�I+pip/_internal/resolution/legacy/resolver.py�\m��8���_�u��
���݇k�����mp��F&��E���%�ִ,iD�;� ����/")����t�Y$���T���hD��*;��B�e�u5�}8
��Z��k���5����I�K��˲~�W����n6��%���/ZqU|x��<��d#2�q$Pz�i��D֭a܁�y)�d��eu�/���/-��.!J𩻣h
)g��w�p��3�9�Z�d-��9��%��*�E�9,��m��NhO^�BH����he�|��J����%pXp���w��ywd�}5����3��V�+���32y��2g;��	�,��$XS�i�oEdN��|�d��65m���7���>�I���UwnD��K�gV����XY��U��l��'XXY¹Y��3���aFէ�D��ui{dG^�,�C��$���m����4�#�A�/D+�ްQ��6{���7!���A��E��=��d{��:�*�#;��{CGDO����u��m�U��+�78��o�ݱ��4��*�@�
4����A�=/�<��G�������~��Edt3�qP=�o�;i4xl�(e���eѝӎ,��K-�	h�1�
Ԏ.���!�BfV���y�Kdp'֠��	����x����Q���֎�#Gb��J����6t�J,�'�Q�P3�9;���?җ������^�7��>Ҭ�$Q�)�R*��@�6�f?h]_3�5��7��;Zgh4w�E�o3�aAW���̐��B�/�e�{�(���;���s�p���g}""��W�������\�8՝�~��^���ڤiE�[Q��dr�	��F�!4M ��c7m}_��Y��o�����֕�O�s%#���nog3T\��֘����-Ӵ�'����lV��J%H��W*��(�g(����dt��^;�Ht?o������l�gV����3[)�1m�$IVl�Wv
h�����_��i�L(
S�ެ��1��,
�ߜ�ҾP8`��+7������5��+#~�6~�^��l:�3�,��(�|P�qI���:����ͩ��g��v�]��V�N�����t���\��ii',�.U��a��6�-9�Mi)�#d�2\��I�����%�ي�w��-d��6n���{d��w�[O��85��1�I�*l�iA$
���)-Mx[�P��k�Ȟ��9�s�ǂ��b��|�
F~$m���q�p�j�2+u� Ǯ���m�"Y$�b]�x�$���g��D��!�>`��-E����_�uu�|c�u�>���
����ţ��{X�D��:Ljð��9�/j��I���`�!0��Y8�]$��n�O�����t!�6����E�1-���20T�i��� �0�������3B�_�fU��[Mf��;���mt4���:���@��:�L�t�|嗹���|���n��W,rl�ꍄ�����9CݢKӁ�R���qN��g���QP��<F;�y@�*s��i@h����	��q�
��@y�P��eM'��nT�HW{����xo�;k�S����\8;��i8��sl4ĸ� ����ZM��{i�hM�J�X
�t���Q�qL����}��2��+�8����'nӧ��B�Q�nt\�<J�1��%`
;�ZEt��:�?t
z8߂YF�ߎ$��I��o�GT�DZ��c�iXt�,�Lp�r��chv�{��|n㙐���l�8-K�s���C��j�Jݖd�Y[ׄ�Z)�g=rJ� c�<K��֐��Cbp� h�<��$s4v��L�F���:tq�T���>��%�rl)Z�rб%-N�P�5H.��+�yE��''��ω֗�0e�ڸɦ����~���qD��ɰ��㙛�Ua����3l������-!�؃΃k��$�L�̨⃳0bf��R�_'�1z�ۃ��f���g��Rs��}���m�9��Po��[9�Mn��{2$���"&R�K��;Lx��N��ċ��AH�FtT6�7hJ�N(��	���
�ѡ�dw3^!�e���x�I�ĭp��3:m�i)�~�+�(�U*S�q'��>`CE�N?+бH��``��Q	5��c��<@>��a�4���TP����e��)o���2���E�|1��܉}$�sZ�TvX��:��"��/4:����N�Dy4��S�7	oP)�0`�A��O^�T�㙣�y���y�d�+�Hʸ�j�����_�S�a;�*������˺�"E�D�|h{�L�4��&E�)�)V�,Py�29�*+�v�����=4��i0�`��ϸy�^՘���)Y3s�G��ur�=�A2�r2��N�$��,��a�F�
�HP7%H��tw��
��
����a=i
i��k^����+��g�"�����m��u��J�*��v.Qq!
����=�+3�uRωR��&KD��cɑ��k���JT�ԌgY݃0�jE)�94�t��7:�o�A;�.��kg�p�D?r�@�Y @�jK�ٝK�0nR�&���TYtY�^TCtCW�:L�	��Y��&3��-�`�����; �f&sF\ם�Q��3���F�M��ڋMJu�j^b� �5 <�ņ��85��/+��YM���Pg����y��t��F��"X(H�qŎ�>8���Do���iN稒�$�{�R6�	:p�БK�
�p<4���O:n�	#Ĩ߸��_d
+����.�c�rgEPpe�	�1�?R���	�͓&��9�&͗�ڧ8�1L��YpU�0��z�jMy��x����/m"�B&����_eO
鄱7�1��C�˹>e}<ui�p��4`���CosO�6X�H/$P�rT�~&:�#��|�u�A�_�8$׆[�yQ�{��d<5���K��so#�d�H�f����b�.��\���)Z�Q��M+%,
��#S���ITM�-�n�-�N@7��5a���OG<j4�0��݉���ר�揾I�GZO�%
M�tja
�8E�W/��a�(+)x���C7�.���ۑ�I=��>c�j���֑
�n^߰��?M��.s8eX+"XC`IP�
�&muW���ęWwcwDo�:��n����
�
���׉�<��eDԾ��Tx]��?���D4d��7���G�uE?Q?�@=eV�M��!�:`��/�E�����Jq��A�A�D�!�-9֟~������(Ё��d�ؐ�C�Ã�O�,��y�b_,ͯ�T���@��>}����W��\MZ�[_8֚[��ox�kp8��(�'�4���3��ו�[
HAx�rL)턲�ڻr�{6�GQX��9������7h��,��r�Yx��]���-E�8��|���bVi���^�$z])�^����_��)<H3Q���{�0{G͹ꃉ���d��(���Za���[O쫼蛒�N�[�ϑ���gЋ��+(v�@[?�=&[��䩐 ��0��7}�A�	���_-���b�B8bz**�E6�ԙ�R�T�u�S
*2��.NBNw+"��;�Ը���ӷ��W`�:
�r-8���3�I۳Y�3֗�N�>�2�f7~�)
���B%~`��X���JW��XY�]�N،��,>J*�v���5��K��ᛰ�,�-@:$�7wH4h�%
O,TF��U��jzI�@\��:���u�*����,�d(~@�?�;�k'n(�Ra��ƥ��
zus|�κ�m�y�ZYR	rsQ�D^tܫjR��X�j�I͐��%^~Ξ27�/]KA�I�Dgk��I�(�x
��öt^w���
> g��b,e<�Y���I�,U�]1�^���ٟ T�8�Di�SC`EPj2�i!�����Kq��y��]@�D>h����e��8q������� h�ttH�Lh!���p9���+�
7�>���{#��ʠ���V.�K
@�a
'���Φ�w �g,�dY)x%0	�@��P��؃<�3�N�����.��TwдϏ��9����
nߡ0'\���o!���gl��_�m=)�����[O��G'o��$�lџ"wEptY���d�ߨb$���D#N�V,���}N$_&�� �2����TF4z����:�4["�Y!ұ��8�!zʣ�!=G�ip�{����C!�f�
��$a��BM��T���5�H]�8�`/��OZc}%s����� x=��tH6]�<�L�*h��_s�+s7]��b.��^
��56Lf �%�x�=�n��,�2x�œzbģ��*xIs{��G݇�D����L�9�]�S�.̑9{��-�TiQ�֢�9<��W@R7��<<s��.�F��>p�L���^���+a�� v�����<(���1��c�U�zn�2Ĩ���P���8x)�!-�O��Ty\j@���/^��n]�'Y��h`�.x��J9T5UF���z#��x��hݚ6M��~��i����K���B�oÆK��ހ'���6���D�姀�)ʼn�Go���t�YY5�F��8BM�:�?�Đ�>L�b�t�)�]��Z7��;��
�Ne`�O�M�C"	���<�9�C�_&�h�b71���g�"�TC[� ��c��ƍʦ�GJ���l]��<GH5���q`�F���ڟ�����A�	�J�/A2稦���1��J�=�3�2���k;��'j��B`��x#�X��ˊXSŅ��T��
o��R�c���m�!�w������^����\�o�7�3�	_�RwZ���%�{����K���XLq�7�����\~"K�OE�e����El������*Y�
��mē�?����W�U��^�b9�>�k��`��q��/�Vm�X��*⅚]_K�x����������"�8��}yr�]�{t֖:7!R��:�!rD����GD�:�X`�njO��^B��g��O�xEs�����Am�6�S�W�G�h�=\p�R�ꐠ��7�Xv��R�c�
��
���ʠ�(iT�]պF���W���VQI7S���`�V��Z��Ҁ�rّW�qU�N3;dl����\mF��Ԣ8E���m �p�y��P��ܸ�mY(�³c!��f�>#CF̓Q��4ԭ��q^�9y<b�tPޗ�Ł�^�y�dw�*x����jCd�;
�q^I%S��ݹ)l.�n#�p������{�WjR�����&	�����)�R�}��PKEePQ/pip/_internal/resolution/resolvelib/__init__.pyPKEePQ�Yf�m
+pip/_internal/resolution/resolvelib/base.py�Vmo�0��_a	�R��4���M@�6@BUe��u5K��v�
��9;���i5X��%ν<�܋o�dM����R��a�5���*�
|�Ai��F*C.��%�d�[�5��JR�U��`5$=U.(��\����mXU��nZ��a����|����S��[��65H����=9}u�^|�L�&o��/���?gu��k%�@ 19CGl^AF��%���Ƕ�0�<L�7$�M��i�ܝm��pjY�Sqq���s'�D�Kf��mC�; S����(��f���Dx�Y�$%,�B����Q�+��0��qG���T������lL�='���x!�W>�X�V	⍻�X[��4e�Uu)�-F���+���5��k6ʻ@V1��Q�Ur�n:�1�bZ���(�9I�ܪ��-1S�
���j���U�
v��02�o�̗��h"Dqkpե6��.���;�*�C^�Y�2b��1�iQ
�rV�n��A~:�����meS,��>#�i�v������w�'�Q�6����f�����"&����I�\�j�=K׳5&X��s_
}���8s��p׬b��R�f�@D�oU�����h60�{�zh'Ҝ�8������W�z�?�p����_�A|_����v�Ʀ�Ŷ�/pv4��m��
����ϡ`\�3���*]��ι^ʶ*��C�F�$sM53\#��o}��0އ �ٿ��Q+W`h�H+w��p�&:T����ֿf9L�Σ��܃�����n�&����~qpX�~������Cɍ���{-[U`o�.��}ܱ��6{(9N7ZB��%�����f�wn�Tuck�L8La��Fp���  ��0�Qz?���C�z�q�PKEePQ��|�y%O1pip/_internal/resolution/resolvelib/candidates.py�ko�F�ŖF`
`yM���S�4�^�K� �;��P��ޚ"U�����73���C��8�Շ�������{�R�M�t��OOUuz���v���z-6j�f�*�&]�U'�v�Z�v�v�id�'o��y�0�v#�j�d��U����T�;����탵�T�,��@�,�*_�}+/��+��?�+ߥ��5U^���Rn:u���ٷMS���./�.T;Z�v��ƀT�������e�gR�X| �����g���T>�?me۽���0.��&;C�zu�m��`6���?�ٴ]�]v�g�F�` /�fip�P]�(e2>\�J�A�����7���`]j�.UU�3x:�d�ڥ�OLQ�߃��f�%��0,_��МDX�����#�m��ug ���݆-���g?d~�����WO�<z�/#O�"o��� �
"Į��N��Z�8�C! !���.�5�ϲI�#�Ks�)�j^&��v�^U$�е"�H�Z1�����f)����Q�m7���`���x�/���u]HU����o�0�8�D?c��v����W
7��I�5_�~��e#�bg$]nn��I��Dz�'���F3R����,�HP�l�
��\fc�z�?���zS����C!y,��4:Tә���1���y�J�RUwl�.�τj�}i�����c�4,�O8�O��8^9���J��i�0��ګ8X鹾�=dhWK%���<����L�S��j�����[�<��T[�Cl�p�h�s�t��>��j��Zv~�܀�Y8��N�z��,
��k�J6�ۙn�L���3K�F�`PR߹��`��7���Fvۦ����`��a�"����`	�$�K-	����[��}B��,���;��
ڦ��K!�"\B��Y�_dt�:����Z\��R��w.F	�c��|>	Io,oZY�H�ې?����3KۼS-�tE������e	�UdC}�"Uh��/�oQ�G11ۂ�@�W�͛!�7oR�<��������V�B�R4:��;ݙ]�@8F�}!1�uh2'�#����Hw!*)�Vt5,+�-π,|�l�	�`L��8���l7�g����A�k��^�R�
�1�ߔ>	�M�vS��琜כFQ�Vi�Ðh�̗�k�/Ǡ}��|�1QH�x����K&;�ОM]*�Am�h���ORN��<�}ŋAd��N���>o�%�P��l���y�p��3�OT�-�{K�Fu
���8S�E��ޖ��Ԡ��UlA_TivL�Z3�AҸ�Iug�A)S�A&���,����͜L��}����G��+�A�e���,W	����u_�m�E+<˓�9��#p&�Ug^Io�M��4��'5�`�Mw_������e���<�իf�A9ם�)yg��-�Q�aLBO���sn����b8b�*�#6��[��Q�`�3����V�y�,4� X8q���B��F�ŏ��<�v��WȢϚw3N�O�k�2�$KmZ:)�6�0���Ϙq����|��Ր���8$&a�1�@��Q$�Eo�0ݯv�lQץק(6�u��1��X,V����t�������<��Vp��[�Q�K�#sָ�����S�I��{̷e�[�ܯ!
�]�4M���� �9|L����u�Y'}���G����4�'S�D�Ilܶ�{�o���
yW[�nd�Y`=*rx����4<�4���0�e?E�`��8�o��AR0N�t�J+��I,���zi���_MY)�N	��id�D-]AH�mr5��9�u�$�=�e�Jg�)�f<zڿ��+1!��S�Y՗]���S�W�
�(E�]�I�8M�,ϳ��'��5�r�����<@8d�T"�@$�Y[��1��B����>źO]a����z&��h^@!Y�u�{#�V�x���D��.���Ė:�ð߆ԥZs��E㋙cv=����30hV�#�l�3N�	���
W�C�DD�2�)�(^����e!؎~梜#�,���*�@�n �n6^s��Q����@o�p��j�e}Q�o'E�_���=p[:���v��Ȃ�)�L���b�
��e���>7�z��1&��T��l�<`�������S�6���x�k2<�ȶ)C�!�q�7Qj���&������\���:���.��΅�o}���KwjnK3]�	4?��
v��J�.=�����N{�0q%��Of�C�h��2��((�EyWY��-����]�������g��o��`�E�
�s�t�吟�~���s�j4w�i�� <���N��O�MOf�A�nJ��G������_�V��	m՝,�eU�y���YƬ�H[C̷�� ѐ�g��
��9�џL6���h���k�3O�9�O�Mi[ȼ(]3)b��P��Fp��"�x��Ͷ�0��5�ycP܃>p�������R�\D�L�N��=���^o���uF|J�ٮ˼A�
Є�B�޻��x���k���6��bd�Y���lM����L�U��$y=*C��3��?@�&��7�6����,�=�@r��@�X�ifɨc�ޣ(��8�]3y�_K��ω�ڔ�"A�H���Ck������J��~G�ޠ���T��`o��K��vfl�t!�3��F�c�����i����&�ԗ `��naC�cvџ�)��[��f��`�8�ݜ�
��h�S�ke<�3ҋ���&]���	�:�-��m�,��蜘�+/5s~m2�pN�h����*J0Hj1,1Y}��<4�\Lh��!��t$���9^�A
Pf��*�v������A�݇��^���i�	��i$e��/V�	M�Y��B����
���Lv�)z�Ȥ�2W����!������F�2�$7��e�h/D���z�z�w��.ӈ ~ܶ���Zڬ�E��%]����^Hx��B�!�>ha����BBX�]-�Toَr�c��%/k��A�����蠺�l��Ay�va�5�N#�XD�nN���*A'O٦�s����lU����`�N�'4#�Hf�6�[��w�͡��I~�{mV]�����%���w�����'�
��7��6(�E<���/���]M dq�~�c�0��V�G�,v�֫����:����*W�+�|���'(��2�K)ނ?j��hڝ��$-<J��4�n/����HM�%��.��E��ܝ6�A�	E`r��I�k׽��ׄ�$hR�XUG�Q�V��Ā�������J�q���D���{1��X��%����E�	Ƴ��xQ����J-���o�MK�F:D�ϮYWV��ּ%G����}���,�KD��@�	��tDWyŶR?m��*iZrPW���][�孲V��{B�C4��b�_)-�j"�͙x�װ��R5e�'�:jC�h�2\�P�s't�W����`%w)�҅Z��)rN^]yF�#��B¨Β�^��Ě�N=�K�d4!oı�ӡ~&H��o�z���a���:1]ְo-�z���a�nJ�▉���7�Q81�=N<��~�������oТz�F2�$�=q�w�/�n7vO[%;~/�"��@�	� ��z�@�aف6l(����S�
.r	<�T+�����_�~ua{�u�<� Kɂ�(�$m�x�f_c����%ptp�@\􀱃s���q~��B��,�+����	��i8fp���Z:�O�a�MD���mxO�\�o�ߎ1����!����c��£\#.��C���|}��dO�'a �U �DD鏵�mR�H*��6�$^��y����pn%�
PY0��s�p��?mN�+~��l��w"䢒]��E��V���[�`R'+E�ĊPuڿ�ޟs9����J^/-�!�uJ��)޷Q��b�����MA�j�(
�v�bܨN�@�1�A���8��,"�F�̹{�Z)�jD���mS�C����%��j ���R�:|c���=��g��`?u~yd�_��i��a�W���O6���)��
���"�g�L ������p^0�Z�˺kң���I�jس�ՈM���C�{���ү�}�����E^bF˖��`���$�R'|���kxh���l:g5��j��ұҵo�t�Ey�k%m�7��G}�X�L�}�ߝ�7����j�N7`��?2���O��vצ����/��B����@q��xta9ӯF�BD�l`�$�*8���(ք�3����K21
��L�A�JtYr��\g��T*S�3|eYOO
4z]x���sXV/0�L��3CZQ���KV�H?Nx��V�˃�zd��{�Ƚ!�}D��a�R�^�W��·�����_�|mH�4-{��PKEePQ"���A.pip/_internal/resolution/resolvelib/factory.py�[ms�6��_�S�g�U��}�׺I�i/ɴis���d��H��>���]����v�;�4���b�/�.����N�������Ѻk�l'vyq͛U�廲�*�[�+QK&�l�FTe-~�ESny8T4�wMY�c�wJ���1x�Ru��O/[���Ղ��h�*��/O�������_�ޫM��;	$��o7�׋�yJ�m���o���C�)����	d�|����7*5�T�W�v��P�B��N�\N�i�Rn��~MSo��b5�@�@UH�x�
��"��KT��-�e�W�*���Щ�Z�w�!v���������o��|����o�G^�N�e͛k;�����+�w�`�E)��=�TW
k��r%V������x�ڿ�k;�tz�OWB�5������w���2� �k���5:x1���ۢ�Y�,���]-*��KI0��ÎWb-x}��u�Z'4�d�
����Y�ʛ��c�
~�+�Fo�
h�I�xE@Q�� ,o*�	��w!�7���4�ain
i4�V%N�NI0�}��5�ء�W��&�^]`���*o���pH}�kqa�|�oh�x!�%�b�*����Q�~�a�^L
~͊y�Ɵ���Z�}F/���!\�8�)�v��H��:�+;�W�|���29g����_w�@�=�X\����XFp�4�S��n��Ngs��l��x9C�,��9}1��R���a��,m�¿�wYAy�( �����=++�}�^��+5�q��kV�
�*
��k[��!"��cN�my�m���;`1;��xA�(r�=��
�dG	�b0�mk��B�1�M��˦�ϖ��L�Ŏz�z�/��u�|�6������/X���~�u�� �,���L���-.s��'�� ���4^�&�ϻ�}��N@��i�$	�y5hi>�4�C�@��Ï����y�{���SPC�}�`X�C<��ŀw?�� �z=:���y{S`�E���75у8�
�s/�M�F�0�PT{"��FT��v҂#�j�f~B��h(��>0�*u���E��{D�ӝ���?pwZ�1!ѩ��ށ�d�!��Vt\�]���#���ކ(���5F5
-�
��Ճg@�=I��.#�Ml���&��jI(U/���L/�O�֙oI�
=S�$6�Q��p҅0Z?ޣt�)��T���B��Q6>'�����5ǘ.�I��	�7��~����+�%��V�
��8̄B�)� **�u���[��%���6yhh����6
bJH���'#d9L���aG0��8yoH{�,���3�Y^�ݐ�˄̓�u6��Z�#�Kj0������u��R�Qk�B�PJ���� �C�v7}6� ��=p8p�/�G��*ӝ�ߡ\�z�LJ�6���(p�I%g�h1Ƌ�}[M�m'��@
S-�ׄ8e�hf�k���v�7���C=Qm���i-:x�p�T�9��G+Ɩ�l���C}���zO�^몆�f1�Um����m�$�À��{X>�쬼Xc���效����CJl�R9啩�+]�A�+(L�KLXv��(e�f���_��4�{њ��%�?3����.W�����Pp�`/��7\�2}.ri\�T���75�m5�!�a�_���Sm���f��j�yn�F�e�IX(�1Ab��G2d��\��	��f�*����A�:@�裃��3�x\{�U�c�x\�a����囮��q�H/<��u��,cIƹ�{��bI4K�Y���	�����`�q�o[�)L�0���q�~=�"��N��I��q��f\�,1"��4�!�<�,�!䖌�]�X`\Bj@]0�b�t���b�h,�*���Z!9���a�SJ6�'�j/x�:�Gq�>�e�P���t!|X[ܐ<*�a�18��W����@��="W����8�7�I��I7�;-
�GHӒ���7G8�il�H1���L�@}vn�:X�at��j-f���ɰ�@ݶW�.�#�)�!�f0���*�ܼ\�2�9b���C�H9�2oV����^�MY-W�Z�+P��`A�(�UhS*��P�����Xc�*5)�p�t�އ�(P�����<��y~��L
�2���1VE)$���?;m{�c*`�N����Lr������.��pf6f�+Ն����*�^p��4��K���C����wB/v��v���V��
?�6!�H���}Vͧ��K�&���J'��ɝ�=��C$�jf2�o�ƀ���=�k%�'إ�T2CZ�@��	��gZ9��~���x(��<a�#;�D�U����۾c��]۠X�q��YX�ס�Ř<Ue���O��
�8��ڏ���?�me�z-j>vU#
��m�,�
U�!��}����꣭���g�w�K���FoK�z��] %K-���6i��cx�'�<-�C�q!�4�`j��1&u���#��]�󾹳<�)6��b.�����F��4��_��{�Ók�p�Sp�j���-���	���p�l���*�T+(�\���ɇX������K]}�w��+�-�&������=�Y�pB������B�B���#�qјBl�n��T����t����P��x��(Ew����X+��Gt���_����f�A1��?1�?��$E���߿�G�jY����Qi�gY��ٛ.f�ˇ��J$���a�U�7�^��^�x�@��/ئ��l%�Pdbt��զ4K@	��4u[����v�^�w}ԭR��n�������!o�
�ғ=�;��m�e���T̴bIB�
ma:�h`C%*�
mV=���6,�E�kM%��f,3�����Or����(���f��0���K1Nr���D[�eZ*����l���#
]/Um�7�o�".���`�>?��#���8���RW!
�+���/��/���w���*��)��,���M`��zI�_�oд̩ :fX�f���w�M1<��ۋ�fx#%�Í��(Ȣ����`��$1�A�(�Mu,�F�f��$�:��H٘W�����S�ctU|�M�b�j��=s�M���ǽq���[����R�C��נ����T��Dc��ס6M�y3�ռ����B��g�7�C�yhf���7Z��8 �LnJ���<g_�x�7
C��va�1��í���X�;w�*R���lNB'�'��N�[ji|��Rc�[/�D$Ntj�ɽ̩Ux10�=O�Ό�!-�+L���̣Σ��B���b<��d�t|)s\���<�K�8T�N�c
7�[ŤM��X�3s2�n�����dzePUh�'{�n�n��^F�u����Dx?0�-ip#�����i�k��1ݗ�WT�����ߔ�3��A�����N��Ԝ�u�[���YJ�?�xN��1�
zh��L@�AR"�٠�4u!�7�Ҵl��~<B��S�7N����4}n"�
����pf]��K(�8�GW\�$�0dD�G6X�~JT�=,��g<�2�3SQ���Q7B�8��%L��6@w���#�BQ�'Ppʇ�0$]���t�^�sp��S��̖�2�\����F���^h���� �H�Mfm9g�%�|��a����}lC^�0�Mr�iaŸ�BRG�����`�1$��6?�w�c�;�|���g�U'��6ѱ��;�Z]V�rx\�>��������?��w����Z�@�+���Gt��.T�d3�[�����w��7:
<K{pʻ��%�	��=��)�{��(�o'8^6���_Z�d`;5�o���?�R�c�WsH�n�n�A�M�bț{a�N~�fT���o�=��o(�L�!���]É��;��B���A
��L���j<spKb�%��/�7�_��`�}����� F
�d���;�V�o�MZe�� �]L�E���`�E�Yy �
$pd�8��1�>��f��r�}�I�@X�um���U�9�� >�+�w����fk����l�,�|�(A�����
�V�[�ƃ�%�3$���A3��Ծ���
(sns�O=�	\3��ßv����ػ��&T��f]���o�q��I��z��3LQ�Q��]CM��O����d��=Ms�??C�${����X
_�J��[��a|"�������{c����IML�Q���]��a�o�
�Qw�m�����a�|��y�J���]�\R�9p;�r�&����*��3���u
�'v�Z�]�ջ�/���9�{4�]:�&�n��rf���	�2�
��^
���v����������E��7Op�)��]�bş�=�@\>b�q����PKEePQ�gr��
7pip/_internal/resolution/resolvelib/found_candidates.py�W�n�6��+��2����n�m���ٶY�L�#�E�$���;$ER�o��15|�y��Q�]��%܂�J	��aA���Uz�h��H��~ɔ��:�����˕45�4�|G쾇K·Ri�Bp�I*��ra�Fu=�G�nh���7 .�۸��?�W�~����󯛛�_ޞX�\�x�C�+*�(ɵ
��ޕBEIn�.��)=m���'��#`���;�M�V\·J���̂AKjl�op�՛}=bM4�PA$����'��%y�#9��7j����Ȋ��2Ca��ӤC|�4I�.�2q�:-gd:,G�O���r���*�Xq�Lq{��"i\Ԭ���D`E��$��eNZ�<��Y�...�#��z��$KQf��B�?����c�� �_v 	&�E%�D�kh1Gb�����

��ߦzHPTY9&ȊKτj�
��=�_GQ��F����-F��6ӼR�L<�����n�l`"�y
q�A�#�f��8���(=�:D�5�V��l�#@�Ӊ�N+\.�6+��
m+�S}���x�b��(�ѦH�w^���#��;
���-nPXU��
J����x��kQ��3�5��Qd\�mx$�c�v@>�������W#�E���U��\����4e�~��*Z|E��[�P\����Ď]\}�����S��S��l�*fR̮���%5�)V�����8�z��8;����8Ii�|�ў�m��qqZ��1M��ҷl�b��Z�i��9�\�S�i��;�r�ay/�)�d�]��M�z����z��6
�B�q�M���ت=��~5�H��PЭ�c<�x0�c�3ef:�Yè2��㡖���yr[�YDD�����r���Ƽ�8i�Y�ُ��x���s�>�o��һ<H��s�8��,*���y�b���أ�ń=<
%�!�����I���A]��%_�9�CunڙS����v����A�6�Q
ݎ"q��/ E��x�04I�n��%vđ������	�DnI
���f@9Zߍ���?h��:��o,aʏ��rʔ����S���z��Z_Ȭ����w�i�ȯ 핎�A<��Y28
LJNO5p��mf}��"9m^7��
��XJ��}6�V�/'|9�aɩFݾ�-��sz{�n�y��܇$B�u-�|���IiL�%vwww�4~�_PKEePQ��Q��/pip/_internal/resolution/resolvelib/provider.py�W]o�6}ׯ ܇ڀ#�y@6ٺò�K� �i���*�I��߹�I�i�҈����s����T�'j+mrCV7'j�6�>�����i����:#K�8\dY=��֑ie��jl�.�jw��_����z�G�����LJ��|+-�R��e| e���(��	��b�����k/���U���mC���)
������ڒ������[����,���	��ЁZ����T%E�5��e���f�;�Y�[�$5���{Չ-�3Q1Vi����%>L9�g&�#�FZK6��A�)��
)*ȕ�k���/t=�3�I�#�VݰI�;-*ܞ��w��t���0�IB�ee+��|g��l�Qsrh>��BX��S��W����6�Vi�k�U���9Qr[�TН5�R�DtOC?*�7?UU��?���}�Z�����=����b{t��'��d��)�?����U��I6ln,��⼷��Ʃ��Ht�f�� ]� 6����E�l��*��
;����q6;rEE(Ӡ�wDh�^<t���ֻ��g�1 ��	�%���kX�5��hlg�+����f������+9w�r�π�c��Fa�E�M��5�n�T�eɜTI������KY�܆`����!���*ϲ̗_<�n���SW=ɡ{DRU�(�Yj�@?Ӭ�ẇ��D�D91�����q���e�Q�VJ��n�n&�c�3���1�bOpĐ��{�,*	�[ُ�8��e��+q����$	y16�혆�}:d���ܕp!�t�7�J�F��O���h�B}Y�r�ɉ˵��|}˼��ť�MA�<P0�s�����|��0yD���s0�p<�I��]{MA���C�p^+�5�V���&��K�
�ధP�g����j���F��M{���v�~Z�!��*d:f���k�O�G��%�6WSY�Hb�9�T�'��X���U� 
l�Sk���#�d�Ujc���=Nx����[s��\}Ƙp���3��%jO|��_��3�@I��=
�q�Y�ۊ4�B�0Ma�<Q�2���ȁ�,�5j�,�:%�6�m���^��Fߔ�U���k�!l6˽.OR5\�<
s�o��=�U�}�	���a777�����CR)L��<M�?N��ˍn�����[���(e?(S���feM��[�y+$wdi�D-�d�i$h�o�q7���TQ�6�oY.�5�^]�����0��j����_�p�p�����n_��흍wwN��]��U����#﫦��vɕ���FS����j��m]���,0�0�禃�te�{z��.�^\��I��RN��w�[O�y0�i͓/f6�M7��+�xLb}5%���%�PKEePQ��V���3pip/_internal/resolution/resolvelib/requirements.py�Wmo�6��_qU�X�"�_�h�%�m�����N6g�TH:���(�%;A�9�f 1C�{��s�R�
j^��5�B�f��-�\�k˅^�J[șT��L��IV�dRzQ.-j�D+��MM�[�?���N>�?�-��������N4�3��[��j�5V(m����^�8�}ʇ�75�䨽_�;_�NF���W�6�eBleO�?#��'L�`�~��R�u=�Lr�������9��4Xǭo����f�Ԡ(�-`w�}^E�a��p�ΔD�I�^f=�$P��֝�}�
��ڟh�k-!�k�j�~z�_�8Jۗ�z!����˲���h�v�,��BΆ���֏��V5j��^9����%�
$bV	O�{v��!@_���8C�6���tYM_j��C=B��{]�����&�7��Gu'm�yu�d�Yn���l�yz�Εc�A��F�}-��~r1х�}v�nA�fJ�"\���B�W�
�'w��T�֞��aQf�
�}�N��jf�8�J�v��k��r)U�E��ִ7±^|x:�}G�l��O�5-��Ȅ���qh��6B&�7��eG'J^�4�UU�#�5�T:��Q�E��5�4M�Tb�1
`����
MC�^��z�-TJ#D�u�$9�
6%p��R�m���Y���A�drASB�L�n
�O�B�Z���$*�X,�R�d�@��������L�YW0&�H�B��O����4J���K҈!PN�رͫ�Qµ�݇Ŏ��2�ū��N�Y�+�A\�������h���3�z�Z}�>�w�9l�����k�贛���&x����Ѫ{\ׄC>���`���
���34"�M���5�+Ql(o�Ƹ�T7Pk�(�MLZ��2G8ofO��e��L��+��Ecc[G=
��yҼ��Z��Iw(��P��(����tMQ�Ba ��Z��J��B{0�a����t��JZF#q:bÕL�h̾�5qۛ�j�7D��Eѻ�;����V�2�HG-ц%��,��>��[	1�͗��6�� ��{���n�ڨ��v���}ի>\W��}O�[���X�=��u	��t�W�A�T�C-}���}������x2���?�t�8�gcv�\;��E��
�mO6���PKEePQm.��q'/pip/_internal/resolution/resolvelib/resolver.py�Zm��6��_�n�[� A?��^_��rA�EQ�-�Eۄeҡ���A���I���M�Hk���p^�y���Q�6�Z[��v!݃Fo�Rm���v�Ǣz�ֆ�
�|��G��s�+:+�6�]s��\�F�%*�bJiD��G�ȇ@�o�;�_���;\�Z��嶕�Wqy��[���+��Tp��M!���'�r�V��M����h3Gf�G�hs�X���#ܺ���D�=�s|Za�?v҈�P����DA-��+՝���d�ʊ�я������[�h�	��8�vj��J����婁FT��@��?�Y���ͯջ�߼y��go��R7��ↃϚsX��\,�f������[�m�~�s�_�?or���mw�K����6r���_���tk�S�l�q7>��ۚ�G���hn�ɥ�R���ǣ�6�s��{�=��@�!�o�/đ1�o��E&b��U��2�Y��2�u�@�˖Ê���ѳ�"�%l[7�m{|��Y:g��}u�ng�V��~��<s��+���JnVJ�Z���UZk7�.^}v��ņUp+i�*�'�iE��_^ˀu���xuQӤ,�^�yjU���S*r�ho���{�ߋ`�
��=��@ݵ���j���|���o�[���jq��j
���V/�����8���x�;�.��h��͞�m�qkx-���}�h0ݹ�����]��jVۄ'w��9+��~Py�:Wd��'޴�z�NI��Apf�[sr�e�;�rP�&b=�ӑʼn1�%k���@d�{"VٜY�O�Ѡ��9VX��-���0\mC����j�, 8�-�
3��b����Opc����v�G�\a�����mws����Ӕ����2�j&-2Qڂ��>�[@�`�I�-�O@04v�٢�A�E�}�*C�J-ࢻ�A�,�({�H���[N�9��CcE�)��2��T�4��q�%�Ǒ]NB}n�(��q��l�����(��Öej�$��<M�&�SN�)%�bM�\f����C��FFY��-*	p�U��!T[��m/�w�E����sB�%[}7.Q{C�K9���;Xˣ�n@Br,�%��fˁA��Iw�
3�bP��O1P��>���&��Z��`��_c�����o9�h:�L϶H���d�~*ݚK��&�I�f:��X֮wՁ�=�@��?��Rub���i���=
�26R�!"�]<7l�C�{����l�_ˢ�\��*���8�<O�%� j	���#�x^�ԓ^��3J�j͐���  �ܽr7�}�ĉVp��x=�e��'�g-gB�Dܹ�Q�����([�}e�����.Y�7N%��ZF�g�D��%�����8=ɋ�����\�0~����Y���+�h\�
�=�H�֜S�����?j�����g ���ۗ�I�Fy&H:֩w�vϡ�x��Su[~I�T��U�fv؃���	��q�@�b�p��]��Z�T�Re�'g"%�b�Q����gy!�&�⿖58�P(:uClq&Q@���2���\G_2F�,�$D/QB�o���v�wAr����+��b�rYGs��ZDx��|���٦�[���
j
:��5�tA
u1��Ov��Qװo�u�V+��	�5짚t�פN*�"�X��?��_�g��Hk�ـ`ʢ]}e��a�R��i��ê�+�_�\%N4\3�
C��@��6�}G��9v���C�gwt7S=H�xc5��M���#�E��S�^�
I�“Ƅ����޳��r�����E��]S�uW��GI�&2����g~k�ީ��h-|&�&�c���8��f����h��:x�V�G�F�}�_��P�|lpڋ��_P�3W{Q�U���K-hX��8[�k����ׯ���lJ���Px�zZϾ@��Z:���}[L��-\c���Q�����z�an���G9��̼��r�q��}Bd��|�ȂG}�_>_��-�����z��R=�_�ɩ��ɲp����d�`�i
/f9q���(p���_v�҆�]��7���M��G�����Rw4S/S'��T��I��LDՃ�
4CS>�N��R��n�\'�� �y_j�{⫫��!��	d�$m�M�:Cइ�m\���%ఏ5t�x���J;�<Wr��=cIȴ4�ۉ�C<�i7�(��ъ8¦=��X����%�a>��f}���p�.FXwƥ�ñ!i���5V�E�>j��Ϝ�0:4A=�hn���59;�$��e���:��y��(ކ�1�7�E
7��G�L��4��Jf�d)+P��YБn�c	�
G꽈b�W9{o,b�2��?�rvu���X�X��4����X�%-=췜���hB�!���+�B�uu���d�g6�IJ�v/�e��S����*π�Z���T���8��%JL��-E�U�uU�p�\�~�XD��=�+B�~����?���1!����C״U�ڡ\|�����zb���>�+lȮ��p���s)~ƌ�}�fpt���盎��'	���h�voH���:0W���H���;R������!�'���^Gx���}�?��:���3|'�GlOp8�d!
�K>X�b�������y8�37���r����{P
Q
���� >����𗿙t.ZC*o(J��qG�?*Z��-K{
�zRtp�^+W��9�F�V�{�1��'n��kKP���?�#�+n'�XOu���3��N�
7��x��>-�	mY� ���&���z���<y.��K��P�s�5!��B�r���B:�u��睴AW�じ׀����C�.F���D��Р�˓���5�o�d���)"]$�+�f��\
�T����q
�˔?���wG�K
��b���*|�l�֝��Λ�:"��ˁ�_����Sv�U����K������O��(?8�@@�arf�_U,�"���{��=�a������� f�^ƫ(W�����T���o�>�X\��y��0��T�y�W8�8cEA>�z�_�@�
�Oy��9�S0�۷)I�8�"=6�
���I{�L��u�#r�.��
�{��z��?a�oڡ��V��� ���b�c�
+�S���P�A��	���o��Bi|k����hػ����po!r�]�PKEePQpip/_internal/utils/__init__.pyPKEePQ�b��qEpip/_internal/utils/appdirs.py�TMo�0��W�!	���zP,��¶b�C�bӶVYD�Y.��l���?��G:M�䡕��6NX�"<����
���t���B����>8
�B$��tVx�fXm\*�s�=Xi�kA�%�Aj�G�h����p�?�
37NTA(�������=�'��h�]�b��r�2�YE��ܑ�L([���$�ړڙ��\
���A�ɨ�ޓd�nhኲb��>fl� (��cp��i��ॢ�o�Z�د�������>������)��o�g=e�"�e&�\,��e����-:�
�W1o`J����-�?
�I�.��c�"�ָ�{�g'I��es�wFt�s���%
sX�N����8Wr��L�!�x��t��=m�c���p�S�ӣM�6��3I1G|�I�a�尨k:��g��|2��9��q�科�O5�g�^�n��~�*Ie �K���@�5G�eJ��8��m뽥�<o�oÚ�v��Z��X撈�7�����7>q���9�����ü.(/c�è�ͻ�԰Lٽ���|�����+^�����<Et������
ݠR{���A|FVI?-"�3x�Id����Y�U�PKEePQ��(�%pip/_internal/utils/compat.py�Zms۸��_�*s#r��_r����\_�,O��M}"A�g�`вz����]|����L,�e���}���x|i�<gf�
ˊ<J��rEe���,e���f��X]r�K�e�6��7���x<=cWK�rY�r]T���
��lʌ�Sb%�E�`E-W�ղ�~X����4J� f��7Ǡ��(j��̦�^&r}r�K-F�\�K;'IX���2�ϵ,#�=!�j?���D�����R#e�6�2��-`��*�az	���v�E'��ʤ�u��պ�x1#L���ǂ�BU��Q���=����c����=y��|z���?�|<b�ԡ�7�A>/E�f5�/#v�����OW����8�
4�W�P��P�3�A�v�
�K��$��7���EY�4씝���t��iɵfg�y�S�lh��6�^&I�E�Gl�t�qr.+�i�A����rλ
�ޟ[3onNo#vz;��x�;�f�C1"E�N)�F#�6v
箢�Y���#�ڰ)��h;���:���;b:��E%���O��уq�Q4ŏ��:�Oz�Ӌ�_#�f-�ݖ�s׺-b4J�?C��q�ƍ:�75�=���H�L?Ƒ��&��Y&M��(m���'�݂�\O��ή/�����Y�=�b!��q��f�P��K��Q[�$H��	�r���z��ˤ{�{�h٨T�kVu����~m,Z��
�2)4��a�*��$��Vվ��cwpa���y�ش+ՈC�;`��wvD��N|Ʀ��G�ˈ�yz��J@�U�
��3:�uS��(/��Ӹun�@-l�2X��uż�%�6'�e�Ѕi8"E�Ɩ��+*�A���r�Kz���^2��R!��2hUB�ڶ/!��EU �ꡗ��d�1��b9�Y�榸%����BP�6+~T	�^�x���9K�\��`��C�@IÌdU��H���Re�<$�V��-�T׊5�q�3T�`������/���c�4�f��ڶP���X��U"0��V��	:T��i�1V�'F��O.�K���
$g�;��:1�B��2Q1���E�D��%N��1;����Y�`M��m������j���>iT	��|������������٨�֠��
0�h
l\�	2n8�*��~�n=@�ᆢ��ێz܀([���"?�F�{�9oW`��7�UK��|ls��fF1����@�ŋ�Y�>*�L��"�lLݘ�츆4Z�U��uŤӘ�K����UB"TT5�ye!jU�8,`+��|]9���"b��:����yS�	;��g�ةu`f)*h�it%��R	� V���f��@	m��A3�d^�Jx�ljp}y^�5稦�T�"���

pq��k	����V95�!�qh"�Wq��jV+�
K��A;��L���8L��ek��M�p�n#9�cek�܈촐�Ӥg�Jñ�b>N��M>�1�ת0P��U�U���u1������}܂��xQ�T��hy~�Xo�Ϭg��Z5�Z�m7�� z}5<-��ZCֵ��F�6t����w���`�=� cJ���6Gr�TY9������t�n�e�.�����W�{�,^�uN�
H�Ze|ozO��o\)��k�튑ıh�Ӣw~�-9nL��j��}.�ȸ�.��`���w9/�P4�8^y��Y}~�B��%$��ֈm[gB�?X�zKC�p�r�ءGW;�|�;I.�riM��9[�o�$�B,C�N���5ƫٵ�_c]�r����M��R�1�Z�@��@"7ݦ�m���x��&s�i���a�-E� ���.��^T=ډ��0h����"�Z)i��A���fC�
���� ��X^T�8H]}W��jD
�#%U%��� �
�>CG�
��&�Bl����4�l�%��� �h�P�ȋ�P�蕅�x�<Q-Yt���^�o(�R��q�X��#5�C@�`-q�K��}�pd�ٹ(-q?�8��l]�i�\VHKK�@�y
�-&�)��Z�08̤w���Q����(���r������Z�*�ݐ�@ε����Ck�8�����3�2���̭5;��w����6��C,��6���_���&(�Vs�"ٓ�8��ր��6��mr�ފ��b	���_�!��9p��سB7����<xr�-��H��F�����4��`Q�8N���َ�xo�Y!�VeQ��n���x)���T���M�!���,�����3�"m4�g��˃��V��kF0�1O�
���� ℻#N��T��m������KM`�dK	�����[�xLws��.m�c׀�d��C�:�A��y�C��@F9&!�&��|v:;;�]Oz,�<�:rY�VD�m��;;?��k���]@�mn����3A��pL��.�t���g�;0q��w�gz��������"A�o�J(n���W��^���d^�S\�h\\h�\?溅e	�����V7W��?yc?
&�AΠ%�����e�E��kJB8vaq��3p?�sy/����E��˯����.ʒ\�1@k\ԧ���ؕ�Y5�	�h���\<԰��?���w��h����7"�uF5�+-4lZ�eP��H��BRN��d�7�w��X��~tA~��W�������ɶ�>�����4nO0�m��^Ƞw��k�u�Ǜ��۾}���PX���ŐV)"�U��b���1?��Xb��<��
&n��&1��+HТH	�R�r*�2�������kb<�вA�9zy�	J9,�t�L���fb՞�~�Ц��w�Á�crϕ&g��߾����ڐ#}����ܭ
g)��+1dʤ=(��q/�b�L�g��wo��el#���z\4Ǐ\- ��J�_�kM��4��
,��-yU��_G�6���y���0���3���IZ���t�
��/���?��#ʺ�G�+b>���7�%H%/�5:�V�~�b�����}�hu�m�y��3����]i�]ݙ�a/#��"���|��Ի�ƣ�;�(ܹ�u�XA�6ߛj_p��;/Y�ɞ�:���j�+Jo�^��
�w3>�� �͂��mB<�) ���o�"�B�cKQ,�&�t&�o���yU]�Ǐ*�C87ď����v���5hW!SS&?\��ΰ��A�ݻ��2�S����Ouے�ӛ�[>�7Vz?�xE�,����Z�YL��I�W&����XK!���⻗�&ᎌa���yGOw�B�^�
���"փ����kO;�%���n�M��MG�8��2U��J��'��xW�GÁ<�'�H���YH���7�S��g����/o>�^�!��
Q�c�D���~��r��֨A��هϱ��.0
��9�
#���6�j}
����O�:�~�ѻ)Ɵ���Ύ-cp���7k:c�7���+�˔ě�?P�
�]���~�ao�T�?���4�t�y�7z	���5��li�D���34���)��PKEePQ'J��l?)pip/_internal/utils/compatibility_tags.py�Xmo�6��_qS>HF�N۴5�[1t��4��g��D�l$Q�8F���#)��r^��l�:�{���$�q�Ӕ�DR i[�_���
\�r	/N_�;�dD�%���'���q��`���`U�"�A,�x.�,�I�0(�sZN�X��4�x�g$�"k��}���o���F�",�4PV�`���6F�*6FX*i�����$t�����HHd1�+�'�a�ī'�$��b��]��-�?>_~��˻߂�]\�_�ǨW=�S�����;r2�`H<�OE#_��Ü]j:�6�7��M����,�^�z��a���8�b������C^�@� ��^sth�8RA�)x�)��!�!���C��$���b�� ��"Y�g_�bN�<��r�z	�<t3j!�OOC5h��S�v���G1<�?�2�2� --�|=j�����q�>ZE8��#���ꇄ� ������"ް����a���\y��p�Z����h9��LT�4����!׸c�-�	�a�^��ń+�-/�
�K�q������ghK֖�8[{W�72�8�ߎ=�~Z����,B˝ƀi�1@	�v�EǍ�	��#bvE-���'��ùD
w����<R:�i¯�hЅ"���	�]�Q�"Ǥ£E��������w��x#�3�Vɘ�4�\�*p��Ű5Oѧ��ۚl$�%�z�Q$��uvd�aTف�E�+K�z?��'u�hn#s�ʄ������7m�������7T�f��X)U��?,\�d��y.RhwXc>�f�VOǓn�����i4��"}�)nH����b'$MD×��R�	�.��W��K�#�a�*|} �|�Fm'I�p�
/�Hi7�@��
�u��9Ͱ7Rfbzr��n}s�<_�D�$��P_�cvrt`�`�[Ў�2�*6e�Pŷ.;{}��y}��p�-�)�$STy���]xV)��Ԟ���1y����p���J�H����jr�T�����x5y�$&]=|sfzkϚJ[���|o���!�¶e�N��h_G�/9�#�N�uE��[�J�s<��+��Ƹ<tl�v��v�X2�;;�¤FR��z��`>^�M���ӱD9����Ȥѣ{���T�Devv�SZ���_74�Fk�]����M1Ҷs��Ay�Aw���)�Jf����Q�}=�^k�8�w�w�m?ڋWA[�_��T�O#��ԤeTSҢ@Z�=l�@<lE�L����ꝎOz�>W~,e�} �f,�U��wT�E	�A�U�ѐ��gF�_�;�o���XHb'L�7BR%���p��n�y��Q-���U9�����.�eq�*7{Mݕ�h�9����`9���we��Y���$�pMbV�	6�Q��|&-��!�!v�����\���Q�wch�\�n�@��a��vat�[U��ZIXH�k
��Ѫ�h{@׭ʹ�)��J���=辭��jd�>�[RF_�r��^ԥ�9�Z������i��o�%F�; �@�(u��j�0s��_M�W���㓮jyZ}j�]S��~Rg�=s��L}�ߪb�5^C5
�?��� ���/�À;���x�@��º�AZj�<�+܃PKEePQ�0��'pip/_internal/utils/datetime.pye�A�0E�s����9��.�FSd��В2h������d�����5D�,{�n��x� 7˷�2Z#�Ĉ�&�Q���Y��Z�
c��L�������^Q�]ro͢ݤ��G-�ba+�����'B�d���y��i%�4!��v8S�u��Z����gz���GNO�����PKEePQ�]$�6�"pip/_internal/utils/deprecation.py�V]o�6}ׯ�Pfc��1�i�k�"��E �ms�E���E���%���@1#�-R����s?�4M�ig�FK�[�I�j-w��1ZU|���
oH�t�²#�2��R�V�+S�,Ia0yF�[Ik��9�����"��itI+IV��^����$�Fa_U����o��`fw��WT*'��ES�c-ˋR����N&�ښ�y<���Xl����<>'I���fH�cw��N��,�˪46�E�Y��^Z��u�ka{�8�-�y�@GEc-��-����VBg�W�e�s�Zy��������_��w��}}b�*!|�թ��긠w5�C�$I^ܾ���~�{w����U���wӒ���!lI��s�^�/��~����y�[�EȍU�H��=�d��$�3F&�Q¢��	���&����W	�JcK��tNl䂀En����JC�;�A��2qe��R���s�K�Qe|�7���O�͟���&���Qǧ��<<I
tʹfb2,���|�	�%5N� W�B!s�Įˠ}i�UŖJkڊ�=x�̚sodf��ݍr���6�]be�߄�Y:U��N���d�E�c��"��o��(�OU΃����Gt���Nг9A���v�6�G�X�|x�+5�%(<����>=���FAZ>��KmVB��#�tV�SY�����vw��&�Lq>���rf�<L�@鯵(B�Y�` �E�$u{���C=�������46�G���!Qt�
�/�yF�n�"V��E�"ҁ�G��7 <�s;Tl�{2Ͷ��=b	Ol"�\oi%e5�$k�����5�j:�]T�f^���#���qK��)w����[i��'nնrd{��U5���Jk�u,G��o���݀U��A-"T�/_ۛ�;���F�w�HU�[ḉ�������	A�^rG|�u�)�ͥ�7�l��P�������Q4.E��ښ�*qP�r7�Z��A]�'����<���c7M������[��8ߤ��oc檘7(��6�N��Mڪ���G�?�U��;�J@p��_�<_��\�C�x
�,,�W�����.6dU �K��s�'���WJ�~K�C
��ŀ;}�{T���
�����I�kL��"������\�҂�=%�h��7A#MX��2�A���������(�mV���X�K��2�r��`hB-������?�\^��@�Y��l/�<0��~���!6�-v��M07�dR6�I�O@$�_,�ahϺ�	|d2&
ȳ��9=_�;���b��Ӄg?L�(��q>\�i����g-�R/�'�PKEePQd0a6�)pip/_internal/utils/direct_url_helpers.py�Xmo�6��_A8�&��0�@C�$ݲ�i�&��`i���ȤFRv_��;J�(�IQl�J����NJM��%�Z��\%�R�
iD�S!-ג�FU�6y%4/-muMD��&~g��7��<�99;�9�W'/����.�b�/�Rug�̭�'�w��B�s��_ͻ�t/�!/[+�I���0��/߾~KO�<?��^�^]]\�qHs[��Ib��c����h��z��ꌗ���1�J�XrᾺ�N�~��{�h��@�m�r�/?&b%��I"�\�|G��A�X�Wy�u.�y*��R:o�WTs�Z]�ș0V�E�;%	V	� �r�W�^���R�6��,I��/�P-����ٳ_i����k.K�Rs���ǯ�%�����w����f�S%��dC���"�����K�:�-�8�a�|�UO3���-͉]@����ʩ�V�2yJf�9����~3���{��6��Ʋq���Z�E�>��iAf_�=����o�|���4HNbA�X��x�A;*�f#,U0��'^�ۨ��x�{��=?�̬�G�s�4P�S��w��A�����=�dA�ȥ֬U[WDr�%���.���F"�9ᕰlQs@̗|b`�9�¡rL��A�4Z}�U�ґ(�U�����48���~�H�8�]to���<�b�bU�����L<\�Ghg��,�X�A!�[ͶZ�:�Ԃ$F��R����y��R��	.Sa��n�yMK�//^0(�)�\:�U�A���B���N���4t�!��+�2�xC��+���Ý�y��M�	�\#�X^�n�ԕ�
��)!Rw�#P Ox�Z���՝�P��z�	t��;}���q�^a!/�	�&��H �<n��I7��X�6p1�=�����Q�2�;�j��Lω�dÙ4c0�c��r�+6����.�43'
l�0��:�P�q�'��ޭ�\@����w��*%���D��C2��7*��|$���~��B�2��(J��+��"l!� ���
�{7b`4��h��u��>
�Z�`ɤ��Q���}��Z�0z�v�ʹO<B頛E���(���堙�֏����\��X�{{���|O*�[��}��$�b���_G��QS��a>�7/x�`V�SqKG���{������@���Pxr���h�S/�
1�qC�a�+��-��?Rh?W4��}������R��DNqm�.�,
gl���_-,‰GzG#0�G��<6�w�k�q�Ü GT�f��|���}N�.��N;�ޗ��@w9Ƚ�~�3c1��[K��F�8�`�J�ݴ��8�g}��л��PL�߻�7��n���"���D
�]��Xa\Ƴ��0m�B�ĸ9��9�?�qu>�����gm�O�|�S�PKEePQ���>F%pip/_internal/utils/distutils_args.py�TQk�@~����p����
���ƶP��(!��-Ƿ9w�Nn����I����,�?}ҹ$��B{nX�>E"K��Yb������</���l�l���vә�>�i�f�0�Qu�#�uڬ̗�ۻ����������&�ty�|��.�a�+�s��YE�|[[�a
�0�q���#,�f'0���I��Wv�G�xVu}�T�t@�X��PH�dL��'��V�lLC�\��I;>��Jd-u4�о�>�B��WX@aћi��5�ƹg0r\Ȏ��ʚ�r���i�=�0n�I-��_=�2�PhX�S�q/����mҏ��
�8{׍UO3���8�oC2pd�u!�I�f��}�ܐ	s���O��R��r�.�Zq^��Ҩ�_�������	���@�{��:����
K�C�������KXY�s������f:�}1y��&Gw�p�}?P����ji=Z����S	<TZ8�	�NK|�&�(X
Ys�2���xmr���B�=�OR�R�g}���)�we�K�M'�ǝVi&R�e�������PKEePQp,�Hpip/_internal/utils/encoding.py��]o�0��+���6��*Rv�,ݦ�iԏ��"d�i�:6��������������m���\�yn�h��Ι�/ӽٽ%�0z�(�T(Ǎb2���6r�R�7hٻ��K:�9��N���_�������:�q���nOU)9>�G���#L!�����'�����+���Z��j�˫^"��w�0���'���ƣ^�#�xԟ��'�ɘ�{���*�������+I�/g�����a���z[
�����'���~	���.J�ҀBּV9��
T��c�9�Cΰ�Da��9�vvv6��ԫ`��'Zh�SX8��fϝ�Ú;|��U���qn���8�7��qW^pܻ>�!r�S�❃.�
)h���h5F1Mka�Lo]�kyl���WYnj�;�6!����ʨ�%檉$j:��I�,���B�����f���|5�w*���n��R�0^U@��(9R��br��t
YpSk�tؑ���Ѓ��a+���#�Y��K��$,(�`�?�:k�-�]�6��EgQ�l.D@�\=m�	��������i��:���(�PK�mWy����"pip/_internal/utils/entrypoints.pymT�j�@|�W,�CbP�<$�Bڦ�uMH(!
�,�����c�$W߽;�$n�Bڝ����r?��h���Uk2�(]՚�^��u�!��U������q}s�����a����\Ծ���k�.����EQ4��z��9�S�[��KX�Sl�>)�q���E0����Sy򁟟�p��|*��f7h+
{hh-���n ����j_��Vp,S-S�t�˯�#F�- ��`S����l�>a)&'����2zQ9��Ara5��_B���Ue�3e��b]jz�3FX����A�bS�0`~h[��N�Gy��2�ގ�=˾�q'8�
(Cȃ�4��H��@�u��>-1�y�R��b��<q
6��ͳu�НV5&��+a� �w��i�܁�M1c�O2�Yj@�RLO�Hc�!@99�&�� s�c
x��M�y}�����a�)�f�����E^�fr��������k�V��~Y`;���/�FC��5�4*I�G�.�/�-�n�T��nrj!}�����ENu3��V��	П�!0ѭ��(��?<Fa���c�v����P��}hEm���,�')�(���:���č�����y�c���t�`^�PKEePQ6z�y�	!pip/_internal/utils/filesystem.py�Yms۸��_�:D�dFv��53�$�sz���ۙ$��� �S@�um�{w�(9i��!A`��}v�YD.Km�(=��%WK��E��m����W�^Vov�r���w���r��,�ʉGW���Ȓ+>��rbY�՜K�ٝ�n6o��`�]^ݝ�bF8��jΤeJ;���NdL*�6��x�i�N&ǧG�ӣ��1[/d��E �֋
[Ös��`n!h5.s��U����,��A��M�(l��=�寂��2+�ןN�	b/b���S��Ws��%�d%��k�ҦՊ\pfb�b�еu��?]J�~=?{�ܼ�����ǘ�ܺ�@�;>�����:rި͘�,8��j�.`K��ߤuc�^I��8-��;�|#�pQ%c������R��G2�3DMdE��f��F4bG�U�L)A��`�R҅Hy�Z	�c�XK�ΐ���E�r�#�2���-��`����9�%�D���I�d:��ä��1NQA�Z��}]Y���%��;�R$+�di��i	8-.���l:ek�^�0m(8�r�L�a���Z�쮌bwf%�_`cф},-�Yo
��4�A�eSv���@���I�/�zF�	�Y�+�# ����x�l�Iim��3�=۰te�P��@���Ћ��&]�^�m)R����
-،��L��d�ޣ)�y��� :(��:p�ſ̮2���-�ʱ�_Y^�y�[
颯�G��s0n;��g��T��]ݞ��n���oyaEoB���
��L��/7,��1L��Cr��ѳ�����{x��@����:n[}�z�:檸�BY���$��"��Iǐ%���cV�s�ッ������$	�4_.aX��-m��:���̐�1Ld�,C��<�>�nd��Ɯ+���g�9��Q�6���(^��N&q�ՠ�����1-\D����o����^��몝�6�N�XO��(���[�|��S��m�N)̳>kp���`��z�C�@�4�.�!8R���.]?�(�w�݉s�+��	1.1�C��\���?����<P:�}��F��(d�z�����U�B!A�o���۫�wP�G��غd�3^oQ4ܑg_y
�7q˒�����~����C �J�>�_*��x]9�Q!�;B�R��ȃ��AS�Mq�R�7��O'!\YH�h�bC�q�,�g�r&��8��-��ޗ��a5Y�`Gu���UD{@ڇ�=�./�b�q��D@�	�]�9 �&�3Tr�)�"�N��B��A��e���8�:nF���L��HՐC�Y3(w���U�ӆ1�c�W���f���9��=�aF�}��Y+����F�"���<�(�f�91y"/Vvus�1��F���G�p�+�g�S��L��1#���x2�@�����gz�r2"
t�k�+i�=��0ګW���լ���ﮭҀ��R3-\�u��:hRg8��{ʈ��+���%�?
ɤ7��e�`��"�����tcB��h�+��fitn�X"E������l���A#	�̊��Zo��˨�5[�
-o�֐�#Ol�����ۋ�@��!A%&�?Hh׶��ltz�@�""N=F�g>]6��ɉ1S�s�[��!�[��_X<}���غ���\P38�=�o���J<���RI��
4�N�B�Ғ�g<k)�"�2���
��]����z�kj��vM�
���!�<5��-b�E�6�-7�"&����<�)Hj�͐Z���|C����DTI�9�:��|�X
H[v���o��Pn�d�KaQ.�L8Z9K�*�z_,�.�i�[=�7N�O^��叧?�ͯB�� �4�FǓ���J?��0�
>�WLq���Q��h[ڏ�Q+���Jb��Q�E$�2��J!�\%7�|�a���g7�o�g��Z�����Nj��UI7!���
�8�Z�%�DjEc�LM�vo��m�ۭ���b�����w}��C��ػі�����w�x�ysvv~���û��RP��H9���V���E��_���󉃥9_�[)d��f�H��25ȏ�������u�ܖ�U��
�"���Q��k�Y���+By���V�"�VG����9��2|p���{�{������Dy�#hbuO��ֻ[
6��R&��'|�L��i��b��E
߫��Fg���i��Щ�j?�dTes���Te����Wx}�^���S��V�Ϭ.V��EX�|�+���`b�@r�0x"��h.��.� ����u�;L�̼гJ��5����9AW��k̒q�LR�\��~����� ��ɶ1����G��(��a�i>j����
O�񕋠���5�.�?CK��CI4�"����9�6�Է�
�!�n���V�ZԥѬ��_����o[n�>�P��������/'�d
 �~�Q�F�
)���.����Az�0m����OF���I���.)��PKEePQ�y; pip/_internal/utils/filetypes.py}��N�@������
�zl⡒U��6k�1�&��,��n���P5 a.3����7C�23�*CQ�.S#�!r]������L��Tғ�H�\T�R����~�O<�ywI��y�oD>�^�h]��I���g�>a���M���
��&����_:Ԥ���3�"sh��ŷm���^�FϑR�
�xt������%�E��gM[��Զ8X�[�e��MxD�p�8c�8S$���-8�' ]������/��PKEePQ���r�pip/_internal/utils/glibc.py�Wmo�6��_qPXl�%+�fȀ5ͺ`�[$m��J�l"���T2}�o��E�ܨ],�:>�;>������R���䲪Xm@�e+
�(V�{V�EY1h$��c7��U�LN����Q<7s�.k*.~�B�ɤT��4��i
�j�2@3-EkX��'��.u��;v7�!)����p����s����ۏ��oW���7����k,G��'�?��Mp{��F�ߓ���<��{�4~Lm��.N<ȉE`�'0������G7C���dR�V���Zh�uƙ���Wn��i.��h�����8�F �(��[�+�:�2�,U�59B���sB\'�%�>��0��q%�x�H/Z�����l\��������z���j���m:*��ٍ�x5l�ٓZ�\�Ն�Ube
�
`������J�`}b��4�|��q�o3�Z4���z�����٢��U�\�f��r�\�/���,O��%[��g9]eg�ņg��(�t'��ٳ�f��ԝ��@�/�BOב�g�K!�fT��q��8��M_oߧ�뗗釫���7�(	��H�T�<Y�du68,��{���D7������Yc ���)
�J)�f��6<|�����Wp$9���S.h&�h�,��[Ȅ��l���75t���'2��7��G��Wʓ�f��}p�gEp8`_��b��@_IE9��Pٰ:޾�l��.�j'�!U�n��C;=�躄�VS��-�yf7yyyGPn��B8���t@C!6J������C�j��q8��wX
�����z/��	����=��+[eqs['��u��L{F�ϩ�]74g��'izz��Mw̤�{ĝO�Ș��ꎵ0d�mWeR`�L�S��\�4^1L ��Q��r�%���|�!.1���B�R��/�c{�b�f�1�y��J�e�z��+p���>��H���8V�p
�Yr�K[�s�g��A9>t�F
�˂��9�Q2�	���cG ��h�kUȩ>S�Sd,�$t�֬����!�&pE�/!k���A
�ׇ:o�u>9�������s��B����C!�O܋�d��;:�)bL�c�S���}aaq�e��jTk�x=�(DQ�|ޫ�.ڕ��8�-��n��j�����۲k�´5�����b*Fk[��L�=mQ9�P��/2�-���X��D��mgKxNVd��;�L�I�
�l�[���*n�Ԋ��`)�����*��lf��:dY�����"���8��k/n��;4�(z����*��%�h��|�9��X �׳��-=	�G�0��b��1]o텇��,!�]��f���+_�(���s��ck�C�J=�eqa���4��R�X8$4;BL&�PKEePQ<��p�Fpip/_internal/utils/hashes.py�Xmo�6��_A�,����0d�,�c�S�i�"dZ�m.���T���ݑ�)[FQ���}���޻ԪdY�ll�E�1Y�J[��F��������u!���ղN�GQ-�N�|j/K+4�)MB�b��y�^�W�H�S.j+UeZ.ш�s�JSr������j�&���(8޾�Z�d�h�,LZJ��"��,_7Ճ9~�nk�^y��ݧ��������t:��l��g�q�spv��Z�6aH�*+����MՍgT	���*M��#����h@x=���︖6C�BF|��7��h�ݮ����-Ă9�b��Z2?�
~�)�X�j%�H�Y�J<
M�2+���'99њ� T�FUc����<�p�` �'�e!�6�v��fr{�]���b��ج��?�I�)/�AeZ[P9�ui�PPz�%ѧ�����c�Z������h�c�m�ʠ��n�
dp�
��E�rU��S-��Wt�KG�oo��oH����]�rBʿ��{�����{�#/�1��Dj���m�|urrr�6��5�	J�Y,+��ʺ��SOU� ����^2���=TjS���Z�6C��w!�P!d%m�EF��35�]�<�Hg,��3V��Ʒ�������BG����暗��;g`����*ri� =1��b��5��<�q�g-��	ē5�ѐ4kc���ǣъ�Rr��Q���A�N=�s��^;�S)(�=��;1I<]�M���y��&K&$2h�ϱa.`��"�(�L��ݲH�"Ȳ���E.��d��n1q����r�1<�龁D8hB�O�g���&4�6�`�Q^?ʂ�e�bs��4�jVbC��U?�1��ȥ�e�G]��9IR�:�V����+�F�~e��=օG��Y��,�g�3��w\<\�\�؁�K��	��"��E�����C�K�ɶ��4eT�*������@�����.���ҒD��L�/���O�����S��&�C�iJF͕*š�-�'�l���̢֤��xLv�"�6
l�������Z�'_W�ǐ�Xp7�Za��2fT��F����º����{���]�e���ܻ�u�L�J%}�!J+�q�i(m������2���ل��:^�?�秐;���E7n��#���-�K��M�L��!>��T7��3�}��р�1��G=����sL_��=�iǀH�65�SD�mOT�+W�v�o�%xNS�{�P-���'xR��5c�I��;uI����A3j�7})� z���Kϥ,Z=�uH�v��Ɯ����w���rA�M�L��Dd�Q�a�^{��u�n�����\C��k0��8�y���I�p�Z�!�h��J������6��o��<�۫O�R��7iZ�w���s}KnP��S�`���10���6bsO�@�Q��!d��L�Ӥ�abi���߸�,�
w�_;Wwh��|�(Wr�S��<�>jC��Ł��v:�ʂq���zMk�Z.}۞͜�f3�;���g�b�͖��
�PPn۩ƥ���V��}��?1��}��
��J���r��1�M�ʋ
���n5
LfQ��	D�v��e�so�=�A��P&Q/*�w=�a�G�PKEePQ��z3�*-pip/_internal/utils/inject_securetransport.py���n�0��z
ν�@*8ۭ@�C:{��^
Ţg���QrҼ�h�ɺ�&�)J���J��3th$�-B�T�~bT،�[R.��
��O�b��@�h5��w**��)|fgq���z���_#�PN��|Ȼ�'80�2P|�!�T�j#C����-�>.�dP�מs<]bv�zՔՊM��Ek�˗�������0o�p<��}�_ˏR$I"ĩ�cBhl�:�D�D�fWx]@<xi�7P�|��rB$��W.���i'y9X[O=|��D+:���N��Frb�#�N���[����n��yz_��t�<`��<�2��3S����)�P?n������_o7ps
��:�s��`l�0�A�{tړ�Z��$�"�ݹ�������UG+(�9��~##�'3.�zqN3~�=��
PKEePQ`+sg%3pip/_internal/utils/logging.py�Z{o�6�?!#���r�ܣ]�Ź��.�؁�^�0���z�H�*J���|���K�Vk��b=��p�7Oj�\�Y�<w��!Q�l�\�6�Ȝ���e��CQ0R	�yI��6m͒�)��zJ2.)��o�f]�l?cKy��M&�Z$M��4%��D�:�"o����<_��a�M��	��R؛\��ǃ�dE�,g��υ��k�Y0C�oyް:&7�9�7�6�V�J�[Vf�N$���?�x�a���y�6<�	ȯI��ggo�?^n���f�pQ�9oN>\��>������/ߥp�v���$
.v.+%�6㰇�^O'~�]���Pb�~������uo`��:u�	��\Bv*vJ�M)jPj���A2X�ʀ�*�d��\Դ�5�@9m�O#�<S2t�$�tP����D�.o������2���~(A��W���Y�3Y�E�^]^�ܘ���}���:���;.�S��RsDr��
��;�"��b��.O�%�R��s���8�J	�Sf�{܃�W(h�K���%Cni�)Rp#4�qu��|
B�/i�9,JF�v�Q.�5�Y�+Kh�v1�$�.�l��oVh�G���@D&�{V3��i�y���In��������h�s4��jݬDy���^~�O5chr�y��{jo�ߜ
`��r	���E�XZ��R��1}��
��kٰB���<3H�i��?�e��Ñ���k�93N�PP�|��|Mj�0���X��a�9��N,��J���Ы۲�;�f̈́o
.J��45��'%�
��q�
V��B�
DN*Z7|��̒���pBKG��
�5����p	�VD>Ds�GL�oܫ��x1
���R�P&C�w�LR$)�dzԹ�|��h"�yUT=���\�	wq�n��w# 	NQJ�]->���D��U������:��/(�����WLc\,-�G��T4�0[�����٣X����L0��=�*���Lўb��2
����K&<;���u����~��|)�}s�L`&l:s�cB�\1��c��!S�#m�Vu2;���i�N>�>�XB!�F&��o44^~����O����^~���M�쐔�T��"��2_p�T�6�PuS��/
�3�ݠ
��<�X)��>$�z���ARU�n!tγ��ё�NTN�
	�U�es��t���cj���!��q~�o;��J�J2�m��Q�m)~�S�×���Ӱ;�&��K>�`���w�돊�1hy�9:�q��Pg��QQLt�4������]_h��VL���T�K�L�7����>�܊�>!�,��q.�rT��p2�WW%�|-���2G�a',���p.�mmE�$����<���|��hQA��Ta�Y4K�y���"Б����g����Uv0��P�/�5�FI����T�L�'a����Gv�F��k�rm�KȀ��{��Ҿ�4Q���AO7����w����z�wc��3��P�<Hl�uO�~X�7iJ�/c�G��g��^m�1٠��j�9[K�Z ��L!��<z�pPrC�j
��B�H�c�Z:��Ĝѵ��Y�{��*q8$���lX���m7��hh$�� �.��j8D��Ao�>V���Iy(�N�r�r��,
-�|r(H�R<�tF�1a�^C�7$b�9���9:Z��X�T
�(X.J>D����������]?�D��s�b[����� D����ۢ9Z�Z,�l%!�#F�r�!w[K�n�r!>��;�����)I�7��ٔ����Ÿ�J��E�wz�}�т2�������EB��:sRHbգ��Q�Yn��!��67_�
B��֪�}���84:�=j#f{fc�D�&��ꦱxf�)$�ZF��S}޽���h��MW�JUc���1��6oԤT/F��fV��B�,�Qr���`��NL�g?�?+��eWϾ�>{?}vD����6_�_�L
�r��U�b���Z���R�Q4�=D���m��C�A��ex=��s�ޛ��y�*_�@��F�.��[��~��f��M�R]=�w5��=umc����B^V��R�����L��apܵS.�uΒ��˓����pdH�.��Y��,�T��s�r�
�;��T�C�ò� Gh��)�g+z�s�d�)���t��@!�^�t�#�Ru/V�f w
meS8Rxx��k��xqO������x|�q�#�~<9==��O�4R-v;��5��M�#�Ő��ԭ��Q�$�����f�Z��������tTI��#G��N�:�C�{%��yuzC��!m��������9��@Q�s�DS��ߊ	��t7���?��FƖ����+$��2K
G��t�U3��5��1Z��7����T�ްp����3��K*�N���}��&��{J�ԡ!܊����A�¨,�qɈ�ݠh�i�4��S*i�5
�$��x�K2U�x{�(���:���W�~F�b 0`�i� ��.g"k�GB&���(1��������D1$<ui(SR��5���u7�xfW�P��_���9Z�>�2U!�zl�5��=j�!�ϰȷG���؎}�6\G��氩�
�mP�Z�>2чlDR�5�����H�k!�-Zوo���nt����|�˥���ᧁ�{�	��M�7dT9r{W󆅪˷�[��˲Wq����U�\����F1N,I��x���Q#��G��I�pD���c��
YN��FP+aba�gj�{e�=����Hx�%}(�ή���f��oC7�v��#ڌ����l�����=.a��_�F5#ނv����( �k����������*ڬ�.ia��J���I��?���[���=�?E�՟'����!e�ۊ7��y4Ms���n���c��V�>���9Z�#��|i�:������=K��͠���v���]�Ȯk��%�:��>��Gi��'*&�#q�f�C�Jy�@�ф���ɛu��x�_��"`]'��(���iM�H�]���Q3tf��5����@����!�34u�_6EpK�
Dy��e�Z���.P�3��q;�0����
0�7'��.0%Co������:�pd��yFg|3^��x}1���>>���j�
���=7rQ�Ҳ-�W%TF$�<�x�B4���IK ]X��(	��K���,�ז9�rO���8օ��*�nTSP�E�!\���,�H�z��,!�>n0���vo�w!t;��-��:N28���A��y0N��jKHJ�#H���!$1�!Z�.U��Zc����ssС?@c��֜���\���N�mĘ~��[ ~�٨�Y�r%j<���y=8*�M�!�ɽ%,�kW���LI���AWVqoD�Q�L����71J�v��.�4ƾB�an<����r��5����|^;k����dE�O��-@Ͻ��:���#����	��b��B9b�	��ɡ'5p4�ql��'�Lc5U�P`����a��苫�o:��	����ˠ�jT=&�~�ě4��̰���@\jjI�_�0���2����&��c��4V��H���x��k޶�G��{�la���9R��~��{$��iN��;r�?0�������0����u�[p�W���{�)�s^[o�i&��i.���ܭ���#�9��1��#c��Uj��aD��rt��!K��C���v�$��]p�HQ}&�:>��*4v�Y�]!��'��e2����_�O�֖��� ��c\gu�Ef*'ڲ5f"�H�<2!c9]�:�m{��'�SU�l�R+�.I���r�~�
��>�}X��y_�e���ζm�rn�?PK�mW"V%��"�npip/_internal/utils/misc.py�=k��6���W`�W'���3�<�����N]�v����hJ�$f(�&��(.���$%;�ݫK�<	4�F��h��k)�E��4_�y��ȼj]4�B̤�䦸����b#EY��>�E����dttOlv�n"T]��(�ȓl�,ɔ�o�Jp��&�w�\�,�R�6G˪؈8f�q,�MYT�Hf�ȚZ���H?�y-��,��'����|YɺL�2_׉Z;MS�.+V+���Z�e�һ2���Z7u��ouR��;��ρ�r�SW��|�H~�ֲ��"��ji�]�e��|QT�ey��+����K�k��&A�#�ʂ�'y���$K�q�l���_\>��2��W8U"/��9��԰����j���D���ӳoNN�99�f,��t��N��ۮwb+E�ʋJ`o�V�S�H�ǸE�Q��Bܣ�
��
V��x��X���e�i��j��L3��X�]"��a�eS��&)�ⷴ��"_IU5U�cW&��DJ�㘾�{�4�&��F?i9�4�b�����6��`�E�n.K��N��Ӫ*��Y1O��.,�Κ�)V���1=��o�_�*ޤ�B~���cfE��Q�d���Q848��������/޾f0�^�@`z�zA��Y)��"��,���ỿ����_�>��՛��/��4�m�1@��mZ�M���G�j���-`�m+F���E�ʊY�!�G�9yB�X0��Z����A�櫋G�v��m���r��`���n����x�9�e�C��hM�w��ҧ��g?���-���%�̱�lJl~	;��	�~�[n	[�<Q�J:��)��Y��Q��3�]��BLy�+X(���55�ė<xp|y�>�c�h���U���r4#�91�x�>6nJ`�j��	�%��C��O��6I
�AMp(���ۓx恽��D��*V��D���aCM�-e�Pc��B�7.�`�'M��q9bA�k�jCY��Z����,�I��1�6�XE6�ߌ8Bq�=nRz�
q�G^���
�D`��+�i���q��(` ��y2ǀ�i���J���oP��5(��Q��tE��~�O,a��fz�W��d
�x߻Tt�<��k"�^�?>>���&�xQcSQ,��z����Ca���<y=�����d�
�U�a�DL�	(������
ӒL��8 ��J9O�;��i�Y�p����te�Ӹ�x�=�#.@0���
���,6/����)�m��|�N�XX� �dD臑G��譪��x8�cuފ/�"x(N{��N��K2���C��'W����A��	R�;���V����ڄ��c�c6�&���U�m
\������x}��I��:��<����/^�}��R�])(��"��XP஦J�F��h	����/�*���k�{_y�u�@a�+!�4e�"b$���Љ'9hhWT�(?,#��csG��E�!W#J�����u�L�F1���UT�Pԟ�Ga3^�c�'�����C��NΛuW��@:0pTwM��5+mIk�V��xF�}v�!��zT�'^�w �w����P<�x��hJ�#u�\�@�E	��������)�/IZ�F����W��!���qv;bfvE{2��xn>[�C��}�T�a��M7	��de���`	��'0�)�*�G/r��좃:U����ER�G�,N�<�O���ܐ$.L�u]�UA;�l��º(CA�[��-��z�2Lz�$CMO
H�(�!c�N뢔�&��ϧy#�d�.ܨa�}��bM���֢=��9�o���N{�:�x����'I���G�L	]y��#�0��m��Ԥޕ��Te�2=��Ѕ:�*����
lKW��׀w�k<�:C�����R�֒L g�Z�����D�-i�:2�A���]Q�]�kP��L�+���k6_�kz��p��#�Y��Ҹ8)�&�&O縪��ں8I2h���6ch��P���\b���J��r6��_$g�sPö��(^��r)r�
�0x�K��]���'�m�$���Lz�M�@3�L+x�a�Ȱ��4�ذH��GA,^!��1CZ�_�h�غt��{��и �]⊐
uG2g�j��9<�%�\(�������G�O���'�<kR��L#����U4 $`�6e�Rt[a)1U4�����׎��L
V-��XTy�`}���O��"������
[��>l��@�Q����j�:]���-0҂z��������6�Zj�f�An�T�����X��/�7"K���[¼L������
k���Sȟa��� O0�}�S�Ѻj$|�)��k`D܏���o��k�iF<T����tt,���[��iw@�[�:�yVM��'��p����d"!�w;i��>�])�� [~J1"�Р4G��J�*ŭ�2���D��`qn�9�oV<J��O��ғ3
}\p%d���ە0($<w��ZL��ܵ�d�ʒ��� ��TM��>�_Kb4$�Z�A�3��@X�/섕,�֣hM���jN�pr���m�
IX����Qw�i��v��e~���/�JkM�
�p�^�`/@�b�8d?C^z�hs/������s����f�s�ݙ�@?
L�3=ۮSt�=�gİ�j����ׇ�`rA����i����r#�JV��J
R�6q�[����9NG�i�
V1��x�7�:~�����st�F`hbt0p�<�@aL�(n�N&ԟ��l<_�
F��ô�c�E�0��$�R�I�i�1<���ȱF��E|��K׫d7��q���d���]	̈�s��+W����D|�8��̔�@�e�t�a���
m
I�a.ҭD�	���}�H��S%�'�! o���L��α��O�0#4�� �p�@�h��ɳ�
�
fا�藢�Zjސ���H!�.���D���5
a�:��+�z~F�s��g�Ί��{�]o�.�F��ƕNJm�j�pJ�� ��#����s�����o�I�a��������Tܧ?=�c�a�-?���`��=��ѩ��7[���~7-@�^h8�r7��3�T�C�q�А�Nf
�Q2��m��V���ݵ��c6P|��k�.�ҚltU�Nd,hb�]���Ț
8����~�%�
�4������j�,�YR�=jW�w�tfR.�u�10��6�w��o~���_}������ŗ���ZBr*�(ll��3<ٓ�O(��O���.��:�m5ƙ��	;8'�����``2fd�NAQ30
p"�cq��G�e�6x�	=�<dF��Èi������h��f�c���B9zk��d�4ИM�;<G)weU����&��nT��6�R�AÙ'��x\u�'��ح�܂G=0��c\V
aq��=��;���Du�Xdh�ߨ��N�"����o~��x����W��~�FYIe�e*����"�>WL(�zBγ�4y�f��g�o ^-���G�V��x
W����p�o��F�zg����*�[��&Ka�S�f�\��oG?u�u&>�֪�A��
ybG_�m6�=�;�j�M�pb�l�x(�\/�@��u<�x��秺���l���d��,̍�f���ƍԀ���aP�X.E�'�0�S r
ѯ5�i������֘�`�/؋!H�tg`�����5{W�->7�''_z��"c��.E˜��A��uK%��������I�[[,�m
{��{����F�f�7���nts�f
;kDN]����m��8B�-�+F����j���[�HK��O!-��i����٢�.�{n����*-��>[U��W��u���t�,1��a�1����Bq�*��I����4Ӯ��d�ΪR��҅�`͏	�蘁<Iv'� >L���Q������&o&�����h/t�x�K>�����n)h�KL׋�j��j�9T��l�Һ݌���$4bƧ,�	��y�T���3�r>ζ�Nف�.mG�ʝel�y�>9�����(�"�9Ѝ#FC�`|`�m�doZ^����Xz�l�eJ�`1gL�Y:�„�i�&�q�Μ��	�V��5��n֫Ȓ�y!�&�ߙ� K:�]P�
�.2��qx5*�
����Zk�/�(�,��8�O�ȿ�G0���1�酎�day7�hx�X�U�Fܐ�O��4��X��B�"�x�G�e����ܗC���4�pf��u"i�>Y��Ė��un�r�f.��l�핵
i&|�iWQ�o[1*�8�}�-��O7#�:��<���ې�Q���("��&.�\�W�hw��Q�1��]K�w��G,��0)	�F���e;�+f�&�z��a]��.#��T�����Hu���>AAh~��HÙ@[:7v�™e�x�z����t�ﻘ&.�|�p(e	���e���<��;@�M�hj�+\��UU�ڇ�O&�m&����M�)�q�%��$
�5�k�00�Mn�y�߽��=�!W�P��i�tґ�T�3�D)�vd���5>4�������h��Phq�9sx~wp��!c�@=b�m�6�G����m�O��\qv#�.c�}�k�21э��W�Ew1�6���k�N�{qm�*�L���ӡA%ߓ*��YZ]3�C���v!��
�w��(mX>�3L�n�c2���A���ȡ��mm�t!��h���G	��:�M1{�D�'(Ъ���{��{୶w��3��\�=;�V��R�AݷU��) �2��Ā㼒Imh��n
a��s�p��Km��fY�2�ޕ�v�����=4���k=ߜroX챖�G{-�Ƚ��W?�(>��\�'�d�W�L����k(t����=����'2�1?�}Z�l�f�8�
4����M�ׄQπ��1�W�Hm�LF�bX��bʌu��ǘs�(�.�&_`�;�\�i›�+DS.�Zv�љ���)gz�i�*1if�xQ6�j��Ҳ��FΓ�*�n�b��R����6�c���Q�b{����2+J�8^�����ϋ�N!or����fT=�#k�Õ�Q��
E�"�zyZ�����o�ʢ��J3�F_������t8:�,��6	�v�j8�d��o`S4L	�f��8[ݢ$���P�D��ܨ .䁘�^�ҰOG��`�X���ݿϋ�2��a���v��u/�?�`��{�ẁL�zM��_�sO�`dق�B�v��6y��ni�$+9R�g=����B�g�P�����m�$�{�.��9-�NQ�����	_�<�>���N�?�A���t�G�^�0�R؞��;#ξ���Q]W|(:�Sx�_�%�1�}��s�YkG�UY���ئ �D��8��1�@r�7�pRt�m���թWDRpщ)�A"䇡k�Y���u�x����o����S�5�53(/�6H�;��Z�������KW��Xq��~P�S¢{����@q'ֆ409�͕Yt�ee�&L�9���Um���މ���jv��oA�$�]Ii�A�ڲ��&|q�O��DGصHj��3V{*%�/�:���tV�97
��w"��ܺ�U�Ī��֣�m<jEBW�b�Il�j�d��%H���y1_P����@ϳDa��F>C�e��=/x[%�v�R\b�����v���&_� O��%���j�����&��8P2[��+��i�$�6c�0�G��[�lCf<�P{f��(�\~��\䡭F�Pi��4~]�$h	s1U(B�E�����cP�E��y���JW��3$���7(��o]Ġq`�s�'ˎv��H�V!]�R��%D&�lGL{�qXxǸ���9�;���$p�8�v ֣�BQ�?n��IE�r�;��ޞ��
����N9��'��_Y�[�tGbQ
��8�7���!m����fHl�#�`?�l�����������'���x})����rD�H�X�$`c`�۱σ��^|}��"N�:<��R��x��i��Y��]�'���d�=��o�pS���N8�»��9�{��YV��bĚ������'�{�Nɐt��O>
�y�k+
��=�J���tNv�b~o��=���y�L(����E1�c������Qh�B`�m��T��̓�Z:�=��N4�v�V���
v�B�d�t��bXd�n��W-4.0�N�
��G�ۥ����Ph.�_s�$��X��)]
{���9��r�sp�`x|�j�g��X��_/�9^M�/����K�[ka?��yRRg��UF�7��:�	^�ƶ%�9��[�6��aW2���F�E��3R��� �5��o��G`�'x@�\ޡ�s�;���gzRm����&����F�h6�}�=�:���������Wt�1����2p�VXS���a�04
p�4�@2h"������ĔqR&���؎~5��
~X��5݄�g.�цFO��h,P�Qw#���"�e
�i�.0���`Ƣ�a`�����B�m��L0�=���R�]��v�F�����	�����O�h��m����2��e��R����׶7����Շ���>�,�ч��ʎC%��M�q)MM�҂�W��u]���0z���o^�l(ʠ�yw�x^4�'�P|?��}��LH/=��<����J��i�w�AL)��H�T�P�pz�.��q��8D�e��ikJ. �{�\c�o��|.=DiXh�>��洧B�t�G�
����Gn!���.��fY;�ʆ(a�$���J�EHv�5"���h��FA
S�� �װ�~ŧ��}g���p�=���Q�"�39O��G��d]l�[E	�o�j(t��.�Rl�.'z���P�����ybm$�p�9�1n[����g�XZ#�#���A�[�ה�t��#�gaG�aw�uH�����'�1��4q`���~��6\��a�R�;��&v��--��a��X�w|k�v�l-��Q)lP�uE�;��tgrVc[|�/�gx�mc�	�?Gue�+v:�Q	�T\���p<���D��}��x��.��ٟ�cDu��>�o1p�'��{�w!$t�S��1��&���X��2;����Y���Bh�9̓���]�~�q�a��
lf|™�CXm��?~0�>>��h��
Lے�����95~/�d�+ָ�U!n��P5�E���_.��Z��5�ͧ](|��-Δ����%LG���@p�sD>1�|�ņ��䡎A�fD.v�6s�V�mg�ʾ����˅T��L5h�D	��=5Ǧ6�C����[�v}*g�-ٶ�,,���0bf� ���T��yY2�ƈ�����S�����s��^�-_�����T;�yY%+\-F�_5<�&���(xv�"�s�6L��!�k:�.��m��6�}#L#i���
}�ݷq�.�o���F����W�Gki�+�D:��6�Rk֮�dօ�b�0�c�uM�N��e���pV�[���7�\�yQ�Q�N�o/[��T'f�`��!�i���*����;�{T3�ebuF�2KV&a�rE�J΋UN�T&?�ʼȧ���79�UZ�é�`+Y"�"�:1�A�
��������̱����
9��l���y�@�t�,!�o��^��N�=/3F<�#�iF�`
tχ�`W�|�7��7ii#�������t��Ca��?4�7�Z]�`��e�q�	V��W�3�|oO�(�dhds�ݕ[�M�.V��o]���I����ʝI���u��M7ܢ�
3:(��d>Q�؁DI�$�q��xԥV��Ĕ筿[��m�-����TT�<ş%��t��o�Z�6S�ŏ/&�7����P���B{B5�˂�в8�����O�5L$�#����s]���u�=�;f�fw��	y���
$�\HDYL�B����s�v��)�2�s���r�؀��t`�.�
� 6_2h}(�e��d�DW�e�r��b]o[�TX(c��o�:W��˸�1VG��J�*_���+��X#x<�}�H�:ȝ�ta�C��^�ɹ�yr��JA�Ƀ+�=
o��2y@�J5R=8;��;�G�X�j�(e�@�1���
ss�V�I�-����e�{v��4�2j�����Λ��s�Eo-h6^��8>�`�,Jm�aQ��٤�+�e��;�T�,40�2��>�Gu�7������Ufum�g2N�*��R��M���)�4\��S��ڸ�[��/�b����1
� ��(UI]�+����X
�230bn��ə��_��p�k�ı�)'��m{}�K������^��:9���5��^�l��O�)}%c
���
S�Ft"�lY
��Q������bg���z�/�T]�Z�wZ��n���q��x���d֞:w�5ՠ�%N[�6Kڽ��5/�A�T
�m��~yjj4R6���}�$ޭ$}�R�m`N�ְ��U�&�Gb�~��VC�G���tX�`�O!�@��2���s��>}	��
�=`�GuΕ��;[�ZTj�mjO`괭lXV�=n~7����k�\{8M-�.�_�e�9-�n7��o�aF|P�rJ���?T˝|i��+���4�+7�X������œ񞝆�' z*�ŗ�k��Z��L<_�o�w>Ǟ�E}�)���u��i[�"�c��<<�_PKEePQ�0-��pip/_internal/utils/models.py���N�0��y
�6�n��$$�@�P�5^H�d@�g[���*���K��(��d�I#l)�ƭ����H���(
qO
r�Z�ʥ��C� 6��6}�ŋ�Z2\7R��.�1�k��&��Z�|�Z�+�/o��(�q-��bP����*F���JE���Z��|���V�B_l���h�I��2�<T�U�~��aCa�Q�U��q���2ZJQJ����<�Prߢ�����{-^!^� ��ˈv[fp	��i�r�z�i��_}���pv�bs�=����\\��<��9�[��Q~�o*_�@#q6'�z�e=��g[�SK���̄�϶�˾s-�ajH�f��7c|L�W��� 7{�t�Z����ZL�#OO��irbPKEePQ���Q� pip/_internal/utils/packaging.py�V[O�8~�8�h�D*~��J�T10S
݇B�INZCbgm�?�ΥNZV+m��>��|��B�
���۽�$Q�J[��F�{�I�>����n��N
��%��6�;�+�ΟL�Z�,yC��^�~�&���͑�^���ɛ3Q�fo�)��iQK^2�'��ҭ�4�J�
Z�s�/�V���ފҰJ��S˅�K�����>װu���ݯ��������z��N�'���[Z���y9�;.� ��\�1|���� 5�0d��&���yo=�J��y�S�E{�Ϣ$���j�I,��f�d�� �I�awJF��>7�S��&�/.F\@��H����90ƞb8���*��t:���-�v���yW�'��%l8L�[4g���P5l�-�Py5��%|=����5YAi]fx��pO�_�>���V=�� B�e���B_���Oi�a�H�&�n����p+�a�HKzEY��n�08��0�W�4���8]X�7^���cf��QS�qbT^
��g6H
��0��=�/�!�M7ӷVo"'R�����-p�Ǥy�O�tR��cy@;�ȸ��5��y�1�L�h�f�E	U���:GuǓ�Ȗ���l{��*���`�����A���]�ڢ��<0㊘:�@J�<x�ӞmG3�0�|q��x漓�Áh��\n�ߖ��+�H!��2C�|8�uE�C�2�q��i���8>�XwAh�� �����P۟��~�Z_��N�����{�G3��;גfM4]���B�e���3���'��*���V��l6�Rҟ�����j7B߬��I��σMœC��,ջ����lPTj��]؝����
�����J͍��Gp~��s�{�=Je����^o�S-y\���A��7\?/� ��Hvt����&�Mj�а	47��\d��p<^NMO(�J�f#�������!�%iZ��8P4�G��><��f+"�U�
�M�2�9�H�~ ϩ���f��;��\~2��R;;���Se����dz�91>V����>�.˾����C�n�'��#'��:]�Ba�4~PKEePQ�{���L
pip/_internal/utils/parallel.py�WmO#7���b���qR�"Q�DC/�*����Iև�޳��ܯI6�;݇���H���gf�1�F/QK�ja�R��g��`�P�E��-��9�4I&�tP��Q�5KY��d�DUwu�$}	�&��J��e&�GF'�/)�	]�wp+�r�HA������07��t^Z��	V��BKW��$9�J�Y�(/)T��uE��(
��I:x2��|Dh�x�sl�&�)�|�59A�

�{
�="�[��6:'o�	�CTXĎ���h�La=B��X�ئ5�>f�1�A^�z������M5���я�3�*"dK�+P���-4�[�U�.�B5���!�x�W�hf���VHի���R�l�)�A��� �[��ӛ4988H�,��g����_��z{��=$�ܚ����^��*4B+��J!hu�q*�꘰�`O��i�T�j�j2	FѪ�u�ѰƦ?5�KE!jϽ�Z�6�xww9��77�����/M�|ބ�?y�<��7.	�nTy�Z���R�ԯ�Ε������ه�����I"篈O�x�뮇s*��FmǴ�����4x��j�Sح�/T��V@�,�OY��d4�-�A��4���m�(']ᄄ�!�h���ԻD<�����L���^V�X臐YS�k�aF�N�=i��*"��~�S�����'��s���Q�Zkltq���^e7��5'oLP9|��B�_j�)�B�ԪP/+�yKXC����t��L�kM���jxs�`��~�$�uohhL!W�o��Ō�������)�t[����?Z��eƈ�m#q�������9.e>`G��g%QE��=%��U�.��8�T�<|7�n��h$%C!5b�Edž9��!a,"	z�*���B`���,td��?�r�}9�(Y��I6c.[�>/��|[�={���z�������nM&��\1So�G�6nϗEA��n!��Y@q�x��w6�gF�1�i/�ڬl@�1�6ێ�O$�NyhC��Is���}����1{٦���R%S�Y�h�R�������L�{�� ߝ��s^�;�����5�Jz�b�z����_|mSӞ���]�-�:8Y7)���M�|�����'<�֬�Y���#^�|��<�����m�}�f/���*w�o��"o�v���O֜�/���7��It�?�ڃ$;��Y����]�]��-�PKEePQ�@��$pip/_internal/utils/pkg_resources.py��Qk�@��)D����н����2�C	��T���H�R3��w��NR�llI����\��AMu�^��E�k��7\��j�ZBk�%��U�B��:i��N��d�m��R��&��COO���7��q��/�dU>_g�Nu�pGe��<2������,�J�E:��6:��o~b�{��d2�-�_� Cx���lP����L�#�4�E��=
V�b���m5�t]�����*�i�6�����,��5ijH�f��޳���tz��x�!6���v]�;#1[��I��G��qV�1y����!_K�<:*��;L�{fϠp�}J&��qƦ)1�����`���ԋ���;�p���O7����!�W�I�r�K�ζ�3�&c}~L';�o��\:��1��Ob��c:>k{Z�I]ޯ�v�bU��Q���d��Au����!�.��̠�������/PKEePQK"+�5�'pip/_internal/utils/setuptools_build.py�XQo�6~ׯ�)�1K���-�&E�b(�@���M�&5�r�
��;��,�n�m��<D�����R��Pڂٙ ȵ�@��8�Ң�Lĥ���vWp���?���zs���㧋������G����k��;n�.���+Q�g�Xs�+�׬��,�b\nU��]���0�����"fz��~q�\�5B�]ߗ2C-vn#���U�c�~��vX���#��ၿ�	��D�4��5Jr�{�m9�XJ+�Zsl�xf�U\��Ju��&y��&����=Ӓf�w}��e2c:󩌢tRYrJ�q�,ί>}���|�Ho޾�9�����m�������C�Ǘ�z����?_B��@I2���Y>_�e��qc>��*P���.�qc7iLR��<�5�l<�K!X���͍��qf#wi�y�
ep�>�Lǩ��u�|Mۭ��[M&a0	� �\��}��kHB�_�j%)v�k���Q]uu��j�D�*Κ����A5�&�m��*)
�$U2��L�����P�J�,�5f�*mQZ '^Jͳq��~������4���l�g2�d�
Jkj	9�9��y�g�^jqP��L�M�B3b�^!�N�u�~3�)˸���RϪ_����J�TH�'[
4P�6���+u�����:w�����DC5J�W�����ǽ�;�B��`�J�v�B��0���X~O�aT����Q��s�7̎{�����>�_o��>��H��a�4_�;մ-+�T�t�4������Q�-K.����L.+f$׃��)�..��gp�%�L���q�ќ&^YH�
�EsB�Q���iu28���7J�v$��J�ɣs�-,i$����k:︤CD�h(���SF} `�G���n��a�I�D}R��	Ԝ�/5�; *�aK�N��K�'F�aG�ǃ�9�k;�N���d ��Ha���Ag�*��D֦�|~��Ʊo��U=�rG��ş��*���$B�Ӱ��v�.4��Ҽ��P��p������۸���79	�S�^d���2�K�x�:62,����/hN"���ȯ�[Ӟy�54N���7���E��rۆ�U���[�����&����}K��oH�5�Q�t{��_w�<Ί�h����z�����̸�u�'7�a�>�4�Jg��d�A��J�G~ʌ�o)j�S�w��ĉ���;� |��
̪ħ�5��D����"C���-}!�#|����>�
��]�����"ӥ���O�>��~���6��i�X�� }��hm�juxܨ�h�q�e�Z�rNv�_PKEePQZ��w�&!pip/_internal/utils/subprocess.py�Zmo���_�:8�n�-P0����]p{� ���!
��DǼȤN��5���)��P����p�����馩�J�)��RW5�k�����~v���Q�G�U��i�e�3a���y��LҽP��#?';�Ƴ7�B|Not-Br�jQ)^$Y!SJ�Dծ��~�B�
�Ă�R�ԑ�q�3Q�R��Ǖ25/
�/�J�.kjY�$ӻ��~aLt!�Z������siʂOsq�b+��f\l�r'M�}/�\�;�^0j�U[��2��_o~M�~�����W��nF/�|�k�aF/��F�-�q]��`[��{i@�y��욌ϋ��T�uAl�g������T���h�=ݓ�;�����_��������-O/��3���ذif7���Ös��9**�l6��"�a�.�> ���jS	^�#��7��ID�H������{�+dL*�a����ۭȞ�����ϙ�D��2=�&`�UqdOJ˛
ݍr\d��%-)�4�~3�eA��;�������#�%��sv]oEu�"�T5x���y!9�D[�QU�LED.�V;^����@�pIFBG��8�=Q�f'Tm�=��1p�k
�5���]@��g��Ix�>��	D����Ma�˵�����u N�帓@�`o
o�-8 �ՕD��x{d:��O���xs��Z��ch��~�g�
ٓ5v5C�>E�C"�Liu�M&%˶�B����p�e�"�kaPh�$*��R���A%0~U�Q��R��&��!1e��7-UeA"���0��c��+����Xw���^�?�}խ�3�AA�X��FQqP:;ݷ*�Ĉ��bk�{L����$���l�T`HY�d;k�
�=�C�1Ů���a}:�L����gYC��u�����Y�QI��;p�h.���:���l��G�'�1��8�a,!1:�z�⊵WbqnY±�Y������NE��-������|9�� �������V���j��D*~�BEjD��?�H̙шO,�t�5bǸk�V$D2Tc-
}H�"�k��g2D�%��L>�pc���F�7�I(��q.$f$,�j.�)��R���U�4�9ua���[%0ӹ��`}����[����/�r5��L��`{^4�M&���@���B�n�3��C�s�r�gz�"h��ԗjh�IhtA����g��@���.>.�L$�	�d�4���W��LH��dMeO�of�7����U���;wɾ���9'"��
�R��b�}g�Q��=�s��}��%�{���ٲ�'�4���W!\�=�W���! :�t��
�c�{m%^��c��*��}�;P��s�˚ 5��`�G����X"aV��+�v�Z������w�<�UjE��]M+��4X�@�����)�6'��N�R��C���Jewj/+�N���v2Ь��eD���VF��Yն�'��;s�i�c��y
n\�U�Oõ蕇�O�o�(p��jP�aA��÷�>�"Tva5��²´�U��}*��@t$����>~�߉
o
,�5���h3K؂IgM��؟c=�'X�����2Z�~�<�%�
��kI`�q�J��;�!O�?x�"_$q�	Y����\� ������$�,��;Zc&78��MH��䓍=���v[�C�N�$G��P:cy\�`2�-����2��*l�=��"���v�9�QCU��	ʬ�,)$H��_Е�=YoHsqa�8V����Pإ`\f[Y��>'�}֔Իu�i�8LJa��.a�8`���$��ƿl7�sm��БX�AFBh��܋����S�Q���0hr����P��-�#e+s%~o���c�@�J�V�����T�,� fM-��3���N��L��'�~�0C��sO�Ҹ:Xي��e}����.oo�o�������6�@��.u\���V
73l9�j*o�9@
ո(۞h[V��f�>���;0F�w����z/������}�D�w|*A�kWB��������B�K8Mv��6��x5��&Rmtwp3R뛕�g��mŒ�M����j��D��:�s3�{��1�d��c3��)�Ql�y�2��?�l.�����Z'�a+�y�)��C�h�,6I[=��$z��f@�E��ٿV�h^�kDu�pQw�1u��v��� �`���
+0���4`�@ �77D���7���y!z{�Ev
Z����Q
��M�7f��8�Z���&q�'�ty����sy���>iʜ�bQ�۹1fttt\DJ]ΐlAjۥuu�P�(
\��p�X �)����Q���M.�y��X����,0�Q~�{w��ocr��7W7���~}jhv�X��nU7��Ơn�0��N��M�R'YX�i�إ�����:���{uT���8f�P��.��Ďj�1X"���E�ԃ���㨌-�ف
4���Z;Tp����Kp�[ƉQ ����( �FX�㛷Y`��/R����|TXJջfX�S�9�H*����n��D�6���u��O[7�!�ۉ\,�� �8���]���"��~F!���ى#����ˍ�F�8F!�9�7��<����r��-��r�3�D�X
N�1��X�Q;���lg"��tU�_��Ҥ��^�*�&�Պ��B�����*��7�T�zZJ�XER�U,#�|1y��7�؁����O�W8��pX<���N��h�S�c�^�
�O��j�cb�̴?9����;>/���,�{]WK��M�Z�%@������7��bp�73�\xFc��+5}-=!D�f�@��t����,��o�t�ә
?�:}`��)���h	��RX����tz� ���f�eo���O��t0��D���w���wl�RB�����������c�w�I��*��r��4�x����ne�Z�d&���V�
�P�=$�	tF�K)���S�n��~B1�n�wrt1n7�Vܖ$�������������S��JA�и8D�P�Kg��1�X:��u1��,�g0��q�<,�zsSjp�[2k��R�˱��.F�������X��ې�O���a
���PKEePQ]�zy
� pip/_internal/utils/temp_dir.py�Yms۸��_����Ҕb��=Sݜk��%v�8��<��$���m5����.� )_�w��-��ﳻЪR[�$���U"I�ܖ�2�/��wF$��h�ދ�*��"���R��/r�^�b�*��l�W#��J�b�B��*�x0�\z��͖|-���V�2N�D��*n�<�gҼ5<�������F��p��rU��xgd���isb��X�5��O�}	�3�~|�cr�bq�}������s0�j�����N�}��dj"v��QU�.K#��վ?px���7#��\��_�'W�[�]�͏���g�)P�OG��GT��)^��M���[�?n;b��"�L��e��՞e��:f�E�g����JULB3��7����\-y��g֗Y<BB@"�%�s������g���x��y6��8�����W������L8�r#�����,��F��o�H��|\�͈,�:����_�����ų��u0��o;ᘉ�ӫKp2���&S6��v�52��
�8랧�{i6M4	��Ə�6>*ϺG�1Ю���tL�o�ⳗ"��7+Y���-l���9ך���F�����o�����+:�)�� ۳���;�*��;� �$�&I&Z�i#eh}4z��;�Do�D�D.��?~ja�]�|�<*�i�ia�	�1���|'���4�R��E&S�!����CKQ�m[K�0bŬ�`���5�2Ab��?��5��I�F���~#�P�6�炀{%׀�Y[8����;�B]�pT�a�.7�ډa�*%�Rqlb�ǃ��\����z��&���T|]�;�Ap�SU�R8N�V�06���i�h$Mj �,���j�uA,o�.(y^�.�,9�yh�a ��zXD8t�x���
�[cRrfC,���0^|�͛}�a8�A���`s��<��p&do�w%��_K��Mī���x۷���鄴��%�EY	-
p?�2��F=��ĘJ.��Ӎ!�Ec��J-A.D��_��V�bhd޻XD
���c�`*v�mZ��Ybj5zLT�R�L�+]|�猘ifH���x��˨����{[2��N}�q�X�9"��^Z�k]�Q�9�Z�Ɵ� �o:��@����M^#�G��)МFt��Q�q�$0�w����;�k��\W�Vy�;ȜI�^�8�kݝ��8�ټ&a�[�*��P��	7XK���=�aQ�b�1�\��4ށ	@�tW�\�i��>[
2E�,�Ő\��2�
��q�fW���ÚPE� �8�E��ɨCi���o8Z���k1��n�?v�mpŮ���Z�Vk�:XB���)q�Q��
j�ymǣ]n,p�K\ێӲ����PWf_�*��xO��'J�&b�@�1 6�dl��i*t
������-�Z�7��|
(�Nh���\S�V��
��_U����P=K��O�6�c+\��5�a���N���=�cA���.=bf9D�fm��߭�U�ᤎ���z�ȁL�#9@��/�4�Ͷ�xBjRX�P3�M$�j�X���혀�uJg���]�	�i�C��	�������q��
�R��4�j�Xi�"ݲo���EIﷹ,n].�?ۭ�>v��xE;p�A>t��&�V�4Z!HC˦
�r�o��*��f��*��@����<�K�I��z���ث‚�J���~�@#���q)���O�:�}C``� `���Ĺm��{ƾ�P�CPq)����/��o�VY�
���=1t��5x�a�`�tkeA+	�I(��m�㈽�Y0�b�EX�*��`���q�)�mqc���P�T�Ɛ;٫H	������s������}}{�'��}�u��֢�WN�<����|{l|�Fׇ���$����GC�8��\��B�8�]BZK�a��NV��^�� l��x���,����D�xn�����۬����nx�S��ym��k��Z���F���{�
�Z	�<?S�R�e�R���QC#��s�×��l5Wx����v�`缫�_a�~���jXW�����3Hƙ,V
�晻
=���(��xvL��J���V�qc�ݗ������鋓7o!�dz����=y��?��O��_�Fu�E~8Bp:x�W�UtEx��yM=��,'ǿ���B��3���ȉg���vK�o��Zx�$��ғ4�2�+�MU0/�ݞ%FS�.����G�4�<_��f�E�y�fn��V�B��$RS ��&0�q,v�ԷHDP��&��5
{���-���	��
�Go�&��h4�18uk����D"1��W�X�ɓ�+&d�N)����0��D��Y���ƒX'�w���p����q��1cO��I���ǟ��o��q�A�bRK3����Z>���jYS�jN��<�Wv~�dv¦)�1�±V�k�\	�Џ8��б3�g������]K��v�R�Xth���̥�*<�M�Ƶ�Gt:x�O��%�X�����;&�ǡߕ�$lF�yO��]�]Pe�*��WN���b'�]ioB�.�d�r�x��ot}�����v�/��9����g	�͏x}�G�;�<+聖�_ث��J;�����<3<n��ߎ����~���?PKEePQGʥ��ypip/_internal/utils/typing.py}TMk1��W�!-�k�@�Jh�PBH99���ݕ}���i�&i�1f�3z����f�+��n���u;�	�m!���Y����q�`�гt؍�FH�wp ȑ8�c�}�HO�{�;���֨!��՜�@�ͮM�3�M��i>�1*H�x�a0�sM�v�8�[��s�aCҐ�4`����^xj!���d8��h�&�6E@���?�>�=3u>����3JtQ�~O�r�Qq?v�ݗ�rp|N�8ڊ�'�}�M'Zqj�+Ҁ��sh����nL�Y�/���L�snŠz�6Ȋ��
0��M��)�@��lԃg}�/��Y�rz^�V�갎S/�M2� \ai1*?�QI�ṕRo|/�Ȁ^�'NY������uS��c�Y�R���>�زъ^��m�s�RSV�A�6���ib�����l[b�>�'+D_���el�
-�в�
�@�0Ė-ı
ɵoʢ�E�i=���:/VQy��h�BG\*�.CX)�)R�ޭ�:ֺ��v�y9��w���o_/�������^��v�FhUB'�HM�-��v&�!��˝M&o��r(�[�W�6�Lqyq���fJ�[>W��R�!��cR�'kƻ)|K��;l�{=�MNr�h��]��������LW��~����8���Ir�$�~���5Uq4m+!��z{�2}XM�i5%��$�@MSPKEePQ���͋
% pip/_internal/utils/unpacking.py�Zmo�8��_�Kеtu��]�@��E����ݦE��v��h�[YҊTRwo��̐�IIι�w@?������{{{�Z�RK�X-r�E�x=[�k������h4��K�y��Z�)����5�SU�����x^.�X��R�oj�R���}׼��\��ϲ�[�r%�$��u��D|��J˲PN��X� 9��uY���*A�z]��61����Az���������.��鍽}�zw�:��/��j���B]f�aAPP��x����g?y�C�������(|>0|Drא�)p��\L؏R�	{Ej�]�OpY����Q���i1/G��W���:Y�#�EiZ��H��/_�~����{O?@*���(z4��l�.<����}V��r�{��cđ�vJL�-W#}��i����|Uf
�S����\樦q�ɲ�^���˚�^�eY���û�����I��v���"�(s6k�Z:mV\}�b'8���bv�	�Q��n)#*v���%L�.s�����@�d
�K�((�e�N07 3"<�8O��cn���d���̪�ԓ�g��CTq���N��^�ڸ����}��"�?��*���?��@@&�S`熘��/�
���,2b���
1�T� h;˥}h����EIE�Ą��"�}qn%�y����q����W�(K�z&Q]��l�7YgZ��s�7��b�n��5��Et� u0���2&b�D$&�E
�G9M���Ț))f���8�W�b硳r�*����\~�8:�� �i%�H�Q��<%)
$[���B�����V��9(�}@6�-�`!qWt�%dc��8��o��`kw����M[�F�	i��]?��d `{>A��1Z�@'p�˜���UQ9F6��J�ڍ�&#Q �8~n���-��\���h��,�g3�֝x|�������L(t
���X��7�e
Ox��r�H��Q0G����{�l��i�%�(UwJa���h��Ѭ!(<%�E]6�MY癉��$bw?Ŧ�++�E�P��7�U*S&�r���A�D���/?~̾a��/�v�<<<�]y<�J�?�� �t�`�J�t�B0!�i�Vʵ�ٓ'���nH1��b��6��^�[��)�s��{��w%j�#�M����7'/h4�az��ݻ�zS��Q��aZ�B�䝰9`_-�c�*���>�
�Ȟ�va�o��#�Ѓ|(Z�}p2|H{�=#��,�M-Q.6�
�
���
ȬS+گ����bg�*�Zd�[,`�K��@+���ڤ	�R&�=�i��J�ь,��s���x9��98�
�i���V�����b�x�lɋ��QX���{���1�Bq3I`�M�9��Ԃ ���T���q=��E�v6̵�>�(y�.E<&X��{�q��ʕ��0���E��_�-5�cK,���f~X���O��`¼�ǽQ�W+QȮ��n��?��sw�R�_E�&�d�C�Qw�ECE5`ݗ{%���F�{��|mi����w!b�{0���t�l<̪l���ql!ܔOdӧ�{#5�J�{��n"����|s^lrW�SټHD�)T����>�"����(�//|�V
���7�Ͼ/���tI�g�G~]ʌ�w�'(:��4L,G�-��#bHa�z���
@]���m�9��'���	�߿(K����@�`�C����0	^��O�F���/�C�_�!P��U2�K%�>^r��?(�#)�=y)7�b�j���o���*/�����A�/^���W\x��ʋ�ʚ(��)�(��T��ls�-s4N�����7��v�� ���;�
�9}�M&��w��|kO�nx]���j7~��Lh�!���B�Dg��"��Q�I+Ԥs����F��cw�t���>|������ dD"�{@���ڈ������a�#��-�34�gK�+utp��5S�hL���b�������*H���6�O.��E�s;⬝���6�Ci�¾R5��V`e�0Km_WΝ�H��С����.z���z5�a+�����Rd�<z�p�	Ɔ��%2�-n�Eڄ�i'�B �&�y��,T�M�[�Q8����Tu�53,LRm��J��\�f@}Π4�rY|T� ��_�Ss0�z�E�6���^�\fG�.�����&�P��A�,��!���I࢑��	r���ZSF?�5τ=պ�S�t�߶�S���%�nwL��g�@B�����Z��_�fž�إ]��Ve{7��.��k�BKH���*���&��=3�
������FC�"|a��w�BX��s�-'�����Y�#�������ۋU|��4c�zy��<����c�n����ћ�^���ը��%I�yN�Ԃ��=x�K������#�/�C��M{�6���_;�x��;|�gn�
��j��V`�g�Y��M�xo9wTʧ{��^���2&��n�v�J�������^u�vz0�#��o_�A�Y.��?X�1���:�;�թ�̠qƲ4�`�jKK�t��<�4�?����=��wT���6��L�7�̀�NEz��w���	"�[�P<c����}���PKEePQƔ��pip/_internal/utils/urls.py�TmO�0��_q+�@�X��Ub�T�
mt��C�i�ēc�i������Ti�K�.wϽ=�(+mh�F�[E+�K�D��5��6̊'V�5ZV)�=��7�[h�y�_n�F�vZ�n	B94�KV;!-s�J������M>�r>��_�g����(�=�It��{�&����e0W�FQ��<�˩��.
,1!1mp<N 	޷֙&�.��=�m0��)�Ġ��|�
�?]m̴�hG'f+)\B��MoO��4IږWqW�N�/��8R��h4
ߩVk�9�N�����W��u�͟���J����[-kG�ZB��M鏵v�l܉
βA�`?#�1/1�M酤3h�C/i��(b�]�B��PI�����/q܏%}1�v|~�4��r�jiP�X?�fj���+��{�U:?���\m�iIO�э�a�h%�
m�)�e(��}_O�?����z���r�J���&)u��(td�B��7�{�����"�X�S5��M'��Arں����q��f�U|�i
�'��3�T���XVn�v�6�mY�CJ�Mo�$w���s#Ի� ��
6H�Ϧm�����`�7��V�K��NG���oq�rA��O.k<7F��+���8Ž�ڜ`��?3t+�W]G�n��m����Z�{��;�'msG�w�o��PKEePQ���%vz!pip/_internal/utils/virtualenv.py�Wmo�6��_qs?Xl�6��A�A�4���+XZ�l�4)��]c��iY��dm�h���=Ͻ��f�����`�2��;�j/X|O�ݺ4͓2��ԋ�ո�Ɋ��I�>o]��tY%��I��\e���e~[!Vs�뷗o�ً��Kvu{qq~��/{�O���z��J:?�7��/I2VX�6Vg�_���1�W�(a�g�n����7���f�.O�^�>�]������`E��U%�H��v u��BL�E/V�zR�#_���~�����_�\�⩷����ʉ� %IR����F�X�a�Z�u:��= ��	�#�<��1*,����?:����ٜ;�*+J�	�.���u�}�̒p�f),q�.g��ӣ���Q�kki}����ڻ��0�+P(���0��{���S���;��bQ+�^ǻ��w+�j|G���}��9������K���7�C��
ۯ!GO�QYr��a�1k�~D�W�|��A�����
H�d!�wl�3R�v#���Wy`에�Љ�jKGY^.��Z�~��|G���y��}�/�ݪ�߇3C̠�h1�N���w�L	����n��bLђ�Ԫm�@��!�s�`p��\>N���ޠY�/����ik$��Z�$�ao����KS/��l+���p��e�#�T~"5�LQ�\m8��lc�����ۛg�'�A�XT<y����~s�#Mf*��#�Ƙ�)������pD�,[�;))��t�9,~�.��F"g�r�H�Zl"tX|�E����Zc[�(1��G�Pf�����>ܡ�P��cE����\;�a�JCKdC
���Y
��c���2k�70�e`-��#o�#�3�]#W��A��Z4J�
�U£p�$����hP����ݧE!c�)�6=�f�m�%D��K�<L}� �Ɍ�w$y؇��V�����RE!C'9�bt����\�d	��w ������t
���PT�VH6%1�0q�vqH�>8ۗ�z7��UhB?�08���,Ͻ\�N�=Z�?����st��:�e��q^Q{� �%�==--a( b����ޔ�����He:Nk�*����t
� �ao�	VwޟE%���o���6��v�>���X���8���MiCVm;��JR1s�$�S`�
z!p�EƉs�"�뮠?/&M�ؕ���%!0����Ӛ�&ٴy�����
�>N���6��1����	�ދ��H�I���
f�qz��d����Jڰ*��ihǥ�fC��כCj�g��a+�����Ia�Ji���;�x:��l����:����Apt�מ��h��_bH	�Q�P#;v�R.�����C��6���T��V�,��PKEePQ�%	�pip/_internal/utils/wheel.py�Y�o�6�s0D�ɧ!C
t]�kҢ�]�D�ldI��^��}wLJDَ��h��=x��=��j�j4��e�eU*6����[Y��J�[-�(�LB%��x<͚j��t��i��x𩪊V��<�Fv���s�f�Ē�"�y�D��ӓy���Q�{���_ã�Y�:I�D�W
��n9�MZ-�2^V��x!�iɗb��<m���&��w��E9��o#�-c�T��^�'&J�&����Ԣ)y���Y-�'  ����u�g������\�ݤz]��,���_�W���3�������
xf�e�t�����R(�������A�&�c[����'��4��7��mW��OQ(��� i��_��W�.߿�x���svƢ�	{�[D+@��6���֢����-+�R�|���e ^�
���N�[/�fK^+�t�r�U9�]10�q�^��E�d��\� *e)u�FJ���?1QL�[��s@\Ni~
~���Zu3a����*���3��� )N�`'2�`C�v
�m���W�:b��.u�rw�n��N�4�S��΁D��;C�J��#Λr#�N����v���
<
o����U#M���b3	��R���{��F�� �������%כ�ۼIlc_<
�F#tP�iދ���a�g�7�0�8�~�>��HH��d:�x�F@m	���t6��``�N�Nɠjâ�x�6�QAI�p.P'�R��~���p�O�8ɵ�[M���%�	��x3�su�4o�B�D�g�oN���f M����?t�ƯI������������f�<�ڜՄ�6��-��MkM0 ��k�;�$=F_�*�A�/1{��;��%5q	������Z%rd�+�]��gCE&�����^VЫ@m}2�^)x�x��k����7
�O_���<k�"%��*y�+]�]u���%�.�����vlA���\��:�w�s���6#�D�� X�7���ؒ���{r S��Z���3�'�hGo䑾-��a���K�̦�m}Z���9s_:�u�
�7�i2�!��Is��#9��u?&m�t�2�w��LS�ACa�2]�ܶޞ�FꭠQB����Q�ɕ�t�0��@m�$�#�Pd��[5kp]n�!s�����Da;�إ$_��y�V7���������w��N4

���xŸ��l�l!��4���r*!-�#�uP3,��R�dѷͺ��=��'7�BFV�����
#V�~�T0�!XM��6�
���rՖ���8v�*ۻj�WB�����=�Q�w8�Q�d��V�A!j�*Azf����Xw�lEu�����t%��W�3���v��W�~�N��]L�>�uۢl����xkXz��cϷ��T�^�����P	�h�������F0�8�Vɾ&;���`QO�_�B�1�Ga*��wt�f�
z�o�Bf�s���j�$�d�F_�j��N�[v���2��ɠ�b�L[)�:�5uyjb�)��P?4%�h��N�f�s��O;[���{ڗ��Kݬ2nd3ኢ��Ao��p��R40gUӴ�����IV�a)���-0�1�J��-�\�nw
C��j�#�O�	��~��::Y��W�_JPV�EN@ƒl���Mhhx�*G7A[�d�c�w<����VK	�O���k\p����S7߾�fǟ�B��m7��	����c��X��@=�o m����%��Aw��
aW�᠏ �� ^���T�d5]��ոKSF����	,a�ώM�]���wXG��B����*̛��ș��v�]�Q����ܲ�i�8Ś�9$3%Y�h��v�3+�;�km��]�y`[��rY�L�$�o��ЭA�ӥ�#����F��U���z0߸BP�䋷p�c��]��[�t�u_J��Tm�3	�1Z�:"SZb�u&�q�3/Z������;�wv+/vH��p 1���+NLx��5�CXR�%5�P��sX�iLp�!� b2�&���ވ^U�
��I(`B	I�F����oX�6hĆ/�T�|P�]=��M$�9;I�c��ǿRiC�i�m�H.b�{T%�RB0�%#�''�a��8��`u#D�a�)�ij� �4�-�~1?,Q�şr�@!�-7�V��w���|�'tK��@�i��a�x�<TCC�?Ĩ&ߡ�4�k9�CV`"�`��@3
9"]4����Ew����f~�H4���H�x�‚�R���N���'!�n]'=]�PKEePQ_�QMipip/_internal/vcs/__init__.pyuQMO1�ﯘ����FO^	(1n����t���e:%�w\0&zj�>�NF�-%�'�@BZ��&%L`b��8�	�5�#'�,�5�ܢ�F�����Bh(^DT?!p�%h[d��ֵe� G�K��K�鿨�`R�c�B��ԟI�Ym{xz~����c=}��Iu���%���%SК?)S^\���ʟZ��5�ku�2�\Ҍ�Ʈ�m8��o6�r��h���8�X�0_��y|��<�mfg�y����FtA=��5w0���)�ʧ�#�R&��?�b�3Š�]��)�f�L<����pf���֌۬[�U`P\�PKEePQB�ĶF/pip/_internal/vcs/bazaar.py�Wmo�6��_A4($7����.��b]6��0Z:YD)R%)'��)ɒ_�~��X"����{_+�R�A�
�M]���U�U[�P�-Lࢩ�5F��̓b�[��ջfw�
���j��5P\P��?�r0���Ԍ��9�uc�gb�j=�>�u��l6R�j\g��MƷ�c3'3
�e�UJ�{����p,.��>���j���K�Z����%v������5]�n���^����B�»�����׷�wwo�<��)�}����p\;���]��ѹ���+�Wo�ꂡ$_��z���Oc���hA��Q���odQ�~�����_��z�K�`���`�3���o�l�]XK9ע�v��X���w�E�N!��<I�$�/6	���Z6,ZhD��y7\^A
���N�`k�.+���_����r/'�.U��	���C%��T�`τ�8�{�遞��B|m��D���٠|�6h] IH�9njV;�
$��X��|e4������=l��b2հu�g�0m<����s):��7T�m�.�`;b��6c��u�xiņ�
��3FY�o��M�3l<d�t� ��ŗɼ̧pE�|-p[N���0rd�L�erEƽվ&���]E�������3�,u�?sv�[�j�|����:�K�Io�x�6�aK�8/u�?r�.Ս�4h��d�(
�d��]�Lz�4��ܫݸt�e�N�6v�K{se��ߝ
��@���x��L�t���h��c߭Aʶ���t�p��isH
4�!����.FG��W\�CWi���w�|�h��'[�ń@��m��#f�r�~r[A��X��|�:��S7b��i������2���L�S^�	1���R<�W��3U�
�Nx:�~�zT3� �h?�`GqL3�!$�,(nbFC�mS?6�QY��5�R_/�w ~���p����<�6xç�r_�ʐI�:�!�~���bV#��R>f�p���}DI�Tq�L�
��N�~�wEQ �1F�b�@N���g'S�p�$�gx�XO-Qag���u֍%�	����K�DT�@��Ʊ#�'(:̚7�ͤ�˄�%Y�
�ɻW��@I
�@&2��i;g�X�	��͈�zS�d'Mr�.�-S���쀷��o~���v�w~�O�E�3�Iɠ����,�%��t������sJ�g\�j9�ƙ��0	6C8�ߪ�V�{������O�Y&(�����50D-O�by�b���L򎃪,8|nE״�i��C�+� v8g:��q��>(�:��4$�����}����vclw��PKEePQ,�r���6pip/_internal/vcs/git.py�[ms���_��͐�I�I;�;��z�;{�^n|Nڎ��@$$��H�S3���]$@R�Ӧ��E"��b_�}|�nW�-견wE�dY�^�J3���2gs��X�[�3�`����E�4Nlt#Ert������Hj�Tz��,u�J-d�fij�)+֛Zj��.-R���>/��Xr?k�l�^�����$݊*�%�8NJ�B����.�`\�/�};$���	nW%�,�b>�o��ӥ��J{� V!+^&�s&6�Sn��y�ë|�>6��΄R�R�r�@��R%�Be��eS�}���U��9<W5�Y�QX��f����XoҼ�n�-�~SH��Z���ߠ��I�LJ���._�%��������fn3崜Օ�u���G>7`�Z���ۺ�r�Ք^|g&�6�̳EQ�$�Tש�٤�$�iS����kN�&`��&�
%�4��7�L^N�m�)E7�)�]y.�[�Y�sX������5���#�:XB��E`ʉ{������s
	C��&K���gq�V|
�
r:�z��*��|w�w
@�)JG���ū�ۗ�������p@ X?��,��V\�b��#Z	z���uw��5י�$���Ѿ+t���@ր�hY����gI����ge]	�\e+�
�����^���ߕ����}��/@���	�{�>H�E�Epm���b������\|^dd!��v�^�u�[J����),�j�(���~�Oa�i�����ٗ/i4�U��.����]ߦo�o�S���on����\^F�QPoJ�r�٢��._����ퟔ���B��܍g`!�����b�b������
qa�h�5�du�c%��Mt
��(���s+-������n�!�!����CjhĈ���*v`��IK ���O$��ގL��M��`s��N�<�����2퓝�tO�<�FJ�	C��c�gd0qڛ�[ي��=��v�0����>�4�wT����I��%�K�4NK�Lt��	���4_�Z—��U���	��U��Ut���% %A����xc6�-�S$�Q6cR���r��t�R)LMk�B`$=�8Z��-7)�%޽�o�N�f�6�_�(�pd����{F������oާ�݂s	P�rO��˦r�<�����>�p�4�Z!���R=����ow����	ŏ8���(�B�@-!��T�
������Z�7Bz��;�g�U>'��߉}�����$l�� U�-�<�ۀb���;��YC��к���H=J��_`�q+U�<�ܝy?�� Uu�&a)̍�k@qV�)DԌ��<}��o�r>���S�����Ap��Z�?["�H�	p��;s=IF�;AU��~=��"�I`\|.�2�E����q�c�t��-u�q%!o�4�(�	c��,��V������C�/�����ǰ���Q�.�pBi�s4��_��p�� KD5�����A��:Rv��H�q�"��;�����9�e�`j�
\8p �9�mh��!5��P�ٔM�,���.�����E�j�������A�z��ou���h2a!Bo�Q����:��1��Ѿe��������g��D��y"%{&P��eS�%K�~E$/*Z�]ܷf�ݫ�@+���J����u �j�� ����x����B��M�p�F$�܃�\����~�"�j̀�l�ӿ�>g`ߋ����OT��~�O�YU	���8�a=����O1����V�6�2��&�8&�x���JK���,�v�hpI��W��p�rkz��x�Čr��!\����Z`�����pQ��P��E/�j�-� �T�ꝅ)��
�P�Eujb��
`���?�O ڲ�(A���N|�➛
��P��bNriH0�r�/1¬��u��M.H�5d�U�Y$1���wY,��D�`���kM���-
WbP�IVgU2)9U�W5�DZ�
����c���*���ăm'e(����x��Xsj�d0�ع:�e5��e��r�2���`p;�^�Ba�w��'�� ��7����z+q���m22f2�+��D�܊�|���K���n�&�9��hF��X3�;o*��k0�-��ի3���;�X%�@��=V��a��`dz~d;�����Yo�������f�����E��8S��37$`��E'!@7�9�̠�*ԑ��؏/,�.�¤�	���
�l��
*�&֡9��ۖ�
,<N��
�♻G��ݛ�4#D@�;.+D+�9���*������
J$*���q '�y5�d��7�q�cbYf'�o��Ha�6�,�o��f�ܶ�c�>9f)�VI�W��&�S�Qi_/����3�;�5d�;R�RY
�@{��$��%��~�>��N[E�*ѵ�M&�]+	N�k���"LHl���*q�q�k����y�E��UJ�_�<�k��>P�(��4�<�GW{<̈́d�֞�~�5#��6(���o?Cj���1!?�Z��n  0T��<	J禪&j���2^�ɘ��S���QO��qЕudF}T�|!5(���=����}��u�jQ���&8�B}���	UZ��ip�fv��TY������K-���~����$�ł��5��k�E�W�=�th$��$�;�Z��p؛76��	i�}2?�����o���U��D��s&�YE�C�ɷ���l�|��z���yj�=���O[��&2���p����ӁA:��j8�������o���W��&j�u`���6�G���j/���Hg�4-y�ХpѰ��
�S�ݨC���_��F�x�s2���ɳ��a�9�	0�=��_�2@���(>Cj69�"�^�1Dd�k� ��	Ǐw�z�XW�b�6uhb����,B�r���a����y��̀���O�[:91�eF��=D6mN:ϵ����q��?M�/z��Y��e?>�bK�8�O]v���N��N�2Zt1����'JO��ba⢠CC<��B�X���V0kH&%��]�=h�ĘŊ�g��V��:�;Xy���vF��?��ۛ�]�a�m#VTY��U�w2n�m���u��.džt�bb��x"`�~.6`�&X%��`k��Q%=v�TQe�-��NUG�;sI�="�%�M`���6���5����Dw��f���K(;ф,�~J�_}"��u����%�*�C�A/�k*�۸Ԩ��C�<Q	�M�+F���:b��,�C@+�["�B�8���ЋP����05��?�w�t�ư��ٽ'V2��=y�z���)K�6`����<����<Ѽ|�aЌ�Ip��	��Vy���j���c}GM~��l��l	sM���	�ۂI�;EwsQ���pR�*��
F�/1&�m˟$bt�B�`^߫}�OZ�zF�i��B1��*���ˍ�����i�F�EKoЧ�:�ag�6�$�L�ɋ��o��SV㮄�`S�h{���	4�_t��4w�u�����
�@��"t3ǐg{�^�ӪV��,�u�;�[�&ZDJ��OO�Βn���L�f����x	�l�tZ�Nj����+󃺼tҽ��Ԯ�f(�h{��xW�f>I؟!��l$�n kK	
���+�Ap��cۓ/����;Hj�V�]��$��!��1��Z|�ag;��f�
��[��$ʋ����� �/O�7���n���[����W���˗^ZE��¶5Xؔ��w�m%�B�%�ߤ+���y�"�] �ۡ=�**H�y�*���P\��|�+�IJ�x�`�������W�}1�[��k���H�hHu7%�D}�������_&�u���/]����'!!��tS6�m#B�ыh�^���eͰ��n�=��l�rw��8���8D���N ���
�Yȹ?l\��"�ұw%H�b�.���^�U&!c�)ƙI2���&#��5���j��b$'��{�͡D�!oWZ�B]/��7�΍����h޲��4울�nl�A��hmE[���~��T���%J��W�B;ٗ)<=U��˃'� #�^"D�'t
�z+E�aAu]�^��PE��s껵�f���OyF�;sA*>6��Ѹr��.L�����B��t�����s�B��\|E�|<�cO}cZHϹ�36�>snQ�rMi�L����*����g�*��6
����?PKEePQD�M�K*pip/_internal/vcs/mercurial.py�X�o�6~�_A8(,c���=�����ak�݀"
Z�-����c�;R�(���b�C"����w���"oN֪,�N�
�TUqi�)TS�dʼn���0T'�0/$�(��F�ttE�}��&�0U�i�5��9_�ů�4|4ZkUJ��DT�Җ��Qec9��Q;^��L
�ʴjQ�t�e�tj�c�晠,Sr-65ӆ�x=�̵de�3^[�d'�3˗�5����iV�ZeܘZ+}JAcEi�J�,(���i�lq^�4�ګr��i�>/gyU�\� ���gV�b���
�zw��._�X�A������.;�%j��S�̤[�
�	�[�� �����sK?7sck!s�n���f�y��V�e�z6��'����>'8/E�s��?�s2睸��מ+����5Y^�n�tc	��U�h0w��"���т��������I���woJØ�#�f��܏���~�b�?T4ÿ߭E�����:z4�1Ex�̊l��9]��{�g*n�{����t��Hm)���C�7�Z�{}uR��L/�3�.c���"�+���$��Y�)��Hn��n�x<~�4���r�`2s+�jb�{̹�B�-��AC�m'l1L���s1�V����7ׅJY��CV�Hk����F��O����0�b��>�H������5�YA%ߵh��Κ��)O�π}1�8��-y@�Hs
	�N$�n�ϛTȵ�<Y��F��<3�g�eb�����h��D\�t}���E!.�I�g��TM�3��>NZ ��'�
L�>Pw�K��t���E1���fŷ�5!�B��q�K�� �;:��媊�&=<�d|,�wl�t��=��a�y�Ts�'�-�S��,I&h��t�kJ��s����K~Usk��ĥ��XP��R��r���I����$y��u�!7�
���M��@`�O�8;�1K���d�Z4�lK��ԉ��˪k�Y���전tFC�v�*wԄ~��.�A���y�n��۲�Ȣ�Iݔe��Cl����c��5'�b�ˡiP��4����'!�tDgK�:���&��'
��p\��mR�Z�Q�B��[Qa(.*iO�dx��E��[s�L��m���V`�u��ܿ�ڱE荜;�IV0��PLHPIdS�8�
��I��#&�I͐�O�9���:xΗ��ſ��S��y�[�w�����*�R�z��k�%I�L�"?|?�e�e�iw:
��r��
�Fw�wH�*�H�r��˘|��3�	T��h��T��emR�…��џ��D�4��#��
Đ\�	�
���x�6�W�'�7ͼ�g�0���xd��YZﱒ�Д����=-=��ڊU �*�;�	�؀+w+�� 8r���rҀ�xh�nF�2I��A��w��u��~����(u��{R��t%̫8r'LSC�յ
3�t���ө����C��g0~��ӗB7�q���x�$�f�|�NQ���l�㻲���ɖ+�f������9T�Jxz�M��Ȝk���o�#ú�x�3���A5�-X�V%G�:��ai�?�Ju2m�|�JW��:�>9&�{9�����F�d:�PKEePQ����
o0pip/_internal/vcs/subversion.py�Z{�ܶ�?{C��+��y�s�vc4qR��48_e���UO����-�~��I�z��mR�@��ș��7O�]�[�I�o�l��<MEV1���$b7��"�7"b�T�"��}��
�U]
r��]�[�(�I���"�Eb)/��D��dY�)�&X�yY1~#�D��'=���dsi~��V~҈2�_Wq"}�������%i,C3ߝ0��m	���S�e�*�jV�F�weZ�B��uq�Z�/�D���t��g/뛢�C!�"�"���Y�(���w���K��ׯ����ݻ��4�rJ#J�l�*�Ĭ�I��R�S3'�@n��.M��L�R�н�q"\/�ܫ�]?�O�.�f0�tp3qU �=,�YK�l����}x�t{W��W:�a�����?�_�
��QՂΎ����El9��.�N���|���e������&����ڷf�)���L�{�Q��1N�(D	����D�-��A���u&d�P�h�n�R�R����4c~3X�"�p��m^Wꕄ�THx��)�z ��\WUa�����"�?�����y��K�E(�`Q�b߹a"�����ދ��Q�.�Zhʲ�U�H�ʂ.��É��cH�ʙ�r�\��P+�Kp<.����Q��>7�wqZ�̬�]2�l	�����l�)kȎ=f�@V����$�)�<Lj�Պ�کf|��f�@�L��cD.�-OnݑݑW]2ؼo��Xp}w�F��Z\ӫ�K4�8���U��>2)�Fk���$�L�֤O�W�ε$�:� �����w;���¡��m-��َ��1�Ҭw����R��?fo��������2�j�&����8:�
��C�����I_Xe
����
{���	-�F^�6ﺺL�&�:O�������Z���P��c�$y$B
v�(j3y,�:D,�����U��7{3�36�ҁ̊re�:G�~q��\ǒ<�2��$K�v�C�,S:!V嘶 �p������lVK��d�G���ˈ�*hEY	���b��o�Q��(���x���)�<ϐgN���(:�GEG	�&sv+D1���vD��K�ľ6ґ�z���Ng�?��O/;���6� ���s�Ү�J��^�T�
��M~�O��&�_[��y��h�_B.�r{t��Y���[���i�q�x@e��r@�����l���Q������P	�<��K�!�Hv(�S���q�)3��~O��c��]���s>���%'f�Z�c�Q-Z��,*.0�hʙ6K�m:f?��c�9�
�@o�}6�1Y���昽��%�+۵(U��y]�J-�^�����Mɋ�$�V��E���aX\S�Ɂa~���8��H�q��B�OFH5Cy��f��0�ڮ!���,�V�p��A��AV4�}o�|�M���]s�e2�h�,�`�є��A�M���������B^?B
UL����v3X���<w���^Qƃ
�#k���d.&P��G� �ƆY�w4��9��o0�
�]���Ռ�Z�i]�U	�u��i�Fw�0�\Ն�P��버��z'�}"���m���e���=Y-�����/��$�%[�${�� ��Lj�,E"����6����`'�S��Z7k��6"~'#�gb����Nt:w<�KJ��μg_8�d>�Z�覼���S��ę��W4p�u>f���G���.&#��D@�C�$�Ƃa'#�,y�ͨx�Znt��YUj(-:8��c/�3J�p�5jDw{V0o���_ݥI?�C
"{�'_
^�k:�Ѣ��
�S�*��xR���q��QB��T�J�͂���C�O�Wo����n_�J�$��*�pO<��E.c�V����o�,UZNQ�V_�'�
&��0T���U�s�����@��M�'�B;( 	�JAZ&еp� �z7"䐥�OX�`��	���]��W��ˤ�ֿ�#�~`�X-dBU9��k~��;
=5$V���y4&X#E�+��iQ��tL��������pT�� �=�HDU��ırC��O9� �^���
���l�����/�]
�c�Tco0�5��}
����t���b9�u��
o��6��)PF��S��^�-�����;`\j�|�
�����'�Q0�:W�Sj�v�/�-�I���NU<�+��㱋r-��{1|�:0
\)�%U
�}��h������q,���-�^�֛t��:�
�(�?\��X�R�$�
�2�r(xU�*@C0h���a]bbhQ����'0�^�֛�����	����`��)
��dgr';ѡ��kp1;Va-�u��s!M���]}POۈ��ܞQS���hi�|߿��>�ԑ��7��Z�����`Ơa�$�6r�Rp�b{��n�So����~Ck��`/�֨�!=7���4�
�'�K�>}r=8帻@1Aw�9u��|���őo	��\0H!tA�`o��b �]�7ю��;�⾌ewA����'�����������יʰJ�`{#n��cv:?y6e'g����3�Q��I��l�`9�x������ܟ��?9C���NO�s�������O�|q�lq���Z�3Hh��*���ԟ�>$���\��?�}���-����X��8,s�/�l:ʷ�������;�29���C�5�T�k����D��n+�r��q�\�kQj��_W����\�R���D3	k�v���C��uf.0e�oy�tRق��4�t!o`3�f�ۤ���C]~������V�=�otWo�cT+�@���`e��"29!�2�䍫 鰳���4��#�1b�^:�8�ُE��L�|���$����$����%'�R�N^K8}W��ۛ��D�jTB����J�7��}Yf�	�4q�{IS/I���8��v�wؠ��ح1�BQ]LQb���4f�U��۰R-a*�,�_���P�rX�RyQu>g2�zW�f���B�#���猙�z��>T��׽���:]�)�_0G-�lhU�WRAG�z{�7�/�Mb6��lf'�Jf4��.�@��Ss���Y�^�	�!P�c	O��~��nv,^'�(�1V��r�
Ş�}��|�0��"R������3^Ztdō�����} �F��:�b��m�[!ه�ށ��,d?�GA�7�i-+u�� 6Q�E�����d6%^������n)�!1U��u\�^�#������*�B��\P�ޯEF�+����_D����N�Dj4
�4�[����븐��(b�TiC��\�ㅵ"e�h��䥠%
c�+�R�c��Jܝى�@�

�.��n�|�y~'�Xh̸'Sv>��!lZt��f�݀�U�
]z����׽S�c�a�
n�5QT�r��]F�F����p��g*��'1]���g����5р�q���*�	�Q"�Ke[�{����\�)�++�h��t�_�n�|V�a֚?� R�~ ��_g�*�/*��������3�g�[Iqc�n��R8�)­�����2�Tt�m]�F��t�s��i{@c!����3�\]{����8�t��V�,A&�誥�G� ��q�~���ӥ�>;�/��`c��%���x�'[�v{X ��g�t_���y�Zy���'����y��eD�/9`�5�wO��ԣ$��Z��bp��I-*�_P���Q���	~�\���N�ћ�PKEePQ�&��)ne#pip/_internal/vcs/versioncontrol.py�=ks�6��+p����̦�3;㩻�:i���4Ӥ���zhJ�,l(R%H;�L��=�HPvҴ�i,�x��98@����ϫ��Z�e)~9-��hUWbUWmS�s��ݮn���㣣uSoE����kd�	��W"_��Z���#�\6MU�e}}��k�����t�*�_�r��+���63��.�ndUԍ�z��:k�����Z�Z�K����iה�Z���FK�k��3��Ϣ�V6U^���J�Z���}�#����y����E�[@b�M�7M������/�<��&A�tUowyk�Ve�֙n���V�U)���&3|#��[�W��r���n2�N�V�b���m��
eW(�+�=5�'U�p���N��f�6Rā:�g]7ۼ�V��,o�
L�����'����um&Qy#�r0�������z��������˗/^~7�P�/�Z���L�6r̦֑�Ny�8^8+�?�Ԫ]�0O�,������?�T�#�k^.��~��v�!~��w���
�,��'Y�o�=�����b��UQ�
�8�gLR#8�ޏ��7]�yQ�kq��^�5\�_�%��ˣ��,Yt&.f7+=�g�����A
�=K���ɲ94+�Z(��H��1��-OEB�� �å]����bY�%5C-���+�6�@�v#S�o�(�[P.������a�
���L#��˺��=���ۼM�=��+@Ŧmw������ ��R<��1ǝ�AI�M�k�xS|I#w5�3��B�#W-!s��4�B9D"+����|�P��'�����C{�A�^��X��ROhV���̷�݈�ڋJ�B�b׀}'�^��Z�����_��t�ԫ|'��}Kt�*��3�/80K)�p$�K��sC�_�����?<���������䘆h�3˯����������Ϗ|N�N�!V�#�ܲ�Ym���1�	j#��P_r�ۂ���0��]�䙬nTSW�͍�b�Uu�w��f��U]H=9�U���LP�:�,��
J�#
��ѐ��4%N���?c�K
e�5(#P����pxy#{��+�CXレ�E�>���O�x&�yW�2n7j�[���rqiY<\�)���B�Sal�ƹEU��&g>�܋&WZ��P��Y�(��#�a����3l������(���iOD�����I��yt�4hR�԰8]�}2W`�y W7i�+�V&A����	7C�o��K)n�VHm�*θv��Է����yl��V�"�%@I^@���8X���U����#���߷�^��!^Bh���M�G_�/
�G<)g��m<�Ay��
xh�۠F���g����0���f���UYki��~�xn�{�٩?�@ZBxG\�j@"As���1���F�6���
|#@�A�:^������jI��M=md�$���A��
P�T�<䑣\�@[��%_������3v��Q�c���C̘�a��x��F��J�I�(_U�g	����?i�P�7��F
"���?�W3#���� t���@m��P ���[v�Wh�	)Kos�0�
LF�?��|�X�<�/�M^p��M�	���=�g�H eL�zN����s:$FD5�t�Ă��A �̷Zlr��g-�DhÖ�h�� �y�^�����k@ǡo,~$i�3�`�oY��_ ���q��[`���ـS�����`�am�!(��.hf�,A}{��`h���
�n��-�}}���^w`��2��zͭ�8\]���i��H�R��K^�l���VU��kc3���S�9��.��2#W���6)��Y�6���6�:���-�E�����h�t��˽�2oVT�ݎ������[w�,(W�0����HL�Hz܃vE-���uE
��u@�U^���o���@���B��Cг�Qי��d��<#�<�Ob��gv��|���u;95p���PXd_��?�����1{	2��b��N��z(0�v�ak��s�����Mm"F���ʂ�`�Ĭ���	H�l��r=�ϻj�J��X��<�l�WG}�hR�I�S���Q�u5,퀟�oTA�W@2
|�A�˺���B�t��v���p��G�(4
��y��@�0o�Q���ɕZ���J��HqFv����}6:0"���y6�^�<nʋ����[��]"�I��@�p	�CGa�A���,�T"s̢e�vԺYe4��bv����s
��#���5~��͛j?
�羷8r���?~���	�����9,��%ό�Fh�qk�IJPSؑ�:R�`��;�;Kñ����-
޺a#��¿�c�xg��
�
p����L�c/�����/H�1��~儌\d����|���|�S��3�3N�Sp
v:�{���ax��Zɢ/J���*8푙����C:��OAA�A��t��<3h�G�f,'��/7olF�$Z�]��-�(47cd����¬�2��b,1��<�"�=45�@�gC^�D	=��&��嬝zx�a��c�>�]�[zG��l�Gt%�9e�1Yd�Ԫk�P+c0bi=�\��8c��0Ԕ�U���a+g��T�ʑ�F&�;v6a@ag�Y�׼��l/N�]����Ê}��I٘�2��I���!�UK����
��k޴�7��2b<�U`�Nو-�F=D��)y�q{�7��8i���Ď���8��[-x>�G�4N̈́so�O��L|��5��B�9��(j�1�xX�`�&�F����k޶M�O
x
��
�i`m����z⸀u�<�i1����>vs2�>����#N܀��Pߴ)1�C���7$��)/�1)51�	V�3}l�|�'�g�`�x9id�����	�g{���5Ȃ򈖫�G��Uz֣1�j��Ա�Ĝ�����5I
�‚x�
�c���9����>�C�>�!R�u����ƶDT�|yk���݅�z�Y�R'�����̬�3ۙ�^���U{{���!�4���C�)d9\�ǁ����wa	��'w�`�]�)��8g���
.)�8U+�����-M��S�OԒ�V7�rA|�������<yo���U���p�Ig~r��¤X�<F&�����OU�<�s�$��儩��L���hLo��w;�1�]�^��>J��+�C��~��M]ki�v���J6'�Z���k>�h����Y��Q���T��R����p�z[���R�����n9oh�
��K��`�Vْ,I�2����00�ZV��4X�[��cz����g�m�.�o���H���v@�*����@d��@��zE<b�Y��C�:V`�j�C�I`P�LY߂�{!a1���0��0ċMX��L:��^��	�G��A�4��`P�{����^t�|(�\ڎ��(J���L�«�0�S�A�ɛ�<f@�����&u���!�1� /r���S��VB�R�|�z(ˋ��ðd��ػ�+||����	6��j'���-/�
��a���h3m��(�B[E����d1��ŴK�\�B�ߴc�d���i�{轮�L���X���r~}"ew����"�t�î&��ۭ�~�7�&:E��t�$
�C�찼��LRs~i}�T4������ːh{@�v���2���X�̃(�'�P��eϊ��*�p[b� &�U�C���=x2��1e�}�78[A*O�0��"&�ڪ2o,�벤���#oV!�{.1�퇧�-�LY�؇	�s�%b��Vx���)k��Z�������30t��y՜V-�6s?{jD�_TD��c��4ظ=W�ޯ����O��T5����?�j���8
~@�$���:t����m��!���p�⼯�vƸ�eݾ؂���Hނu���Y��IYa�HݵƱ$z�ܩ���~�<�AQ�B��������Zx�4S��A�]�pX��{T�/�L�a��w��s���~$H�@/�\3�ab3�~X*���?��Cor��1��B,^Z�������wj��^�|+�Un��h��)>0m�F{��
�q��Sg2�����х�	i�8~�Xx=>y��`ԫC��
��L�=S��4J/a�\�Or��#��ݑׇEv��^����r(U����A�A�0�S+���l!=��ONm��U�U��]�ZzEJ~��C���c8�kM������(ӄ��&U�+b>\���][���-�q5P`U�5H�j&J�P9�إZ�
#��b;M"�?��M���<C�R}�}����Sy+���hC�����8���8����hsn��,49e�zs�����8��X~���'��c11��
Ky�T1�~^/FQ����YfCܡ�AK�+d(����[�;��I��QX��ksL�虙~�X$���X7
���Ӱ''�,Α JON0�p[7�U��h���ؔ%o��zc�h��-&6)t��=Ҝ}�N��;ݭ���L�Fl;M��{u����e�XvH�*�.`>?�۞l����!薓���)O�`O:~��I��i�X�b�k�F1�N�}.�����ӿ��N6���}f0�tS��H(.�Yk-f�f�vKQ�F��������u��b�h��%r��C71Vc���Hd<���׏�1i�U]~}���W���E�+e��M��XB��I��<�a��nG�&};��Y�l���Xi��1
��/li@�B<�_<qld��t�v\ifö��hw?R��=�!���GLx�����]ж߈��d��Σ�cr��C� �S��r�k��!L��~:�����q*
d����C^�CM�T7�*
>5���⚦>~�����U��䠰�f��D��C�pP Q8���c��P�]�>z>��+�z	�g�V���&��m��ǵ��
<HV���ƒ��tr)��Q�Y5Tι���?m��9��`�$�����\5��!W��¨�C��]=N���{
g����ˉ��]|u3|��ћ�]4���j��]Z����+F��Q�"�Q|豨�&#q��<$��R��G���J�����=�q�#�Ҡ��{�U�v5 �̱�z��	�5���L���9(�����%�o���yc�Z�^����OON�󨢽�y���;�Qժ����=���P�l$�8�j��I�d�gZ����{1�Z�X�W�b@�#ٿ;����[�ҷ�d���E�9צ&�5��o����g���@W��;7*��x�m=8P`�r�0EIuw����G��4��|_]�WW�_\�������������s �C��4�{y�'��'tH
�Pdr6�guu����'����8=��"��vy�j�qwp#p|���쪫bX�n�����6ؕ����kɛ�݀t��|�i�h�9	�ž�j+ә�B��R��m~-]IĖ`Q�CE�d�Q��0�pzL\B���\yá��B���&����s�lBW��?��9g�ǫl��;�$hR��BI�w�*������^ð���?�Ӻ���7(��F���T��Ps�b����CDO�D!�9c*�R�hJ���m��x��v�
o�g��|"ʏ���e�A&��x"\��@�t=�kS�T��(�n�1i��E��ƚ�G6�#K-����[E7'��\�r�	J夭OH��ƣ��w��p�*� ��()h�q�ޅ�P/É�~v���d��9�]��9:�
&�s�7�%�9](&�*�ѝk
���N~~fL�;1��?5n)����i2�υ�o]3w���5��[�|���N�����Һ���'��$���v
��$���B��C�-��E}�}�:��	�l���Ds��K5��?)v�EQ�M��'���?]�������9��,�
����69yr���� s�R�
���|�M���\�!���8f�uK���(w��ߡ����!������o}�kn�6Z�l��c�xV�b��K�=ZjP�~���It�8#�-�����2����oT�Q�c��F�j�)��ضB��w�=8/%(����q���FJ	���>I���+��YU���<��O�~�z��?>�D0�\��3W����{�Nߣ^QLE�yA�O�F�0qb�9[F�vrSB��Yx�j����ޝ8�Sk8�R�τ�A��%��%,�S~�e5]e�tj��~|�}���>w���7�K���I�s�~�>t��v����ܰ�������F�
赇v�
ާ׈��o�S*�
�(���t�67b��
~��Gm��� p�
�Q�Vo�-O���/��/�3:�j�'k�{���E>!7�>���b�5ڀ-Ÿ�
rx�可Ya��{������|���j��A��U�n/*S���d�"ґﵤ�
�T�^ē���p�0L���'�$��.޲<�޲
��z��c�<���0�>�������y��z���/���}�x��k�C����>�l��Z��O�+����\s4�E���8��{�K:yD%8�S�p�1c����B����𲴇z�l*��z��9�矂��[��n4Ν�����]�8�1^|�;�K���ͭ%��HS	�wUs#���\Yg�K5k[x�W�N�*��[�).]J[nXH���\�-����laL�.v+��]�-Ӱ�	�T<b�"�%]���d�9�t�k=�#8���ЖFF_ _��ofu:i��E.�d��5��k���?�PKEePQ�6R���pip/_vendor/__init__.py�WM��6��W�C�����rh�4@�C�"� hil�K�,I��
����e;�Ѣ>�Z��p�͛G9���*[�w���	��
�ғ�֢&���U��0+c���`DGT�YZΒ�0�����r��E��UQT�UMC��dߘ^�bI�2�Q-T�A.5	������vYok`�t��y7�r�����l�,Gyq�,W}��%bZゐKot�L�Y6���Y�_X�ݣ�,��fӥrT���}0΋M��F4�۲�j��L�Qʐ�D��T^�I������Fi�g�^��!��kP���(#�*�{v/��%�{u�!�T:��#��͛������Z�o�qyo�Hw%{Bs�~��j�B��H)P 2G�M��*�6!���4�!U>��^�Zu3.�2B�UCF!Pk��|עnkI8 'a���m������kZ*�E��%�L"E�}�|!�k`�H9�X�CC���t�R���^N.��������@q`Lv����u��x��r>�"�h�P���hrCڢ�+���i�nq&iN@��ԽN�0�(@c&(��K�)/"љ�98�0^�����A�R�Q��uy�V��Ee�K�v�gG*�{�蟞|����//L�j<v�2��2��n��5��~�����K^�V��;e��Y�
n���Ƶ,Yġgs�l���ү�Σ3�Wd�x�o�3n�"�B�*0A�00��*�
'�Bo�����~."i�C��AT'UGBo`�J)�У�[����~0l��<��BD{#}�(�}`W/�~^�X5�[����jU��C�J�8�����n;ޏ 1�6h���V[�W��O��ʟ�j��ӌg%�!'{�y��~<"�'��ps��O���/0���w�<������|(��F�(�R��CG��|����U2�FE	`�MG��2�h(����1�1M��A�Y�Y�y��;�f��NF���
�?�.�kX�X�:�<�)��%��d���ԻEB�\�[�*fO��`Hܱ��h���5�C��=��oAfg<��k�<ҾȠE��p!~��Xv/{	E����Na0�=�P;��z�$DG@����+f�C�FA�ۨn6���|b>���F��묓�u��(�$o�Kk!�>��^ɪ!��ѧ��Z��u�q������>�N�O����8����rZ}uΞ_&άa��贾q��~ ܑ@w�N̬�n%�����7,��
�ҙFX�W�^�.߮KG}��Tg�Yc�t�n�s���7�Q�a�*:�Љŀ��,J�KS��)�n�^���d͙��#��t���}�a���2輟�;���(��i���a��t���?��ZU�9�8�!���u�򏝲A�|Y�?Q�||i���_05����DB3�Z�a�M�v&yxNM�j
q�qC=��4�=��"
�T'f�T��Z�K�T7<�q�F����=����x�;%Wܬ���PKEePQ�_�b3epip/_vendor/appdirs.py�\�V�Ȓ����kv�m����DŽ���p&6&��	9Yn�
�ګ�Ϟ��o���U��R�,��0�,���VwUu}��Z���ڙLڽ0n�M��H�+�l}m�����������@L�I8��4�������
����~�YG�k?��8��9���ߟ�3�&��HVVj�ڻ4��4�
D�<��8�A�O&Q�i(�u9�A8�魬t8g�Gi:�i��a:�z^ �mK�6L�{��F��q�e�ry���������\={�9<a"f�#I���@����g�0RC��e6��$��a�	* A�|�gQ�rr�������y��ɿoonl={������G�[��[ۛ���n(I���v؇èϯx$&<�P1\�A6�qJJjÔ�·���>I3?j�8{	w�2��v���7J�1�p�C��~��k79'�����/�A�y���TL<��=_rP*�����e���t�W<� R��vYm�{�=�Y���@Х4��4�8mH>ą4I���1�Hy�!mԼZ�����Q�LN��(���ٯ�@~�lf7>��]�
��쬀Y���ǧ	]�yX
1�@
I*������_o�i��G�	ٍ�1�ʧ�����	Psf�C�=�F\K�VYMc�j���S��S�,��$�X֯�x{�Nx4�8�&o<k>=0>�4%�i��8�A�:Y|�/�;^t�tVY��)Fp:
%Q-¹[5_cv�s?j�^6��)3KӃp!�&~����.y�<�8q���11��c��"�
�c*-*k�Y��S&e��ҥ=}�Da���)�ÏqZW΁%�������Q�Ee��4�I8�5!��~�e�%F��O���'���;�\(�L�'兀'ݔ7�N�6PkO�(j?}����R�dH���6���Z�y��\ׅ�n@��5��0
��#��u��o��!sw_��I�JY�-O�$f����F��r�;�W`I�%DZ�?d|c����	ɐ
����;0%����h7��H�H*!)y�s8���X��$�cuжm�E���zv?D�����	(��+e��	|�wH��a&��:���S�
���fI��KT�֓�~8�Kn�K��P8D�{aj�^����LLP<?2FW���L��q�J1��� 8p�rG�!̦p�~C��*>�!%hdB(� =���1�b�������G����C�Zd�j4�tj��g��y����D�h�������3�4<-��X��	q?n1
	�֛,�[�Sv�d��7��������h{�<�?�#�ƖDW�+��<��%r�&4�П$�0�R�Q�yB��\��i�)""1�w�9D��8�%�Dx����O�� x��ɣ�5�w�͍&A�=�%~tV��B)3.u~СcImԄ���NN��W�߿گ�<�EP��y����	}33H�6,$���J����)W5��@������M��b�E�Ж#��9B9�7@n�����7G�|+�ܕ��z`
d�-�Dv;�2*,�+��x�:C޻�~J�@)�)��]���ey���W���SV��w�UE�$݊%ͥ�V��C�H�$�޴�5g�"qM��#qԒ�O���RK���yF�����p���+4C�P9��Z�W�X3w攳]����P\w�<K�t�_w���p5t_���Ӄ��BN�J�.+*����!O� o��DM�`�����~B��V����~�@O�0i:����D��F1�{g�J܂f��ũ�~�z���^`1	���F�q�z�J֒�֖�ݒ����4h��?����(�G�5�aʿ+�Q3�����#��Œ�&~�`��Z��zkP%]AG!l�a]�\]�`�ˢP�L�H&G��bͽ����g�
`��� c�g���Vқ!�B��S+���[�zT&K5	`�`1���.�Y+��|�qit��{	�)B��>�:���~��Z��K?���a��,C�$�|���>x:uy�zkV:FD�k:B?�T]j��0�ݯ��jX]'`�S��S���T,��I5�����؍4
b5���ۓ㓟vء ��3B�disE�hI���/�8%����߲`MC���7oNOr���-��?���V�l�c\ǴRR��H�<��!��B�YJ�Ο�^�Z�ǙT
p�^$��'�mp&��]��B�7^�8cҀk���NnpMC�aB!A��29�/͟��%��Khs�h�MaFWl�iŖ4��"��5lhr���j����s`������
�z+�܈VL ��> �C+����Vt�R�֌��W�{&�L�ܔ�ߝ������w��*�W���MK�[��%��m��5�m���d�O3%����N1Y�f-j~3L��[�mOO��O�!�"+j4CܖR�\�p拏�U��7�no�
�/��-��z�P����V���t�s��O��Mh��L��%���v��lj�s4P�U���Ͷ%���5C����+?ƕ��2�ʂ�XЯ�X[��e���~�����!�$L�<��QU����۪�R]��c(��p��$�6�ٷ��αբ�w��'O����lϢ�G�B����?�����<twܩ��μ$$~g8&&a��p7y���|�cp�c:��K�o�Q:�T�R��a[;���������L�إљm��z6�]
x�#����J�rȈ^g���U��ӹۏ��c$t%��;�4�������.2�$�`��3=h��T�КN=��R�P����o�7��pW�.O6Վ�x]�0���3
��kda�v^~s�#�)H��,X�B'Yj\�J1��陵�/Y#)��
��K�0��<��i�)<ϻx#~�ȿx	��ĥ��x�?U�'�c~��&<)��MoC����dG��,�*�d9���M���c��B,i8��?���t�fOfݛ�6t|��MAy��Vˆ
w�)n�b;�K�=���_m�Hw��#L>�>�
�G<��i(60���,���gk����d�ǖ��~��Y	~H	����.�O���#iKR�w!���kޛ�
�ލx���hA�n
R�o��8\�#��|J<���>���9(����yF�u����gqc9=��޷g�wv�Ϗ�:��	'��Bp��DHXm�n�/C�OW�j�����tt��D�JkP
��7)׏��?B-�e~�3"����s�be�>S�+���R�Rqy�
5`�P����QſZ;���i-�0�Q��4�mZc�P��e�n:>��uC���sk##U�3�����I������Wl�)j�-׎k�;ev�q�h��5�޺�g�^t��{f�攔>��0���I�l�Zo�d9~])'�Q�̖��Es*����Å��)�0�3[7s-l?�:��V�z̽���4̙94�|�t2:�5��-CF]�����M<�?:U�0�
�Q�Q8с��x�8�JЃ���Kh,��eY�+M�݆�� ���`����r�y�������r��\�[��;�����^6;�ql�rqj�[����?qÓt�k�u|�o-G�iv�������X>�k/�hc�kkΓ׽a�Z��1_U������\~�a��K��P�[���-h;O�����R]W��X��ۻ@8w�	g��D��|�`s�ZY]�?fޛ��Bd�
j�]:���}�݄q�8m2�G�r�����S��yj��ͱ�?!:�����m�Y±��7�邥[�a�'������@$��0�k]��Sm�Ƞ`r�/���=��إꪏ3�@4��W9�Qd�+�[+�m;���v�USz���������"����X�G�uɧ��V�:��O�g.�������o�Nλ�:Go��y/����И�� ���/�.�n&�Hxr�AM���)�저	xu��ܒ��3�LA<}t��[��vP
�+}qsw2%:�t�,]��#���%�lH���x�"~�:�~�Z��o��i
1�O����PR��s�kzqݥn+���	E�x�ㆥą�}�I�zt��S��Ԟ?�;�����F\�4	��7�L������5�[�hi��Cq����9��6�h��0`#���Q8�”#?)�;����{�Pz>�_�2/�ˁ�u�x�0�G����Ƴg{E�b��.R�"��� �E��3��"��kS����dzG�e����K�i�zg�K��i>%�6�[�$���to.{`�����pe
{��7��c�{�$"�e��k�;e���|�rA`��٘�+T���1�}F��֓���[S�֏s�_/�J8/kB�מ^7�Vwsc�ұ�m�x
��r�o����HӠ��t��Q3?b�h)�;e�GʭQRD��v[�[A�r�q	h��5��<�Ő��Z�H��Pn��Wl�ϧ.�ϱ?��$��k�,TT�׫��̙k�X�����ve�;7I��:{�ޛ�ݳ��Wl�mY�Mx�s(ʍzPo��\�Iu�C�t�O��!3�M��)pfzt�\*rj�=i�<�zvd�d��*��G��Rѡ*FfL�*i�f�ܢ^�ب��(���KD�n}�Sq����&�м���D�-���Q��3����VO���kІ�@F�9��ٕ����vS�v./�ݞv[U����I3u|�Mz���(&�h���~D<�±�:X2���E}��F��UKP���GO�I�nԿ�s��~5<q#Z��H��YsO�>=�D�dz,ы��8���J�m����{8�A5�<b����fH�k0I�+�y�v�ѓ�=����z����w���������O:EI�a��w�>�ݷ��l�,��Q'��B$Zo.pQ���
�0��e�k|�(��^q�M����.n4O:S_�
�cOZ���R����CPw�c��������La+[3���[��@'ה���"�B���Lk�nH���sݴ��/�
��˺I3s�i�V_�k�u�K�k�C:E�gA�l}��~�_�?tCŜ9��)�f-/��7s��c���m�Y脨rz�
Uom �?���l�6 �Mj6]�/�����e�+�ͅ�E���8K\Z@��F�|]��PKEePQ�|�Bpip/_vendor/contextlib2.py�;ks�8��+P�K>E��ٛW��qf\������U�\\��,�)�K��UW�߷�� ����R��I��/���4�e��B�_�gl�fw����2g�ܦe�w���d͖�n=�ɼ-�t:�L�w�t�ٟ���}Z���U�M-w�(x�Y*f�-�o7m�5R�ݾN+5�$IZI�ް��]Z����.�4+���g��Y0]NX�oz�VM�fͥ~���,2/��L�i#	�Ճh�6��hm�sQ)�jr�6���kڭڪ��Rӛ�d���G���*m�Z�98��	4H�3a��gY��xw9d���
X��r#����ao߰�ْ�Z��	�O`=0����c/�M:?�'K6��)�Œ��I��B6*IN��|�E�TV�J�L�?��˧I�7,1��]-�K\h�� �_2Q��玱5oں��j�V/��nd�����U��S��nwp�;w䤃l��'�R"SVI���]���V��P�?BzN�oCQS:D�|�*������W
�h�Z�ۆ_յ��-M[|���Xn���"��x�k+2����i.2����&�(K�_��l�w�>��V�k�޹��>ż�V���L��
_��i#�N%h�^�Pa��"���`Ɣ�3�GO�:I��E�,���1�;��;k+Y2ZV��dݖ��9sI�#:q�>�gT9��f�����u(i׿�Ӣ������pLP���y�ݰT��<g{�lA��,�� K��a��5��Jy�f�Z���K�@l����fvj�DNh�����-H3@	4+h߰jU��N�|����t�'=�G���0���;_��֊�wڀ��낫��������
�jGZY�
��m��F�R���g������́\�^	��a�dН�Ľ���)�i͛���j�;EO����_�"׷h,�/��$T�=*-h�3P���!�w�%���B
@b��mo���d�"�t	��@�30O��>����v����;4��Hai�k�"UA�v�m]���D
�Xq���k_��V�c>�����=��$#jׇ�%�JW8j�³���Q�Z�r�9�\��R��Z�i����;o�d�-i�����(�'eU-��,�̭Vtt"cX���6*�r6{��?_�H�r�D�V���md3
�+�{��g����Ի�@Л���-���ӻ��X���+x����b�:������e��篼�@�Ȫ�È�a�E�JDr�4��D�-/!�:F
-�`�^E?q������5	��Ogg��૶�d{+ۦ���J�����Q��(38�Bǹ><&߅��C�#���4 ��] !��!����(��uӖ��a�
�j��\rU�4pK�=�qM�� /���~�A�+�M�d��({���Gu1�ں��l}�@ϸ�|��8^R:e���,T4BF%����[��x�4�?�[���|W����t�_���+�˚w��IVsW��7O!��~��z�`�-Қ{V��ٖQh�8t���`[��=p:17�ȍX<!x�$��ۋ٩�I��6��nЄ��~
s���r���֚��5� x�OC���Z��G�i�V�f�^�h�#=���1��^��d(8�n���B�<՛��\G�噽g�Б��cIL��a��O��`�tԒ�~v
�Q#fL��q�[���m-������M�qA_L�.���|��_M�(�pږ�"�S&�5�(�$�alH�Є�����2p�=U���8�
�Т�S��e6�3�ح9�W[���t\�0G�*���$�x���KD͟i�!r�dQv�l$����)\����
(���������2#�"OU��]�UDfmo�������g��ǟ}!nɯ�}�\�����oן>&��^\������>dh�S�����	�Hd;$GY��vbI�OAENI���#���X��$B:#���u����z�b��E�6�m����3��m�y��)��zz�@n"n˴�h�JoIO�CC�mă�kv���ڥ
8�5o���2�� ���L�D��#̮��lH��茥',8��_�wzD_��*�����Kb ���v��)����.O��鏒;�8#>
!KK��Q~�Z�ZWow.K��Dp�|#J����
��]�A����*�G�N��QF�'��_�ۈ��������t#�CbJ{Tv'��"�u��f���TҖ���$���Ʋ�^�7�vi�.5��^�΀�
Y�H�^�j`�p'�`�R	�p�J
���ٝQ�K	��JSCr�G�֝��+Y�2/�w�0\�9*�
l���C�Jt�"^�J���@�M��n;7��2?���Sk��찶Ո/�M���DiשmN=D����%�'
�7�I�
�tx���\�@W�-�I�(z9�
:���$p��H;:6%v����	<�m��5[]�n:Ç�_Y��>RO�1&K�kp`����A�'���|щ>���#U�늨<��'
������_�E���&\��{u��U����@����.qh$b���u��"0�v1pξ
�J	�� �'�f�<4'Kv�?�?�Xm��t\%�g��45��Ai��o�X=i��]z��
�G��.,0Sچ�,�<�<�O�0I��	��J��<k��ad�J�7a��x��b����`����ͼ��|�?��l˜҇XxR�j���|�n���3v���>l��h�k���DMZws	�C]����zv�{Ҋ�{��aR�'L;ɍ劉;c�Ow'���3=�naIV�
%�:��w�F�f`�.,m�6u�=�9�2�NeM*f�.)�5Q#�� �}�����t�U���!lio!0��O�[��)�j`ea)�:5�ŎxB���R��Ce�to��%h+�ݕ1ub�hc�q�Z�@,�a�)��(CCWAzp�C�5d��t�U���ؘ�2w�#�+��ױ�y���|��^�7�F�l���E�Qs�����i���-RkNg�a��$�M^�9��M��λ;�1Ib��R���2@Ի:�^w��Ms��t��N�K��#�@\Z�%�ѰS�Ai���t����+{�}��A�����=MIo�.�M�l��p�� :;ъ%Ԓ�4���ً�ŃNg���h^���e�p�3і�B����-A%��J�H�k��_����3T$��#`�&����{�ᠾ��A$��(��^"���kT���ꪎ���)�"�΍lk���M[D%�*ó�bC���'Y�`�U�!D�SQ}��r&�g��lZt�'z�3�@�:,�Uz���i���y�b�q�%eँ�3f\���Y�n� F[R��<ԃ�5w����h��u(Xo��R�����bp��3�
Ӯ��a�z���T�G�n���D����(�5���g�W��]�P���5dZ���Є
bZF�����Cr���"�u/��=XC���#,�z����X7p"o,E!����a����Be�R:�(�g����L��?���,ɡLw"3��.PiJ!���/ux��e��7R��BUw:%�&*	�_{þӻ����͠�r(�ł��x�p�V7�a����a{�@�1�q
`%'Kp�~b7螗ԝi0i�%<͜E�����Lm)=�v�6��;�����w�����LS}����<�Ӓ�º���T6�t�����"��z�?�u0܂��(y*��r�x.�ji��`�<-���I�3�H/���-Ȋם��{���Ii�t,�֝�z~:l�=�-��Z��- �YARȣf��[H�<X����jL�C*&i�ڮl�#�u�	3��_�R���˶]�y�x�C���{
�Jq��icm�4B?Fcn%E�t"���t���idž����-|�TV���Ƃ��+h��J���yJH�!l[sp��;4jT��l�~$� [[��y/�xhI2ؼqV�uqP7�	�F���>r��@�gi�7Vs����ǶD�� �{�{������L3=jgu�!��FXt�m0�5i��^�E�c�ݝ�ܵGV����s�f�k�-I�-YP\�����CR䌲���F��%A�4o�[i��ײ�8�%F�,H;�4��r��p�u9���B�VK=��m�E�`�qt<n�"�;<E�axa�C(뫒M���?P�	�z��d)Y�ru�)"�ar�z&+
,-hMD�>VYd��+M ÚCrF��Z=�Y&Mo
5���ߏq<��[�U(M22�#c���2�iྣ[LB;}v�3����n�sA#�`�����=>̀���br�b�X���Y�~��@��=Ͻ��M�����I(pW‹�CH�x�E��
N��v�v�؃�����(9%�lLU�G�\�m
��,G�$�T��Y�O�ðh"�{y��z���u��N�;����3������uSU�Xz.��u�յ�!���H�������fi},�%�>zZy�2��w*��$��i-S������0�z~��^.�����&� /'{5�eT��#3m��!��1~�!������ҳ*�����\R���8�HM��.��	#�#�C��D���y���ir�ɒ<�ĭqV����#�V{��}�|�>!!0�w��5�<`ӎ �4�xd�����ɱ�ԅ~cۼ,�H��d�-t3�'���/$�4��9�%?p]�q�@��Y�LO��8�oT�Q��T�ϰ��#�����^��_��wTi݈�����������]R���a�ou"9YS�a;_VY�BNФ�F�R��+Z��L���~�5����Pm3u�=
pv6�X�[:
zCV7��0���R�[�&������PKEePQt��'l�pip/_vendor/distro.py�=�w�6�����9wOR*3�~��n׍�֯��g���K�2-�2c���mm����� (ɉ���;���$��`f0���Y1[���O?�j�����8LK�x)���t,s%1�Y��R��Y<��]�*-r�4z,�X`S�� ,�������+	 R%.�L
y;��J���Y��X�����f4�@�M�(ΫJ�P~On9W��eUͶ=����bB4*�ɣ��G�����o�T��<�J�R�c�����g��8>��F��'��oU��ޔi�擡P�Eu��$����|^5e0����Tq.6wO�ɦ�q���d0�zp���o�⯻�ǻ���'��X<;:�;8=8:�������į�{C!�LЌ����? �"	e��:����E�������O��D�Iq-��#f���
���d�4��޴:mllnnn�›�3�]qv&��W��S�S���4�ߊ=C�<���N�6��L�=��J7�U��H+Q��"�Ǘ"��� @���)0=��V)ㄘȘ���p���i�rP!���R�0N%�7��gY<��T�/�e�����$��lc{�ؾ����3(Y!�(C�G.�g��_Co���b�� E�L���"�@����ג�K�0���8�J��1p?.�G���e�H$��8F��1g������[rY}��N����]�*j(``�@DZ�g���!�*��}}M8P�q�
@_#���q�6N*(4D֔0��i�/�8��L��2E	#~8@�N<a�ټ4�a��r����K��˧O�w�=���DE3�N���`���F(
Ȳ��p�6e%
e����¾|���2���!+& W���Y\������1����?@=��wp,v��H��i	��=�ko(z�d5�
6FG'���'�#�<���/��r�P0^2	T�ml<��e���e��Q��co��/H��m��՚
�q����P۫!�@��������LLA�
�`�X�U.���q��r�c��	�"�qfM�7��PN�L��r��JyEI��1pT�mS���PwJ^�h��������Cb���m| b�ۆ���8�@s�@�߬�6��e����M*����9MUKg�|dh����S�i���ə�D��A��'?6hQ��2U��+V|طE��n J�0U,c���k�z��~ٚ7Ey�XOc��Rf\�������F��.�Q��~B_�5є1ɋD���iG��$�΢0��EYL�s9�G
�2]���1��Z�&�P�z�wꅏ!�{'��G
e���7#��%q��N�"G�vS�K�f�L@���R��x
Ͽ��B/wOO���RF(�O����ۯ�>x��=��~����s1����u}�z+�'�H�I�)�C�}1����"iX�@k3-����W[�7}
뿴-7�W���F�d�]�N@��W7��P%��Bv�~���j�P/��ಌ4�!�=i�R���S�Uhօ�L�Z�{`��+�%����66��,k�!5vN˹l4�T��cR�"lx��e�"�TdlWs@�`���ӄZ�z�H|5��X
]RX���`��
�����gg0T.��0��<�SQ������#��$Gh2ޤ�^Yj<��ѝ |N��3圪��+�ڂ�2�MQ�_���~�c�c�q(�P9[�:!D��:"j>C��B������)�q	J�1����/e�zy���v3I�G��ۯ��!N�r�c�2�����^Q; ������B�d26�2Bh����]��5ֈ�e���ʪt��LҊ YϬ_�)��à��6�DEM�]h]rp}����q%��^�+�Tp$H<�X*oFpV.�W��^����|>=�@�f�l�ťO0ഫ��b��[[�Ք&���ivFGq��q�
I�0I��1
4��:�w�hm�֍��5<�
-���(|B�J)B��9z��J'|I
��
�y�T�¦u�2u�C+U6t2�A�Z\H_"�-�=�.�i���%?��g��ύ�����<������O���=�'��������o�s�1p�P��3x<:�O2�~�����y�i�䷓}m�;�8�f1�}�+�#V��4�gQwe�]$�p�ۅ�F�b��@�B��1]���b�c�]��- ~��i�(��OG34����P����%>���.��I�`��2Ox�l�S�W.̨��g�<yNk���G�)O��7_�GO���Lf�?/ͣ��6x�2�yZ�j�Ա~�#��k�s}���@��8�b�@��Gsp#�W�fN�#�E���_�ȓ�s����Ǔ=����$ee?]�R:�~�G�m�&9�����|��M�f��e|-Q�8�DjU^p��j��=P�IBa(G��l�b��]�F��}EkS$�
UkIl�ȥѿ�f��a�C0�T��	�M\
�?��8�����~���|&.SY�^�̀��Çz�JKU�|�A�yM���Z��M�z:�L4��G��0�@�"��ӌ���E�%��jag9��kz#@��)�E��[?��]}���K���(�йS�*�Dïẗ�H�"��S����+tg�Rҟc=��P�������	�`[��KuG"u1s�s�Z]�,!��-h4;��M�������bk,����6���dH�y"�3=��l7�Q�G�l�f�rV��!i�M��ٰ4\���(���7�R���h�(�߆�'��i�o��b��F���q�Aێ=P<��O��#�z��-�\\������|�K"�R^��\��Tˤ�fG~(փ��0G;[��X�-U�b�'t��
pwu��l~��9t��켹�7:�ܦ�S�Aja|���Q��]a�b_F�Hl���S�� �LU�u+�<��M<��2^'h�M�$z���/E���i��ҭ�>u��^�[km�}4w��[͌᥵U{ć(w_��[��&�"Av+���(K���x���o�� �T�2�� ���Z��mp���dGJ�;��(M�������~�B#�`)
`�Y�]���d�Ƣ��0p��U��j����l�@@�Y]C���&z�9C������x_J�R����j�Ϻ�rT��g�`�͋8���I1�^�JG�l�8V�X^�.ק���6�V7�2���G��0���F�Yn�m��s��=��*�zD����@J,h �i��L+�D
48x ����d��=����|����p�i�	�cѤ�ŗ�����b��L
�����)D�����IA�EӔDK�=�Ւ���̥��$�/�@Yfhr��Ȓ)� '@���5��kM��"�L�	%
���^s�ij�������zN�c.�����IJ�pH�i��,���-5�e��-.�MK��**�̊�f**�%8i.����Y�1��	w��X�5�3Ys��	˛�F趪��Me�u�i��(��/�s>O�dĴ\gݍj�\��R��Z���:�
Uw�]	�Q��Oj1��P(�
^����z���c
�4Z��T�n6,<�A��|�Q��:y�ѫD�.'*77�R�W�oI�jKI$%�L����'�C�ږ��������h\��w��#Z�6�p��Z|�
�ݧdC�m��8ʄ��α���"u�r%;�_�z�x,��`L�I��g��ЖY�g���gN�\6w����eB!C^��4W��'�o���L�NCu�����Z�w�c���i4)V۱�
�����I�k=5f=��,�	�n�j�a�`o��׆��.88�����%���
�����bF�f7�#N JA�G5�貚f���ib��d��%���3��#�z�f���d�Ufxi�A��d�������J�1ik76�i�h�ܘ��D��$@Z�v��.;m�~����?mF,>vY�A;O0]a>��c�1����q&�}o�N���@w��1�і|�Z�6��Ơ�D_h
G�$�ؤ�d���3�և��x��:.�Fhp�p��lT`��1�4�%�@j���zC3��*��K�Q.hvS��Mnǵ���P��Q�g����
&�(t��Ҥ�?m~1���q�W�z�L,!���{��+Z	��M_���E��A���8��G��KP@�����fi��k>�r�J��eV4�H���E��@�hɎ�6ϱ�
�k�z]�@��fl}��3:�:.q��A(�6��m�,�{�kl��^|��؆�a�d�r�R��ja�̭Č
�G"h��h"�(��1Y�z�cM:��(���#*�eX:���1��A��X��b�3�����#w�00L7yyPx����j-��,�U�$���OH�@��=��4�ͫ�HǪq%��d�������#aҽ�]�<�tsT%��(���nW�:-̾53;�\�N�Hڎ�:j�������m1<;}6�۸�����5����i��6���?yXjY�I���e��B�>���P����n���]G��U��y ,	�ƻWam�)�<SY��<�?�߇��n�_9/�Y5�bp��x�J2���L�բ_����f׮���SL��@�U��8��C���,S��q�juC�d�A'�l4B�g4:Ì�9��W��t��[؊N.`��@��a������P\���D�
�����D�F~�����P
�w�����ʸt�ք-�\E��}��>U&�񸕱�E,&}��L�#��F�4��ro�~D6��,�?��G�nj�G��T��kw�Ʀ(��ǀ��ޒ�3�5Ɋ�8�ݶ�ʌ�=
�ct��oi�����Ey+qe-u��j��"KZ�`�q�AQ�
Q���#T����4A���P
������ꍻ�4�1�(@$2T֧�l�ӽ��Pg�����`���3�ӥ�T��_�ܶN9�*��h��w7IW���'��.m���Y�"�
��6�]�+g��
��TGd��F����B��&0ͯ�+��F��S�D:�HKec6{6O�����@NJF�vz��o?u4
����H�)}��[V���ĸ��f������Ϳ��]zl�v���n� g�;�����v_s*PЙ�m�l���k�lx�W����:�R�K�TX@���ķ��Q�f0�
�E��l���$_�Xb�]N+�5�5M%��fV�8�^���(��P�̀�C�.6�j���sm�DM�xb�0�P��5w�K���j4;�A�})iv�u�>/Ⓐ0޼��y�T,�`_�t�!���L[��,�УI�%>�e�(�;�$�C|4�Ė)|؇��	f�^NhN�̛���
�ca[x{c^]��뢘�QK��k:���kC�/�@T�S6��*�u+C�&���q��6,b]Th��^7G��������L��)t4s�6�=Bv5�X��b��%�����ٳ��\Ca�Kڅ4�q&�c��q:kf�eE��ܓU�lV�lc~5.�k�7�41k����1�6�z<JFގ����˲(϶yG��#�����Ja�T�PGQ���T��n�O^�i��Ä���UPF��/4ME�TK���ՠ��-Oq��`���G�1��*oa^��z|	���'t*���윢2��e
�&7��.�C�o���}�"�J�H�{b�0xՠ�`@U@����p����g�)c^`ل�:��<���u���O�D�OMG���)f��患"HX�hRm����׻����c(ZUCٻ.��A���;��˫�{��M�p���Эk��;*�˼�����z`��@|�R�%����2�4���K��wH�j����À+�]�eo�k~��L��w�Ա=�x�c���Yp�E�0��2\�D�V[a}��]���N�Cc LP!3%��H��a�II}s��{���S�8���Ԫe���S��BT�=���������4���\��4��� �GY�{O������vڲ��m�z�0�n"��kl�v�?hwY��eĞ�KQ��>�v6���{��=gt�j�'h^W��EC��c�X
_�;����A���B�jC#,ȔR:�ͪr]�����M���.7��MV.�W�\��:;��"�U��v�����!�Ϭ2�4'-�4#���v�P���j��+�#���l��C{0����10��j�36��P��޿jϨ-ɪ7/�B3p[�̩���AIY�ˆv��>R9l�>R�i��{k{�[�qwdX��bo|��=W��6���l�.����s|�G��
ΰ
kb+�A6@h�SP�е0�E��+^�`��ꔎ��� ���������P-�-����ؔ��9�|l,t�N`!�Y���
>^#����@�F���m��������<	+��k�����'�/wk���2�jO>�b������|����䏁MZ�I{ Z�F�jV��fe{��v�c_��SU�x���w�	�z�y�.s�
A��������x�z���u�����Û]�;�������r�2�5�"�}���kE����T�=mkAp������ث�#U:lL���w�����@�����	!�;�J�{b���o��66p�GO�ﵧ�N�������]�w������Ao�����7&u%��P_���&@!�w��U���(/���o8[�^��װ_�#�֬P�U��M�_x�o�5��7[����F�>^�\��%��	��<�F輰=
���z�dm�;�~�Z�:�Tm��4�W�t�O{@>�kZkϮwm�S�,8v���˦/�&;M=�w��ޢ,Ϫb���h"a���Tڙa��u�����v�j�c*�
T\�$h~5³��u)'����[�D>`�Tm�Qz�]62����:���Ղ3��{�>���������:���Դ��,�[sS��/��u(�V���Yh��"��aZ�l"ե���&Q��=1����͐��,D�=TE�l�)�b�R5ea��� �W��-d�}�u�"L�d����ZJ8'�q���JSƸ'w�W��:��oc���?�����eՑ�o)�K��sy��P�s�I
lj��K/l�U���~(!ȋ�R�*.�oP�/��'x�b�@}.�ӧ�.$�N��C�@�Z���X��$�
߷�z�U��<��,�Kp�.�H���8c1�C��1O|Ι|Ʒ�?�����-'��F�J�a���>�L�x�X+�ȼ��-F���Ϝ�魷�Iţ�Kh���Y���?,Vw�ߗ���3}۲�T����L0�Q���D�^ch��L
X�J�Z�H:�o2eF�,G����&����x��wc���N�g\�z�e��d�?�T[�~�տo=�;e�Ki}�4��`��SpcN�:tOڬP�����Z}層��ulny��
�0�I}��=��"��t�"���h�(�̽�*�6@���V;��(r�*�*�P6�H���op����|���d�5$�(O�y�@��7QB�黼p2G��J�2D�M�"L�;��N%���n�ѲY��ՐF���Y�E�L�6�ssϥ��@
�vHαt���G�}������r��T�K!�8�an4K�өNwMn���w��N�)H_��f�Z.oh{pP�f3,)�q4�;Ф������ʧO���\C��$��m�۝�nH��61��'-�ݨ��'%b:�w�{k���ӳ�j�XWCq
���i�>T�'�R��Lۛ֊d{���r@W����T6�ѥ�8|�pG�]���K^�}�;��u�2�e	�`2oI�Է��U������)��>�R��
�){В�>F�
ݑ�n΅�7��*s6k]�GǙ�jV9f�~�"�|ΐ�|7�d=��}�ȉkI/�kPU%q���!���_r3LG�&պ(���3;1圆R1ڢސg:��خ�Z2����Z-og����/^�5�V�Z��Eo�ѻ��50
���q���Ғk`�5T�U������ީx����'Г��Є�U��^��-b�]L�c*�ʋ�K�t
7�{���cPO�{
�C�]Z{2��9� �oz���M �%4b��W�=��@�DEU	���gph|5bj��Kɲ��(4��կ�^�B�z�	�D���]>��ycșs3�S ��߀g9��-���\12^��w��������c	�����>�U@7B�S������+uTS����5ټ�U����E�m��f#��z��[O��>L�̜���i���>�jZZԷ�7w��]��#
�K���h	�Zʴ{�u�DڥT�B�|:M�4|Ҭ�k���S��g������՛/`��_�N^G�7Й���i���F��	�C'S��ԩ`�����
%�0��,��x%�\fN�^u6 h�s�kש{uF`^'�zUӄ/���g�W��×-��#�	�m����{8��t3�BŬU�J������[6T��E����#"6��C!����>%���|s�v�����ַ=�R�^�j��=v{̇�c
e|�#����5�p,á2�Ӳ�z�5�g��y�xic<�9��l�R�����W��|��k{l��J��]��Pܐ?���{�f^:eC_Hlo;0�0��\9]Z�즞�/�!Uz���ѽ��l���Z��)@홨���я�;k�ɬD�W�� <�WҚ.뾐,��
��›݋���c���"�薉>mb-������A���?��WLx�3^�o7�ö�ty.(և7�bs��&��4f6���G/wOO��u���k;�e#.�[In(��qV��1�W0*�U-�h�ӂ�����.@�<�,P��fk-чA�ːN��b�7I���!G��x�^Y�x��)�*>O3�p��Db��Arw�P�^gY�%x`���F�gA���CqT�c<�m/$�����1���@�AM�=���}��ul��$v�7R>�x!��x^�xz$��9e�&<bČ5^}�(EGc�\ȇ�U5�A��\�t*Sr��dV�jX��-	�R4���G>������t>ճ[�Ζ���N�'�[6��v�_U�څ������u�xeq��d���^�]|Od�>t������
�[�
���R�m\�����ś#|eq�ݡh<��+��l�QG���aX�n�rK���χG��v���^&K�fǴD���LQ�,;Ʀ:��fx�ð���0��c{�����B�cs����N�NXK�1hwֽ�$�w�C�Uht-�o���|6�,N8#�d}Z�a���h���鈅��P�y��g�Z�XI�t�k�f!���?���
j� Ϟ�7Dc��	O�@�Q���@{��K9����qul���Eh� t7�����6��B�m6h��?u�
�hv���'S�^X�-�Kw�ݘ턤��ǻ��G��wb>���z�={Dg��GO�~�LؗF�:h��Y!��&��.c����m��ɥy��x��o�@G��Ӆ�뭯��s���)<�݊�{��@ĉ�^moo=q�i�����>�B6��3�Z�V��\���l������f���<Q琂vO�j�ɪ6�~]��|Iנ��?��N=z`A��Aq���`��d�dBY{�J�DV��]�\0p
F
>�k��M�����Q$N�oX�B'訩y�QQ�l�È������ѮN�Q_��c'v6MqA�4`�m8�����2���z�@��7o��K���>C��ʫ�T��u�x��a࣪�K�4��Q��ߙ��+#ħ濦EE�K�̧3�竦�y��iH�^��)��f3����bf��7��G�i3�7�9'-,;�����n)���@bE��
s�k�S�<�cY~)T?�ԏFz]����PKEePQ^-a�;8pip/_vendor/ipaddress.py�}{w����zH�ER2-3���Ǟ�9{��Iv���4ɦ�1��a7��f�gߪ��ͦO�0�zl(
�B�P�a��ʖ7��`�n��>���1;K'��=�~L&q��SVd�o�:��+A��X%�u����*�qZtvvvwwO�,ʋ6�#ѫ�H��tyt�"J��zI�B��*Zݰ$e?�Y
>\$��!gk�dGE|��>��HL�Y�NQ���U��q��_�qq��>眯���*[��h�.֫x4b�b��
�S2ɦ�h��*��;;;����2�J|�������.�U]*'���t;���H�U�XB��	P�a�u:���;�	�0J�bT�,��5���N���0���a�,=o��דxY���"~�Ze+^k�O8�ڢk%5��'}��l|S���7�O�����=1d��1H�Lr�?�g�2�et	�m��Z�y��b�ۉ�y<�5��|h:�tM>7Ǎo��h�q9����Qɠ槰�Q5t 
����̥O���Mn}R�-����t�D)h������	��'�
�{�MW���r):��51�`�'i^D�$n�/۾b��J��&���v�bO�	W��+L��bPrTQ��4Nϋ��>S�F	c�be�-��G���=��^�.9��<a}��1;�۲ZEI�)݉q@��P%>���͠Hz��g
��"*Ψݖ+AGj�ho����۽A}�{��0�����P��Xx�G�_߲����ɹ��{�g��V�xJ��B�:cQ�L�
�q�4���ae���7�f�?��Г�,m��8��g��"^�d(Y|��E�)Z��7 ���Yb��$P�8{��dt&�:-�-{�p�Q�4�АZ�VN7�&L�UAS�Q�˓�=��;�R���:T�]]$��'�eP[7|���)K�:�''Dڟ́,}Ȋh�nK���9�N�f6�G<�vx4��Y��b�c���x����ª����"f��bԫU��
�A1rr��ST��Pą|4����Yt�%S�����o�	�8�D�6�X�i�)@fk�248Y��/�v�yQ��x}�w��+�V�I���^�{�oi� ��y<��y�Z5f��Q?�K�ǿ�a�P���/cZ^
�$�!�`p���� �)G�L�p�ҿyy��d�e��!�{T��Id
��Bf�V5=/���f~��n� M"۲� #wK>�h��ף_�����a�=P��eRY�S��k4_sW���*:B;�����n(h��VJl%:�sd���"�?߅l�I�(�d9m5�5��g�$��
��`�`Q$�(��qK��>�ƌ�7���y�:7f�hc�NI�q���&И�<c��ִ��V���-��݀�e�z��'���d�X�?>쳫d>7茑�4O�vs)�Ŧn|��������e�+�)����@��?I.�.+���!*+v����c�Q/	�1@�H�߁����#���v���a��Y4=�m��f�A�U�6x��Ё�~����Eoq�5��V�@����8Z	�R�q��uX�&��7ٚ�C�+��&niUT��[Y�#X9f	�#v�Bc��`��ڎ�э�9���g*PK�в�i:)N>���ow-�������-�A���疆Ac{��a�V���n}�E��9,���M��mX+؆<l���-Q���%��-l	ε�,���
�oʵ8��c`|�Ŭo�d��$��?j��EqM�|�J��(_���E2Y�#-k1�a^�wz�X�l��$��v8�M�8Iy��`n>uF��#j#ࣦͫ];�4�a-�C�w�i�&i݉}y���cv�ԟ�?�K�"�	-k3Xy��!LX5�.5��>��ER6L�TNC��hL��1�K����#�,������g|
ʆ`W����%��"�L��X��m����j/<���6�b�*g�q���%��<�r5�ӯ]9��]�q�:�UJ3����_Rkw��>�������@
�(���eK�\4���?�2�1�a �J��p�J�xO�t�2;1Uc"�lY�c���^��f?n�]
�M���0`x�1��{��5(cl�;)�Y�NeE�ɕ����J���ǿ�c<G�˳6]C'&�I�Z��e05@l�����c +�/����+�-rL�(I�%�Q�%��{_�z��jL�`�Q\�:u0�L?p�'��	�u�L��*�,�y�}���ox5��ֳ�v���ȷ����l6Y�xad~�WW�k0P�����?�U�'.y3]/��B�?���\��w�÷V�Om@z����C4@ªt�oHk.�u�X/���
LK@&��T}ޤ��k��<���c#y���/��E�6�v����o��,�g�VK��|�XD�䟱3��!Ӄ�^�� �-?|<C�nRn�����u�^�|I��YƌOk�1��m�ڊD��a�� ��!i��Salo�M`u(����w?���dz��z��>�~���׊�Gs�y>�?�Y��^���g����a���h}
�7�h�DE�T��qǚ������K�V�i��CB��(��m�k�R�d�Sr�{Q#C	iR<A�E��A��V�����"f"H�0��]�9�@�қV|7��r%Z��L���hw1�mH�N}����ԣ?Ey,��=�7"F�y�oy΍�fÑ�b���ؒ}�X�C�Gp���5I�����G9��H��T3c�б�CH�Ǵu6?���t(w���S}�Ƙ�5Z;��:�-KX>��ϝ�y���5�k��&���s�]QXHPU<.i1���,�#��g�5�+��m�.$}��A:�=�I�^����,��E��KPTڒW�n������7�ϧEK��$�L3��$F�Ń�:PɶŜ�	�a�U��nS/=R��N�q����9�B}���|-s�P�9��!���eK������y��Q�B���z��m!td<�&��U�P�����:7h'��~Y��[�(��N٣Ҳ���*\)����>�q�}mxi@�~�Vb�PFk~���S�aT2��qߑ�?�e�חId4������ikrjnM$���9
i�eKt��uZ�C�)Lf�̊�V�"���J��ސ-]İ���lD�@�~�����c�>4����C�:3T~�Yf˦֎|
�K^���%(u�s"�����v*�,KYil�MQ�����7�[��$��m
{��$�aǓ5U��4���Y%�80�N����>E�d����L��grYn��s�\�W�8l��&7b���P[L5x�|�ݔ���&o�^
���^|i�"�/��U��l;�hm�	�k
���5��M��e	^:�UM'�.�/9!�?�w�I�ֳ�_	Զ\�=`�_�RV���TȆTmFJ�"��b��H�S�f�5{��4~؁H�
H	-'̬7 螋�=6��-���-Rfp
-��O��2�!���O2���y���h�YA#{��~�꒷������8z&�;.?�+��mɐ�n	�I+�,
�>�-�J���b뽷��A�tL��d�o6�ql�)�<��HJ,��+��ȑ#�S��ɇw��y��U�p�*�-U#��-�
���.�C��4EU`
J,�.��i��F��b�ȑsK-N'�.�3�9�'sԹH�V#���PF���%�K���
換'O<����xRD�9?�@����*��yW7�(�P�i��A�D]��A}s�N�f���4��b��r�.xl�J���X$z˝ȶ�����w
����.�E��CW�%��u�W��$�n4��@ϒ��4�Y�<����Ut���G=Xq�=L�у/��$J�}����	
���;_��舉ρ��a���5������j
�p�-W	��Ц�2V3 #�3ц��tF��R�H�;:Ar��蒓sGS'7�;g?	�H��b����9�B\���<{ݼ�(�xU�p��q���gS2P��	=�(*���t��HV�>3�d��!0��3�Ek#��x�&Y�x�r1$C�y����4O1��2�V8��-3�n�������{���Z4�l�,�wl��j�v����^��n����8Y�*��I���;�j5j6��v{��x8��P��wƝ)�F��C���)˰2�cP:XB�AZ丗o<���|�fJs�e<IfI<�,�&.M�v۸-Rz�
��%&��3eXH���g9�ƨ��{�s��hʚ�[K��8�6�I<R�߮E��)C'u"'IWH��
q�R
�
V���Ǐ�ϯ�WoS���_w�x�Hx��h@a}�ߡٖ�7�vB�=X��'�פ��b*Yk��@]A��D��Y�D&��ںո��j<M)���m���:4��ͳb�-m�J�	^�Vj�Xx�����^ ����
�)�j�=�c��{L#���h"^܂(I
U�:��.�;k�_�:�{\%/^�ˋˎˋ�=�Nۢ"��#�N��8u_T2{	44��Jt�%���� {'΃�`J�r]���s�Ix ��3���09�Pz$��T�pIl57���2�z���@9�ﲩ#�`�k����a(TY�I��M:�����i+-�`�dU��MV)���*>�`,7�4t���h��ɏ�!D"0�����2nj�o̠g�GޭT}�Z1#W1b�ߗ�<���?��������\7"Fueq�������zԾ�f�!�.���:lVZ��`w4�}-[�
)
K����I��ZA�1Y�ލ�'5�fG"h/�]͘ϳ+�و9ž�����|
���a��E�>M�6�����)�0
�ſajND䍶�=ꌾ{���ϧ?��;����^�_�W^4ˆ?45K�ծgXƛ���,e�D�,���4���\�Y���{���,����80�ԯ�{FVLL��X��aaVsʣ���.�i�4�)ZQ�+еy��K���R�K�����%��_�]��X��ћ����Yilt1�w��8Z����<f"=����1��#n3P<�(�V�u���v��>�����u��1L�RAYP�c,U���f���B�}_��rF�*�S܎�-���ޓ�4A�4�b��~b��_�O����:���z"����u �3�YӋ��[:�i�F�vDӈ^���8��[�T��M�1�%�&R�s+�1Iy�	��%�qu�\(�"���
�r���Y,�B��Y-�di���})���T���Z����5��=�g:*��J"Ѻ;(/b4��X�ͼ����f��'�^^i�A ��S@���roK�W�wbG�Rކ#~CiLPЪ�]���7�\<�v��Wat�]��R%��� ǰ��3���|Qq��}0@K�s�pTP80j��.{Jr��/o�wd�6��r�C�'?{"1gt�kcs?�&^�+5b���G�)�M��'h�=So��('���G�Zפ��d/����.�ؼ���v}��{�&Դf7�iY�̸��<뭷�wbU40Pֲ�h��T�>N��E�/�m�������"�nx�����!!8Y��Vm�S���r	�d�d-l@�@�*t+}�����AHO�S�%5����2|?�^C4U�������ZpMi$�l�	�5MǠ�G>�r>Ҡ7�mW����+�G���^���-�dJ�P�p���T��']�A��nY���k���@K�=�1͢-�᪼��n@�\�c��7#�=<�Ví��9��Z�0�96?_��\�;7�[1�P�L{I�a��)J`��_T�D5^�*���AKw�ջQW$'%B-�b�?�b�rp�K����n�/K�2��ϲe�oV:{,�_E79��衒 �x��Pp��ݠs�if*�n}Gs:H
p
Sޔ�a�ƶ37[4��!���mT�Swp[�T������&���$F��E��)�o���+87e�L�Q=@�܅������lLx��*�Z�1�\yu�iv�`biAw�^��e����4){�.W�U. �v���
n��1�:^�v��L`��Zr���M<���I���`�^�Чcw�č�$�pk2�]�V��-)�ʆ�Fp�����5���]-��V����)⊋���]�U�B�_�?��Q���9�?J�G�O��"1�	��y)^A��?�Ѐ{l���_^`O��Et�dkXh&�,�-�M%t�Ysa6.$�4�L���M؜T�P)t7�$�0KP#�-�ԗ�����ɑ?j����K���"��M�/�sAT+F׾�����n��xVP��p��Ȱx��x� M���jp��(����~ٕC�^���wQW�'X��AcJH�[��U�r3R�}Q�$gV�y����*�$.߇�϶(�[�?��᛫�N�&��n�;Z��@�����u�;���%�QE��`V[DI�΅[W�Fa�^%7�p�Wt��_�������,G�S���ᆸͪN��Ucu�-�y�؅C�"t�a�[����v|�^�;�b�x�/�d�h��{�l�.%�!�T������[D��(�pw4�q40����(�*n��N��T<չ��fYS4"�V��Wp7�U-��=PC�y�ޗ>�@60p$8<E�S�v~��W������h��pt�A��p����5�/o�W�H��ww��=��W1;U�k���r�>���t�ѷ���m�N�%G�'	S�z�	�1�܁;�O#�
q��}����ʁ��O�K#��)�<N��G��2�*�3��ѓ[�A�z'�z�T^,�	���Y�ƾ�%)=�C��<��R��L��1p�*�l��.nm`����I�*qNQ�O�x<h�G���tD�w;L^׽�R��!J�iE�.����8��h���v,�b�(~*rF��¿7�=��5~��̙��)��]�������;��~OE�^�f
L��a�e�x��ġf>~`���"��y��*]R��jYu��Kr�o�%d�z��=:	�O7V���Qz�]��0@��A���Y��Cγ�>K�S�Q�|@�Ǻ�!�i��k��4G��Gkmy�ӷ��m��8�gW�H
��<n�C�6�{���ۥ��^::�ۢCT�e�꺶���KY���"�y�ID����7	�I0#	�T��Qr�>G�� _(��r)�]``W�LHL�P�\4ɋ��(Do\a�2�j�942�z�З9p����Օ�Ý`���8v|���c��H�n�pI��U�a�DP?�IUi:aA��þzw����� ��[m�FFt�N���Ȧ�z�lʫnd���{��B�y�WQ���(�xm!I�Ap���1!ɨ�s1�=7s���!5���)\��r��y�n|�\Q�@w���D�T l7��;����U��wT�5G�v���2)�e�a�t
��0�|���k=d����\�$1J
.X�
v���O]n@�������D尸z�kq�]E���h�F��U2�3�*C%��e*o'�.���,�ʌ�z.U�a����H�N�5�q��zȝ��'fO�Ç a>=�
�E�*Ւ�xɺc�~I�U�'N�%#�E_nV�QO�!��{SL�
���t�#�yA��NE�t����èV�3��#pu�?���&r��9V�������MaԻ�2�ؔ$۶D�<>��c�wph��d����$������f�C����\���x�]a�j:��
����.����iE��Ƅȅ�Tp�)[�
��S���v�9X ��t�Y'��x²9�G����+s>�By晴�k%����J�Rik���e�K�k����������W����7}�ꕪ\�ש�˧�*ٺ�T`��%2 �
�!�^�f޵��iߤ�9,O{���Lޜ}���Ց�bl�J����B��TFZ�<^]�|W���F�!�ìm3|J8@;2z����>���o^���C��<#&�I�]�#ߎ)�`�p�_��I����xhO�H�vEm6�ʒ�c����%%�Yk���[����-���g���q=���=�GU�R�m�g�I)�Sd�R��P�g7ȟ�D�UB3�p�wI.	N���r?AĦ�7u(]�]h)�ٞ�ޕ#�#mɓy�_a��ͩo��0AI����F���(t1	:������H�Hʄ��|K��Hng�d�*�Γ��va���	���V�#�����n)3ݱ-��+V�m�J.�"���=�-��D}�j�=	�^�4�O��G��5�W�y�#��_ޯ����vR��D~>��ԴR���<�ܣ�q-��BW�eZb[�
\���6*�JD<���LTd`NdqY���i�Kݳ��J�����2˖�h�eޗ�3b����4ϧYW��������l�������Ƀ$~/΄l���,|9I�tE%��Q�� ���!"*!�z��@#��8�<�:HfG��{����\������ǹ}���X�!�.�H�����_�~|���?h�I�߯[e�D$�����GOώ�ˤ�=��@�T|���{
��@����?�y��su�&�PM�(h��~�>���G�G�8:�?��G��=��z}���I0�`�LPO
[�=����xgxL�xo�@���]�U����(�Y��A@}c��s������"�$Q���P��D˳8"��hun[�A�XS����z�5+[���v̕�Pc���G��
#���k�%(��1��^;(�D�x����ݷ�-㤲�1�%'P}�)���L/�f$6C��08�1U*Y��J���p�|�h�4�4�]��f�E����[�d�j��;߷:��
;"9�f���:"_j����Ƴ���5\���z"z��̞X��xp��Zӌ��T|��-���̹(ŏ���׭� �j�L=��~�3����Y��@�	;�T�j˜1��&��YX��PࡓW��%D�8�Dʤ%����,Doa��f�Tޏ���q��Ų�1���(�A/�5��+ނ�%[d;���k�#�v�&�
cDrfz�i�H�4W�܏�-�%�
K���{[4��@�=�G]��f��iB5��� ͚3>
�Lx��\AC��/`SO݉P��������)c�N�)�[�F��/���>�j����.������Z`�,D�
[o7�I�C�fz=���."�O��~���ћ-����?��U�g���")b9�sh�I����U���&��`�w'��Uw�c��f���٩X.��lk����>�4|n��DX��
R���0�tU8I��x�*�o|4)�{��r8-�$�ˡ1*�'9ˀw�,��qK���>��18&�qRk��0$i�tM��4|�>�C�i\����c��
���Ĥ��&�8nmx��4ÙCT��f�:��A�n�Z��a_V�?�Mƹ,��́ѽ{ɞ�����ȸ�m��Ja7���n���|��Yxˡs�����#@�`�Çj����_�,{{��Ɏ<����P�GƝ��j̀��I��p���]��1�+���j�����\[̘���u�O�4Ǎo���"Ь���~���X<!���pWM��EK563���*��a�%�
OQ���2íE1�}�ʠ�&�[x��q����M��Ւ��0P�+�4��S��0�8�<H��&G_�'i^�F���� ~�X��
rm�_�n��T����ާ`M�;A\p��/�O���G���wx���~~Oa�57e�s=Y%c�����U�{��v��Nsή�Bx!"C>� �Ra�œÆ���^�ڊ�U"uX%�ȕ�ggeT��܋�h����PD�ha]Di�\���H�o�F0.{q��w��FWq��45L�T�0Eߤ�k:ʦ��X��0��O��A�5>��67�<H'���@�S1��kO_������~����-7����G.(��"m�]�f+x3���ց����Xl ��[����,�$���`|�7Pjw&K;By�fS�P`Ry/,z�'�0��W�ʙ�$ۨG����(៯��<;o�zG6��K�tQ���(æ�V(�v�i+_��1\�gT�}DZ1	�bq�˾mP�;�L._����4�#�����R�	�:�8h���ǡv��ʇ%6�Z0�*��e��M4�%�Ǝ�4Z����P"���)�ȠO�_8�'����q�w���#;����p�3#C�K�Qݖw���J����)E��b�*HPr�;���!�`�3W�<�o��Dd�ށw �7�]�ȅsj{�z��iK^�RC�sI*O��6`�d��;C2Fs
��\6_]����;<<��R7$���U�&jZZ
��n+�FĴ��әD�4�q�c��jF���$�.��:���n��1��&�Fю�W!pi�ޖ�5�QC]�\��{�X�*"�.a�ݦ�;�{(I����D]ak�:O:��Jx��ѹĨ}W�UPΩ�e)�
	�4�?Fْ�UB��P��J6��0J$/���6��'7cJo��L��FU�r��i*1�d�/S{⌔Wќ��hU�V��)m��C�VU���V4EU�qYdO�&�a���&��q����b�L�3�u��"�CT4��d���"����XEt�(6�z����lC�s"R�sB�qFثg��U��X�<?R�t�����2@�*5�_�5��?�f��Y��g�q�e�0cp�]����d#���e���
x�*��w�&ڏOH;g߰'r��2����3�[���,a͌0n�0ԇ|��˒>4�����C�ߍ#j��r�2m�U�D��T��4�q��90��ٱu����(u5��!�(�r��|{�H̲;xW8n�s��;e��B|�^}	}�[�p�e��t$O��C�����{�I,�:�E�5>�l`/�l{>��#d��6,�3�=�s"s�J	]%"ܣj���ܰ��J�܃ְ�G3����<���2�:x�D�g6VV���"�G���;��c��_�[%Aт��a�nEp/�0�7m6�z��p��2]��n���|�@�I�b؍�[��&����q�	�O�:���[R�"���}
y��Byb��a2�C�;��E�~6���ᯄ쒇B�,�w�ٌ�Yx�;��z%�-�X)D�!f5�<�]�>
��楽P�<f宎|%7U�sa*�w��n��C��D!!�)�q��A
��v0�>w:1�Q=}�R��ԡP�T�g䑩��ޡi�����t�{r�h����\�Vw�iȼ�@ST�c�(�ۺJ�j�z����]3�f�
�*U����8l��y�3y�:��;�e�2��o�G��[E%q%+�d7�f�z���A����Z�4�㣎�?���2L��!f?����2��M����
o1r޵��u@̈́pE�o�~s"~�����|�Ұ�y\���s뇇��|e�*v�����V�~݌q,�x�M���+�P{�7:�,����j~�3���s춓��4���T��+L����@x��Rc+���({FTJ��������{�S�=~�����h��#���ɭ�vW������n���E�M�´�y�>�{%�+����%s�<�݇�` [��׫��7DǪ��J�V�D%���p����u�T��VB��w5��p�^�"f_��8b,+�v^�_^J���܆B�g]��7*
���~��RO+K=�up�*�w����bG]�4ee� 	������^^���f+�N ı�R��ʎu���x�ݘ��Ơ^cpx�����/B8'������W���<V�n@�8�ӫ�^���X�D<4�W!�(`�x�N.������`�
��]p ,h��4-�n�<5P [\/�AP��<_���T5+����a�� �[h�ŵaÊ���V����
/�>X�9�@�<��)�E��d#��S\>{a+�
͛z4��z
D�i(5�%&�2�홽_��Y����
�����<h�}?��2^�ב�%j]@it(��\Yw⒵(�e�ĥf�mWD
�۽ �C�8�����h���)l�����X������^��O�ʪ�Q�BA�ș��0q�t񹧋���d*�8*�xzz���ew8�U�|Vw�J��S(r�Ћ�Q�QS����Of��g�g�)�ҨZ�3B�؅��`0.��&�wI[�h5�������0g	������@��B��͵�����&:�'�����tF�R��4#�n�9�����4�� 4���.�f�n��c����|
GSu���𺃯B����(�`g�e�� �!��떌�[ؒcb4Ibt��Dz���K��Q��8lg��8�e�E����<�E�^8;�'���� _,�ek:�B�������A�$�m����r�,N��%��'����^��u�Z�?a�;��66k�Ц�т���o�6��B8�gt��P*�n�b���_�	���W�1oU��X��yV���8�>�C�y8���b�\�YS�����I�E�Mt_�PEz���K�YP��7C]���;���}������W$+�q�&�	�q��S�y
�_���*��nv�Ğ
��Z"�'�C�#DNj���u�b8X�︢���~���Ѽܛ}�B��&�=NlZ����	�J�Э��ۃ��́�x�8�:w�MLG��bGa��\$�ɞ����`�e��K�/�&�V�!N�=�%Q��f�u��"�+j���!�	n)\�^��'�L�\	�de�D�pPz��;b��{K�K��wt���pOY����Hx:Xm���N+��
�W��JdP3������rC{tW���(~4����=�P���>V�	��
v��&�娚���ia��y�����I�PA�DICk�����9��<�Ȟ�C�9�&I-��V��j�vwe�,$�pwWޘAj�M�f����BK��I��ęB���A����ɅxLx=��F�����rd$)$�-W^,�S�`*a�̇�0m
�F��,�5������	�2�0��4[��1�pF�K�=n�?#Ћ���UUi]���GԁL(��7}�O"U2�j�I�-�9�^Cy_w.�T�C���_.��?�}s�9�<.�p�c���M�����wv�8xU�0U��3�~�;^.�W����,�ѓ`��H�M��C����*���1{b,p��@i?`|l4>�l��pw���@Σ�a��앚����p���z�HZ��44�6�@u�9ܛ5N_�n��
�� �����ik��\bd���#��yZ��?t�]]��.�C1ƵK��K��ʴ�
Nk�:�o�Ӌ���"HM�o5u�t��L��E�#X���5���'��4�&�)v�찏�g�v�7�{&g��эa�J�o[<)�z�/G��]S�|\o��(�VZ/��z��!����oq���1+�힗5����n�� ���z���yQ�W힝�Pf���o��Vɿi^�qer5�%�N󈕗�]>	D�KO�{p
i���O���jW�j�Lf1�����wR1J��
_.�+��o�Ue�\»������Ma��<�M������w���t|<6�.��G��G�g��Q����㧃�����Gϟ�O������{�[�v�jB�m�Wz�1\�67K�5nZ�~���,F��:���[vp<د���������~eO`�����ܫ�Ȱ_��yǬ��۠H�
!O���EH��ی4D�IQT�%���D�)~�o|�A4��=׳�/����`�����h��\��/k�NT8�f��t
��>�p>��v�Tb�A�
�Eo������O�;�?���p���p�7�d����b��J-��+��<-0?�F��@`x��}?�y��a�R[���VEc��.Oy�R��x!�O�{�rA	He���0���P&������<X���8�b����6?W&�x�dD`�?�'�sp{D���"2�b���F+���$r���?BGТB����������b>���z�h�Z�`��f�
�`���u�Ͳ���&��Ȏ�֜'��nm��7{XCA���b�G��ԍ�U
\���#׿�̱�w[�2��$�2}iHt��-!���}C�o�a	"���|��5E���D�-k�n/�m�P2F���fL��&�1N�á�[¡#�;�3�á?8�:`�`��B;�d�ׂC/��XL(�A3��K��-���A�I���mp����ezE��[%���<����Aa�6����r)���0�6��П�����3�7��-{��;�L��.�۴s��%��9���r8�"1�`��Z�-��;������:������(����P"~@�b-v��Fe���eG��C?��[Y�Z�1�����&dnL���ܘ`q[`�T��	L��,N�J�]�:�Nո]��m����o9tnJ�:��!��$�B*�o��cR���a��~p��IMhȶ���*G�UkSe�A�̿Bd����^d���c�q%�߁�+��b� +�M�ƭ\���m ����6�WCǽ�8����:�f�
�/L2�u�mO4�Ǽ�n����d�]N���d�2&Sy�<�~O^����/5�Զ3�ށ��o6�j�i��v���J��!�d�O�G�|��
=7��om��U!��3о���Vu����ޮhC�����;�Y|���uw"�Qe��*ǵ��uU��q���7�L��<w�u��7p�ǝ���X]�e�ʙ1B�.,�S��U�k6!���УT
�^){��ɪ���1��#.��z���P{�C����^́����p��M5_��|���7ݒ~�9� �7���sw@��T�N�ݱ��\�zmv�?PKEePQ#���+pip/_vendor/pyparsing.py�}}����})A�b�b�*�r��,�,�iE%A�`����$��7/��I��s���m,؝ݝ������'����`����j/�W��?ᓍ'�4��8�-fQQ���l�����g�"����p�	v��v7w����y�����o�IS�wq1M�2ɳ )�븈��ઈ�*w�I�A>	F�Qqw�*�l�⢄
����Z8tq����5*�Iu1QY�$��8ͧqVE�8IҸ�����D�V��Q$���*�K��|^E\VE2B(](4J�c�,�&�D��%���0�k�L�oL��͇iR^w�8A��y�K|<�3���"/�2NS��@�iĺ�T� 3Dm%�Em�]�S{<��ɼȠ�xL��u��xT1�0��4��!B��8�q�{4���6�1
��=�+�1�gc�'Y�*�#���؃�ב1�{QV@		L�,/�Qw�=��w������Gg����;z}�:h���V7������(���������_�N^#������Yp�>8z����u78:yu��룓o��P���<8>z{t`�O�I��� o߿��<:>:�G7xst~�P�؃����W���}�����!t�5>9:y��9|{xr#���ip�7��}wp|L�|cxO}|u����<���!<|y�;xy|ȍ��W����n����T�༧���?|wH���������ͫӓ��qs~��\U�����?:Cļy

 b��)���'���=jv���Cݟׇ����S�����â���ǍV�����d@����8��4�8.yO���0��`5�*p���o�?�gcWC��	�h���X,�h6+�ht��1<����
�'�*���ʎv�۲G�_/@Xi��E4)�]\7�π��R)�y0��,\�%����f7X�sX�YVn�| ��"ۈ�]P.�_~P0FM�asӨ]�C���haCnE~��q��?�� �=�W]Gu���8U1G6-k,�3�d�0�Yoc㻘yY�M`I����A�;`���~ȋt�Y+�Ǹ�\��B��7�Z��(�3�~�
�G�1�)�_|�`g�
�3�%�ޣ��
�x�ݐ?���(0;�O�� ��w�r�������v�8�~��_��gT�m��؁����`�����
�[��7��qQ�캽4at��66�L
�,fɬ׿��q^�4]i;F������:O䚓�ȍ����Ō�C��	��n�u~�b��8�PəLz7����q�oZ�/��S#="�3���t�
D�l�۲����[M�/��6=jw�v��7��%�ez�E��TR� 0� ӟ�x(��a
[6�01H谹O6aB�(�I_��h�bwhb}�@~i��?ۚVz�%9�D[��r�V%Po�E\��4�s�aUdh q�����
�JV��
d�
���"X��L���
c�UB��ݬ��k
ge>�%a�]S�)����,�аظ�?b��8Vv��%M�&:�ObZ(�P��r�LB�EI w	$QZ�?D�
v�� �L,A�O�j��P�?�sďX�܍�0��3ʧ�66��+�Y�:���t?Kʄءb��IX\Ǟz逛�aT�6���e���3�!K$<��Xz��%��Y2�!��[$�]�w�b~�`�)3�6�=�8N�7�X��_A�~�ދ�ٍ�!A��X��U��6�b�mr`����Fp�'�d������^&�W\��ۼ�	�9�Y,ޘ�Ƶl���_�Ρ��~���&)��z��������~~‵yЖ:"{…9`�9��B�����P���
�R�����5���cœ.���q%��4�%-�-��..L `��I��56�L!�4f�L6�3�'<`��!�O���qL'�x|l�6o����@'��!l\��F�EXj%��,A'<�arC�D]أ����ޗ�?����d�ݭ�-l%;[;[���ޗ���篰$�0@.D�mq��Ϫ���/s䅽fn�r��{Y\���Ŗ�Ky�V�]��D������x�SU��
��x���
q�Vi�LOAIӘ6
�hF���<{�эz��aR/�Z`I�d�W�7���/��O����ņ~RTy�
p�y6����]��;�8n) ����d
[��ܨ�Ş��,��e)Ւ�=I�H0��%�Ϫ��E^�-��UqRLH�T�_]��!k�?��K[�
���u�Θ�^4ɪGȤ�b�\V�-��P�-d�H"�4�T�a��G/�z��u�������� ��D�ߍ}W@�k��`��?fa�'��ܡ�
�m��vp"YRc�YuJ��g|��h��w��V��52I��	���-�(R�1^��y#6�p^��k�C��*'�{�)�T7d�(@��J�}�Տ��@z��,��±0�v%�5�Zϋy����aU�&Yf�)�������de��i>�-� ��R6*Y�pB�c��>H�*����=I#:Lp����~T��8x�.#C�b��,��e@"�<��~:Q����Q����:Em��q@� �"���Zf���|�ĕ���
;iN�����no�No���OW�m,���M*�R�8��IC���W����O]#�S]5�(�t(�5<�@~NFq��Մs1lLjGGN#�)�J�я~����}�48���۬�5V�����G�1sPFO
�����T�@�#qp��Аm$�0��u��$X�Y�g�������׬�qƍ;5_�F�:�U3��'!_G���*���>Pz�x:��7yo�K����@�ݖmR#�UTBU����”]O�(7H�E�~T\���>.�ɪ������I�Q^���Ūd#(?��j·Z��ǰбK<׶�Pv��U�/T��^�?�%K��ө�v��
�׼X�믳}�T��Z���L��+g�Vm5�kUh�2g�.�)����-�3�;���i�D�D���Ds�N@u�w4�V�rc2苢ؘ$����ă���s�����P{�5TYc���;E&"��?����Y.�ơu}�i��c����q����Όo�2���$�#�_�G�@'yu��/�!�W�/�/��/��i�
�U����xů���<�O	�8}����14s������kVC�/�cِ����IN��ku�Q�����4�_���m��K@�!	�P��S��3`���������(5J���U㌮e�%#���T����������6����M
����X��&���ʛ����jB��3~?Ǖ����.@��P���_�*�Z�&)сD��|J��Ձ���aBP�l�*��<�?Ogq&~�ΪE�bM,=�]�B�Mt�L	�Cu�w�o��*��l��E����?���XM��38f]�L�=�uw:�o�]6b$d�c^�A�:��h��_W���!����bu�z�����Y�F71bpJ��7���5vP��S���m�\���e·
Y!���k�FrHZ م��P}�_Y$x�X��kB6�"k6�F��f�npq�����x���4�%���pj0i�jA��Y.^���	(�Rw�E�]�K�-���4IuF|Ach�%�|k��MC���+~�ޠO/�|tC8-����y����
\Iv��I�#��H6�"c�)��w��媘6m�o�O��N�����č����
�A頦p�bL����]��j�~�{rc�A杋��ˍw���B����e���n�$�������s.ޛF��_,j���#��
z�ù.������"�9��[h�����L�(�$��N��������[=�;��RAqՃ�ꥨ��I9�v�4κA�d�k7F-~W���x�ǻ�^��`�@1�7��	!������G��C#��������u��6���Ņk��[Y�G�����Qi(�8��^p��<-sq	^L�%JR�Q�#	�0�Q��h��j"�ɓ��R/S��[��-�Q��.���
�A
�%�z����!�=��]B��u�+[3PJS@��.l�����H�߁wS�1�Y�3+�'�}�y:�K�H#)Ɂ��$�aG7d�LH�v�q��Q	O�V(5�S���L�bh�dh�$vpWb$�CO��4���"��lw,��=�&�+,�x���7�%�k��0���qT{A�����Y��'���\��mn_v:��Ö6��Dca8%:�a&y��&z�?��\�+���E{��0U��=a�O��)!O,Iq$�7�#RG"�bx��V���It_��Z�z���q3�&
�ѳ.���q	Pm��CeN���*�XV9_̐���>4V2~"^nwШ��!Lb?.G��+T1X��0�C7x�
^t�Z���k��V3��zt�M�z���`�	3WT�	�r1��~�Ë��mօ�ƛ�����k�f�L3�WU�Vd+D��T���3�� ���ҿ�Yh��5�2�GM�D�C
��a,,����DQ���$��'.PH��/�lK/6P�DU����_}��?���!dpxL�����^���#��ֆ:�@	��3*���x
��>��NgCK��p�}ȓ,��"DtKC�>B{[㥶v�!��B��g8�EW�>^5�u�u���i��(����%5���ރn�@3x��)ղ�喼��WL�1��0@�\���Y�9�G�0���BW��(F=�B D*�TP���y
�Uw#��DoE)@�hL��(�o��P}�K�Lqb5Z��S�J^�p�ěnU��[9��#��mx\F�w�aOӼz*l�И�̃�8�ц-���9o�Sl��$*�Vf���T�: �&U���Z7�Au�H>��"��A�G�j +�$L�k���w�/Va��I��z7c��p�x��6°��vJ���D>��`R�_hR�<Y��x���p��l���MF���cD��
�X��I&mN������Bko���
�6��6O�%�r`}9��*��L��J�QU�Ɛ���|�̘<�k���#�^�/���Zx��}_l���"�Q-ܔ��y��6��p��@Qa�f���b����0.���^�h�a��`Dj�{��=�0n���px�
0[<��Wr�w�\u]M솄�*p�g�-�7��Z��\��csW�r3sc[�
�LLB*�^�aC�o�;��Ga2Խ���g�ϳ1s
�����D0om�B}�P���h��>^�>��=@�WrM�?*1��e83��vk�����0b#���1�aB�����蹔��N+��6����vU+��R&D�I��1�
���%��gIz��L���(��+E@]z|��o���y�f�h<��z��"FP��������i�F�0�����m9�G���ҩ� �-���Fb�~)�̾�8�!���i۞t��C��b�h��X�c��U�/ p��S'���М�q�<ォ�%�!@�P/d)�v,�K�[u	L�]�WK��u��elW�'S��]d�n�Z���kmA���|ʦ���F��̹�O��{*&�
<�t��{%���hu,'<��jb{�H�t8�i@��x���i/���V�D`,��#�*WC8��"C#�fv[��m3���M�v�7�\W�r{�v���؅��z������Ռ� �/Tɤh}]i'%*�X2�&תR�
�uB�S�\F�b
 �(�㞞{�*��J�S��U��_Q�+�9)d�!y��F��{������i�z$}��
�k��ɺS��1�Hs�BA����I���-�Q�P�B/�ġ�Hc��#���p�<\Ѧ���|�!�9Z��="�xLu��-K��h�ȥ-	)T�q]��(Q/�9ty
M��{�"6��$> ��B�JDf���;��(��,g�H)ͱ�s�W�k���;aq��/���HUj&W�GӺx�p#2�sr�Hܐ����K�Á`c�d1�B��メIB�F4F����)���v�Yp�s�0#,��������n�h����@�잩�f���2���]�.�ii�ݠ�v��&��X��=�+����Y���<^O�֎����q�@<�qW6�H�*T ������A;xP9�(�Q<h��m�I�n���+��z� !jwz}6�w��;f^[��
�
<�t"n�,��	r˒���+>����>���U�1Ky&F�	�\x1�.�ǡh�b�`���9]S�8�\l]n�_�Qz�Ŵ7�4���m|
R����s�P�6��tE���f�ʥ�2l��=�����I�*]���4Ru��"7@��`�^4��v���R�D�2��di_a�.{@�@�?�h�T��;(h�����?�S}Ptޗ�֚`?�?U���:z����#��5q7�E�D��d�b-j_Q
If��2���7�F�q&��x���
����c���&_$�G4[ſ�F7t:��7����:9+Q�ʄ߯�����p'���v�|VZ�d:����.�NɎ-F����3��xef9z�ؘ[C
�B�.�>��Π��"�뫟/@A����l���
H$�q�̂�7����y���W7�sJ�@����M2{�aZ8�[�a��gk�ơ
)f`	��I�M���n�Y�G�֡�� g �s�P���hz��RkC�y:W8j ��� {h�2�s���p&�#y1ncXʗ�6G����B��)�Rl���=���8 ��P�@��Ls��8�c�N9��UQ���K���`�8k2H��h�oRe�ZA1��t��a��h�껐�q���p����y���a���1���'��B��Z7��4èM?��3�9+�kuVj����;{��eK��&%r���2�3�N&(²͒h�7�m�o�Y5��=�4�d��u�zR�p�\��UƗ���u�[�!����3{jT�B֦!�b���������V��t�ǍB�hϚi�	X:�炵[~�Z-������;�AG���2h�K�R4�}�r0�!-tM��4*�����` )��Өu���}Cݨ^����Pt ��E-:~a_Ș�gAS�)ןP-Z�,�$��'�:�m��`{�p8����_�jpÀj(b�*8�(T�PP�����-e����/�w���6�U���h1�qiu|����%�a�…�����(�B
��i�/�9�kӛ6!���Ǩ�_�:dhE�<%@G3�%ed��,촺�f��ҁ9F7���������ݾt&	M��Wq���s��=��^\��6~,�|��Dm�X������&��b/��6�P�����.x =�)H
��Glv���(x�_�w�}��F.J�}Ml�9�.Z5�/�E	s��u��WW��W�)DŸ=�~gh.%��~#&?�Em�@�깘�������	�(�&���x��4��v>=�?��-BCD�=��+BG[#�k@q�q�׶�G������*S[Lt����o{6T������@�L��8���'5����n�-�Oh�i��2BDrƇ5+,A��M�Z�Z2잝xU��ل�T0��D���h!C�E.���^%B�7F�%�|
}˪o��v
�AIMVPi�����/.]��::T3r�Rkռؼ��ʾ�M	g�F
q����4c��M���-��Ye�IM�Q��M
u	i,�\��׺C���M��x!�a����Gx���N��b�<ڄ�t��!�U����H5��(���Wv�.ר���r0h�bs��şj�".nQD&qk�CC����l�t�۵�e�P��V;�
[���R�0�gt�t�<'��a���a��!Ժ5���U7K�ՙP�ĭ��%���4��[\��A6��.ef�ޔj(N[h�R	S�8}�u2]�tM�l#5��A{��d!��q�$�46�d�M�vXZ���Y�6x���Wę�V	6�Uv�.����;f�z\:|��	���s�&=Q6�v;��*���R�6:I>�g�9�
��a�*O<H�ȁ��7�uf��/C��>�Q��h�R��H'���yqt�[i�K��Q��S�j���_���>�^V�ek����vp�f�u�M�&��F�o�U�ߤ�n��
��[c���ٿ�"�H!�	=�a��e��s�p�G��,t/J���uT�ל��nВuL����-,5�v뻝廎�� 9�wZ�&t\p����^! vV�����oq�eI���j)C/3�D�16�hC{��G���xd�i�&dH���}�$���i�aϻ��c�(U�ɏdpթ��x\̭����ZF�-i�Y?�����
u���~���=�,h�mi��֋�A�꬜��dwE��{Y��ݬ�U<���{!G��.�+A-%O��}���]��g�L@�,o^Ѧ���
��
�5�y~þ�l�
r{Co�nj��(G~��[�,�	��)z����7w�����=�P��D�@��D�Х�4J�4*�����6�خ���U�X�Ss���;	?�x�irF���;�0H���8$�k�OD�7k�q��J�U٠����.@K����f$�kI~M3�
T��6�����L�P���[<�e�"
�.�z����F
SHp0�GY�
:a(���lJ��v���p�)p�՞���=����X}��H������
p�;S�!c+���
vw�[pZ}�4[|1�K�2;��*��xl:���X�]�I��4Ʃ�3��ȑx��ra����1݉z���w<U^�.����{n�4�~��ͦQ���G���v��gK�\Z]x�cD�u�܊�k�DZ����֐�0��Q]�'��E�-%�̀��@���u|k��\�Ɲ��F��z.�Ť}���7��l�]��F���v�6SzհŔy�#@��Xz=�p�E��ڟ�m����C7�TOP�RkF�g\�
qhu�ќ�;���+���R��!mT�ҡ���6]��y�'z��c�Ԓ��2�ve��a!7�- �P`q�J�%�q�@QB�K�B����G�B�C��L'?���%�HD��
L��Ve��M
+��u�L�*<N�n���v��v<�������,f=�[�)z#�-���_�:��HO��O
�z�,Yպ�vX�\l�Z�(��j�&��ل�!.�a�>�S�Y>�f���BI��"Zi;Y���_�l�A���Y�Y@r6l�����?m�g�����gF}�pj#�u����vy��-
L��//:;���jTAcK�I�6l5��MU��}4㟤]��u��,7��<l����
��`<���䢣p�cF���%'3�6�F��_h�f���Ly@�r1g�@6��#�b��%¡�4��ݘ��=T���t��X7���/�ZO��D&��⏕MBe��2*����Z�4��g8k�W;z�i������B�IV:�XO�������lרK�$"*oN�q!��)ŧ�K�[�t��R���3�CFNGZJ˛��7&AzS���7�b\ޤ�7�0�)Ӷ���X���w�L�	e4�5�]�8�+�**
a�Z��Q}�H[��6�[�ssmX�9��ci�*'vUͶ����E���g�񌷚��sیgn��{�wO:��l�m?��
�v�PFɲ�>�Ə���5��]�#�F{�:Z��e?G�`��vSյ�%q:%��z#D���kܲ�P��	�1̪�K��@�*�T<�u8S�`w�o��3r�c����0�ÂK
Ld���3�Yt�R�7��I��Z(!�k�T��F3�1�e=1�}����<��� �]QnZT[�g�D��#��6-jw�ՙ�q	-�2'���!'�zDb��L�xV��2��V�9l���r��NP�A��nEV�V�{���QZ�=�M_�NݞǢ?^��r���-�S��e��JT�~w,o��n}��6���cKM��^��@Mm�u�d�Gʟ+!�wܺ�~�r�a[�x�l��:�@�3�(�Ֆ3����
��>��]�M�B�Ve� C�ߥ��h��'K�fQ��+��t|�!HK����\s��e�u>��"$c����I>ݨ��;)L;?��贍¤�5g�#őݵp���vB({�΃:�A�J�'�S(�~R;C}O	B�r�DƘt�:mG��(�kl�z� ������e	�����^`�gY���FxW-�S?o��c6�u韵�ͫ@+"��U��I��7W̻�'įu�8�p���W�	R��m�u{d0�5�e�q��1�ߢ��FO	�N��W��sD��kv!YNڴ�Y��G�`�M�\y��.�˾bOu��Ɇ�R`3̇��K	�):4F��kh��V圵0�*6�q���L��u\�L�����=�1!\n����	��"���T���4�f~���v�Qy�?�����i��]�5s9z���E�6��׊++㔈^\G���C"��f�X�1�Г�4
��N��^�`���۷}���p@���ȫ�
��up�̆H0^��Fts��ɸǟ^�Y6�#2��t�h:b����_g�VRG$���)T?��ND.\��cx{-=�G���Ax��������씘��c��
NV�Z݀��>�š�_cX=J��Y.B7zf�h�B�J�M�P�F��İ�v[ޞdh�1�Ojb���J:���7u$���N���S�}l�%��cu��%����ӗgA�`��c��h�
�y%JQj]1"r�`*��0�f
j��7�Բc�W�[ �g։f���xD]�ѾtM.���NL��+6��\\�RuO�����f�U�I���(qx��R��`�z���*��Eː�E`?!��{%�5-�[��o�wL�H����,l#�5.�5�C���5�qM'Ĉ�dS���z��}�7��������}B���ρĊ���45��m��$��Rz8���Kp
�Eg>p���t��%.?K�<.��U��}�q��������������\Ý~f�.q�f�0�����/�v.Wq�/jlMcI�R�AuKo�f�siS]·�r�����ߒi�چ�},��o���7� ��U�D�sW�٤,0Ea�NA��bA�
5����+D#`�8�Lb+���#�c�z���d4G���e�Q2�@�k�8�m���B
N�e��۲�����QI��*�
#?�E���D�5�2�R�<V���K� 䈠&|]�������V��GLji)Uϛ�.������	���7wv6w�<���~����Z3�:=�A�4Ȓ`1�^���)�نU�ff�ɼ��������I���/�N�r���g�s���:V�U�{�
k�xx�(����Ŝ�2�5����P�pz�b��c]��F��(n
�ǁ��܈:��q�ll��ks�!�A#$�?��#���l[�1#�`�{���JX<�sV�����k!^x!������!2+:)��ӥA1�F��"��\�x�0��H{h#)g�Ev-Bҋ�1�x,�(�o9K#RN�}e��U�k��Z�b���**b��^������<Q�v��T��c���ɌLu��e�:��4D�:b�1`��v�"\$�#�%�4N��a���頣��l�:��#p�j��o>���뱝�7R����>/��u��d�(�?s�*f��jAH֌���>O/o��/�}$~��8������P����s��)&��p�A`�Å"��-L��[�,d+�� �Vl�^ZK����p�6gX֑���1CZ��||��_E���^Gj�G�k(��i�O���#b�4���e�I �G/�G׼���%|�"������ƷS�Y���t/�w�ZlRŘc�~!:�sWآ���d�f��_��Qٛ��//���"M�ET,���j���NA��[��<�� 9K�����v*�N�뛉+_t���^=�*cא��͆a/Ԩg�'�8&��P�y�5vN�03X���I�A;D�j�@�i{�>.�>�N��$�X]S���$ab3�RB�GP�a�EA�v�I6F�qwgk�����j�@��w�՗[k���@�YB�ڣ�=�=�hc�S0�0����?�E4�D�n���odQ�-�������!œ��U2�Ic��^�<54�Wq�)��� M�EM����l���KqQa�5p�5�)Ԯ��˘�`Tp@s��~����P�T�t�u#:A�Qf>�qb�2��������f#�;3j��^P�m���>
va�n�����r�1��~0)��G�hfY�T'A*��Ŋ��MNN��鲜bh�i�a�.Ng�W�kKG��L�8G ��Q\ܺ�6)"q*��E�c�FL�N��H
 yFw����L�84.�m�<�P�%4q��x����
�ڧ/v�ЖUM�z�k���}r`Q�R�:)�Ë�{C�Ҥ�҈�k�I�`01�ťn����A�����YXx�@C=M̷��o�T�
�������$`��=Q�kjT��*s�r�d��v^a#b��"��8G���Tir��X1BG�;j%c�$S�v07�<#%+p/̺HK��b��Ć8�賌�]$(-k��Y83~� :�:z_G�I^�tT��E���2���v	a
�	�뤬>2D���6ZA���,����6bHv��X/a�朲xg
��P7%��^bZ�bZ��� �w%;&T	kd%�M�;�cU�]=B@��+l�� �,E�RN^
͏�W�)R�0�j�������9_C�GLy��gq���lF��6��W�XO��V7`WrAu��z�3S^?����5�#�>?��O~k�ކ�v�����dz+	�S���ّ	>���Ia��G�k���5
-� ��ǀ�n�@?����b�W�Ś�<��;4]�(�J���^X�e:.D[��=.���5T�d��q�!e����+�A��G��u7�R�zK�-u�AE�6��r��D��������1f.y�X��;�HGb�uNV����.gc�u�/�p���|#�|A��!V4�i��(�k�8!�����|���H6���Ԅ���ɵ_� "��T�����^
{	~s%�>�5ٹ�U@C�~1 ��������FlGLz�g�䗙�G�/-cCҤEiZb
�8� C(�T�ǴÂ� �Ҍ��ZH�����L����T"D���#bbW��밌,x8b�Aq���*��)((�Q�Op�M��U
��-�!݉J�(Y����#:(�Z�#^+�Ȯ�c��N�V�%�s�1�� �6��߻���n׭�@u����i�k��'��}97�a�M�El����=�E����$b�x�P
$�4�n")���,71lV�g��Xe��(�%� �Em��R�=�f����R��Tqu�G��R��8��u���u�,��_q@�0� �Aa�P�E�n�{;��e����+c%��!Љ�<btR�-�(�����ȥP�Q<��� �xFSD�)hӊ��ܭ�I�z�>`,�n��J����L�1�P��dS��LL摿�gހpx�ۥ[�0����.N��U���,�����[[ذ�Ҍ�Z�j�0I��A�:.��Ъ�N�F�z���ւH�� ��̗�_�K;LW�2�����y�F;R80�Y�Ei��+E]��n��_�y��Z4s�&88�G���a�껃�oϺ���O�����9<����,8}�<>8�+�"/�8�R��'�?��굀��_���O^G'gG���޽;|�5:�zy�=��G��?�AA�'�v߻6w:�fQGO��4hQ�P���t�p�>������}���<�a�k����Φ8���`��I{;����k`~G'$5}�c��r��̻c>0�<`��dFdNvj,��"���d�^h����rc����#t�_2�e#���f��Z�5������>�R�s%�!��^�?��%�ț�D	��-�e�Q�Eq0`џ��"/OZ�M��B��".�l�|����n��O�)9�Z�'!��m�e��((�#�� 	�`�v����_Y�Xj	��%�8頃�)��*�Q��ׇo�?>����ax��3Do�c�c�c�e@��e�\�Y��4A�WY�ȹJ	�5�7�N�w̠ޫk�K8���N��"ǥ�źS ����IcU�Ȥ�݀tK�Ҙ�%�����s4aS?fW�I��&mQ�C�]��7��x��H=d��)On����.Q���*K&�(�lv_�,݀q��ʹ������̘K?%��.��{<x�vZ�ɳX�7bĬy)�nɾ��g8���TE{�\�+V[Xh�D����Dg�:���WG�U�4Iq3�J��%t�DY�7��nS�V{�}A
��]u-�j����E��aM����j�GU�#h��C�tO���I_\F�-�U�p��a�c,��n��$JRU��y����mz��d��дp�X�vR�b�n������X|!���1�y��1�VYmӻB'���ǡ��N��d���+S�R�����T���9D�d�V��i�ી��Lk�$8f���u<��*�4�T�E?dw6,̃}�>ni6���`78�8����%2o���iJ�o�0��T�T��Z0L�+��I1�ϸLI��R��,H��VA���W��?wMJ��C�7Ө��--p��hL�T�$��M�(i4���J�6�;L���>��T�B�K,h�?�L�x�R���q��+b�Dm@�m����iʀR3<�������&e�y��e�u���� �2j	�4�7��^ =@q��1�'L�jJ�:�Q��\�H�x�I�Ph=�-')���UB��P��sXBy�H+t�x��P,%��>����=Nǹn-xV�4���w=�W�k����Oi���[w_u�>����;��:��W������k����o[kxT}�����j��믾���|��/w���
���yr�H82m�`�7Z��Dm~������ зbF3\fع�^\�[gWv7j3L/��y�������ʻ#��v����+��EJå�*�r�dy�v%�.�]
Ym^�yN�#����

P��u$|c��y{^�R���Pf��a/�����z� �lG��`���k�m�'�s����0��ֺg��I��v-r�/_�����Z"�j�*��mft���m��4)�<#�Ƹo8�{K�
�Ú=��ʽ�r�A@��� M����	��Ȫ�i�q�[+���uB�p^�q��4�Է�Ai������=�^�0x����'�v)}}cli=us��'��2)iG�
JFr��rJ���i�+B�3*b
�	K���T<�0�����S�`�#�S�'����F
�E|�Pl,ԵF�FN0��i�θy��;���* ��E"�Ϫ�:��ATnj��̃i�"Q�Kkխ����1��$ �����Q}��Z��,e�m����i��?|Mg��n�.�R��K$۰��M�l0��=��n�=����c��e�ā�6l����^�)�F g��ߤѕ'b�[e��d���h�����x(�J4F������
�pbir�!� m���H�6��ai�{:pPb�]qL�r�8)�?�L�i�O�C��.f֩E�� �:�L�\��DqX"��bO��C��j�������"�8Y��AzI��$��.'ԓ�� �p
���^Є���A��a	��r�yg�ք_ߟ��t)��ޘvv�s��
Z���Yo���Jy�څ7�$[�(d�F�����t���El߇�-?X�Lq��E��w�U�$�d8��Td�p�6w�g��dGJX�� 2�5i,���3�'NC���a84cW���ݷ��J�j�c�J�9���c@@�J��򀙹j8��а@�j�O�g�w6���X�ht]1B��I�c:bP�`�,�'iz�ɂm�x�G�F�W�1�qi~
��sw"̉��41��ْ|o��e��FN�3�.�2�cv��юE�0S�ݳFH�tI)�!Gf�RivI&"(�����Q������,�1N�te�L�N��웆���&334m"�A���a�db۾��ʤf�IQe]�јìF)ꅰ��`�"�#:k��&��	���`6�HN�y4O
�|���Ctn+�YWZu��.�L����"R���L�(��S�e��j��4~*~�:s��,�z���`X�4�@�3����ew��F6+e���a�C��(l���+�������|���2����s��� ���w�a�6tGS�t���ܮp��e�"3�N�޵�\�B��(9�!/a�<SX���|Tlm�0�*ճ��M��K��8�%�x���5l?�����<D��O��W�#}M�#֣`��g����R���x�ax=��d��16@�>�
��@K�Z�	e�5G{�#�ȡ	�����HV���!�N����|cX��-��^�v�7�*hEd�%|�dю8a�
�.4�(��m=�Na�`���7�
�2_
���yk�j�~"⹛wJ�R=����$/���-����o����O��J*��`�
rjlo�w������u_���᭽f�v&�")�?(�I�s�ī����Y���[p�I[2���ᅦka�Q�)�m�n�Jq�ׂ�<Ë�I��dL#Z��3l	����N�n��Fp!�ux^wE�gpq7�nJ�f��m�c�:b���@wxP��x:�[
 [�K1�GF
�[��u�5\u]�wV֝s��nD�\�a��ZQ^@�h�m>:0�b�
##RF,c���p`Y6M����GK�#�V�Y/U0XC+g�|�v��ͼ�{{�[��0�g�:�䭋����^?���t��7�8[��$�c�u	���77oȊ]���f�Ȉ8&Ԟ+fC^{7"�א�ʰ��w
�m@f��S9r�M��e�4��@��rm��qUW�,��(&�'�)�#��D,�T�ä�R���BF��Y^V�3#��;9?��M����2+�I"�l�Z��䯢�uC��8��n���w��a�\�;���N��`W�$N�!��)�pj.\�����`�-�t������A=x���{���]<�<�r�}�mÂx��5:�i����X�j��K�.G
.�%kk)��ࢾ�x�1��~���>�բL{�R�C��&��	֫;�ܰ�b��W״���8�3F�-U��#�K�^i�,�5N���W4��56�cP�\�K[nbV���Z��ۼJ�����[?�4�וk���i�}�����|�u�G��Ǥ@9��0�J;lڹ�j^��bε�Pq�{�.�o�׌1,[���I:TR��u>�kS��=G���N|��B��q�+/�JDVJ��I�%�w
��TڊnKF^�RrI���F]�=(�.-���K5K�%���~�P��Wx-?P'S[��_7|��庳�����W.M�Y{OǏ��k�:�R��M�^X�����x[>~��~f}_>������'�G��+��#��x��?��m7췵#t<և��-�xu��էbR�u.�M+G��E�դ��Z��vMWmy[V�M��)a�������jX��R��#��э��*�`ޮ{���*�4+�@B��]�Q���*��da����>�4���
� m��:͏�Z`EWc�5����
]�h��(p{�R�1D�2P�k��-M�]��{`S�(�!n�Pٔ������5K��B����=N�챥)Zz���wx�N,�*�*4_%z�X����=�^Q�ZW�sZ��"����H͂\�$���R%�]���_�y~0��9F�d�۾r��1����&Q�>ۄ�+&t������O8��f�C��΍�������V�P�)�*U0V�T��X��y��U��jU���\U�ޫ��j~���ٛ��?I(M�(O�X����qxq)��ي��^��՚Uu�q�D.�[W�v ��GY�K�}ת�{?��9x��y]���k�"����1ȷd(�nݰIy�ϯ����4��dt�(�����tYBWQ@�'
�[k��+��oT1��n����b6�!���7�� dc���WГ]�<��b�l�@�خ�v��C
�Bz��~��BA(�`S����i�1��8�Bt]Y�q3t+�t*�/����(�Fd�݈b�h���������n���L�<���Y�9��0az/a��~}��'�%����o�d�t�d�ɓK�L��=���H�����Qv�}5N�҈�!�u�1O�/#�lI������5Ű��Ҽ��*f�~^*�w�ў
^>�_dB������xU[o-$�RlU��})LE���=����[]M�x�ɣ�-v�2�i�"U��7��2�7��hQز�w&�սZ2���M{�ą1`	��++�ЫC�;,�4�`x�����bQ��n��6�d�e�-���z%&�`<��b�󖉁�
?�4�JF���{��
1[=�2�2�2*�����k�,�|RŤ_����bO�Ua��C�ae���x���D,M(Rd�Ŏ���22|5�qTqX�1�F�U�GSGr��2s`�TM����
E���a�h ��%�f��<2=�`�Oo3����Zq�Y��&c�N4`�vG����M=��
����%-��q�쑄$��ͥ��Nd�5��

S�O&x`��Y��ca�(���8æ�֪�
�M�J��!a��e�g?6�]�8R�6�m�|#c����e�Z�ޑ�h\�s�2H:�/D5�|�SGn�7�@�$&��.ֶ���pح���)��E���Od���mI
�ƥ��+�����1VU��������h�U��D���,����p�B�OWn�’a��q_C��]�a��F���Ϩ6���+I=%[�{vp�v�������g��,G	ﯾ��^��Z���+B�]i�.�tH�9��ī��[�RC��\��؁=aFYL��;�����y&\�y�1BM^�X9���8�7SH	�[ʞ��A^n���t�9_I{���׹��0F�
�$���P_�����Ԗ�;r�;\HPx�e����I��Gu��}��!XA'��бx0�`�4	��:�dl��?4�i�0#���`g���M<m�&���ܒc�f�����y��}l0�*r�Fʞ؜!�toȍ�T"
��3q�-��]�]sG<�x��
��9,7�8#Pr��D1��|���~H����O� ��i5�+�b�=橙`�0(*#7<5<���T�3g�t�T3��p3�6,q)�E�PN�]k2#TWm5T��6RXiL��A <�E$Eq�궳�L��r1e���{�mǻkG��m#�8~ڗ��npvҳ,���[���r{�1�i��
I��N�uvRGيWl��k:��F�>ʰ������S�c&c��խx�Ekv[5e��!���=m�I���!��,�St�?�R}N�v	�[$RO��D`
Q
�D��1�6�E��������?��yZZeq��Pn,�OI"S_l�|�4N�4CD+n��k �gUU��D>�l�DL�Fˋʱ�)ai����GU������si`��h�T<�]��piI:n��F$M��%G��1�D'�H	�DYA�$����3�'�CfWp=H��S�E�5g�� C����e�)�e�Ag̉R����R�3l$$)�s6+H:�8J(�!�D�!��+wEV	�o��\���e��`;�U�h1BD��A���H�Wǰ)aӤ �2�l���Ç���_����?����͇r2��ز�rpe��$A�l�P�P��\=���χi��gA���!�ۤ�m�
������
��O������#�s!�(�=^Q�~ Շ��Lo�P��a���N��N�r�JOW���b��7�+�"�{'J���T�����v���՟[�=\@�C��:^֘����ꕥo�u��`#tl�]r*�ܸ4��\���n�p��$$V��g���t4@1\�Bc-�د�[@!��L�3�t�`�[[��4�؅�������r��������e#��ܨ�0��WQa��(2 �SD��R/��'K��̌D�i�O��Si:"K��������m�I*yLu
LJ�6@RZU��93��))D
��]f���E�ӋD�eyz �u�x� ���1U�P�**�O$@)QQb�q3J7����P�
���Y:d��XY����2�O��K�R��Q�*��8t���@
 ��(D!���&�vP�5NJTq��p���*�~`�`���+�rN!jyq�[#A�	�wTRd����Ip
�������q{/|7p�A�`{�Յ��
e�)�-y�	�fEB	��Uqv)@h��/�8��<C�:R�D�*.�6va2���g\���=J��1�au�7�<�����`e
��~�&$ѡ���M�k�p��jΤ����h�+=�w�Qb1���sV��3�z+�c԰w��;�P��>`+6PRջ#i�޸���`Q�hΦ�tEOP��&�n�z�$�(�xr��I��,��i6���J��z}-[S�Ќ�b��"DI�f�����I��	сtW���B��D��K�F�X�T[#�(�͒*J�WCo0�%�\�2
Ą9&q�_��<M�;�-����U0V|j�OAC}j�ڥ{m��oҰK=�Z�ŧ,8*(]��}Gc�9�8��!�
x3�KsBj��4��w��=�։S�l���E�W\wil�m�>���dgml�}�
.�����o���@��f�0�	�%(��� x�h�;��|Q��[�ܡs�;���3z�u\�Czaܢ��3T�DU^,��m��TLZ�a�F���ֽ�f�m�@�R����%��y85�rpm�Ȧ$c�R�ݒw��ڀM�_R����=7%c�\���FT8bƑ�4�jC��3��N(Mi��u��b��r������ķ�ҥ���R��L�?��k`�j��������A�/�OO<-Pi?��I��F(�Z���%�8�9+ -��.���I}M��uo�]�_�F��~?���	V
��8�Tg�g�т�T:)�d�AC�'F*
�_-&����%�L1$:�|P��"V�j"�*b��2u	��V��?��Ԯc���6�;�����3ϵ[^s	AmZ�%�z5m[�=B���?��|f&�z�0��c���\��y�5�}�T��g7��<�F�2=}�&A��X���_�xm��,����a(lQ��Y<~J�䚚q
�?�0Qr���񛖃�������e� T2�I%h|���Y#�NCD�6&6�S
�0��A��^����}��1(����Ŭ��W��ɍ����Ԭ��-X�i�.*�n��ᗰ�*��(�Q�*S^�-�b���3X�oE�E�9��?p�]��6N�w:>dZ��3`\��u5s��Q�%�k��.?��8"�?��ьXjD-�JÇ�SУR��D-�N9>�t6�t���:��YǼ�\~��O�[DL- �ק�g�n2��-V��x���u�Y[� ,<p���:B�\Iw�*w1ص��x@ D�X���dH��An"M�:�(�ٔ�N$�j>ä�%mS��~�&�;��(hJ�)P�Ws,hD�{U��!�q���[<�"�&6Ř���Pd�ha>�1��4��.S�P�_q����
�YDz��OX�?%�b��xt�Iå������I)ł��+��hly?�U� O��ƭ�l/�q
��G��A��d��e(%X��W�>YGS�3d-kbM���J7뷿�8�{��6�Χ��k) �h4/�)��	��Era�zW$�k�� ��=PT�<	Ǝ��^�	�J��C�zr��}���B	���ClB�X�{����\��\��+!8r�Em���Z$����h��waNH���$�c��W�#ڻ�5v)����m�Ӆ~�.��	T:W�����?bИ��%��=���Z0�X��`4��d.�f~`�wǦ��T��ly��a�v��G��YE���4�l��P��<�X�;�"h[�K�#��?'=&��7Le�kH4h+m��6�y|�l��z��,	����-�
�!
M[-���Wl�OJ��%M�s�F[e�ΘO��L�yU����G���=ݍ�v��@a�X�S[��v��V�e��h��m��2e!��"��$�X���Pf�AL���\��/4����A�����
���T?���M�^-5pja=(����1�vG�}�u�]v�b�ӑؓ
y�C�/ˮ��
.�Oԙ��]�)�<c��ߵf���k=s�ԯ�A5��T~3��h���R���y��2�pZ�>����<-�-�G���W�of�-���\������\t��}6�c���]z�������7���՛�N=���9����{�W��?���XĴf��٪��	��
U��Y$c�^��Fy�Rb$�J��0��
��SU>QI02�ʆ9��gi�bZ	�&�4nô�s��
��-)����xC��(c���K���ZZ�*���k�%W��+o.��%����b�
��
���n��E��<�s���tp��z�B ��x��0�^���V ֺ�Q�]�ibf�FJ4o���1	��
wE�>N�
@�
}K�:
��b�魾�Q�Z�
!���@T\�e���fo�`�X����+�_��2
�G�O�)��I60P`'���\��`g龖g�"���#��(��~�#�y�ן��z�(��/���|hֿ�OM/��˶lK�e���C>6���{�v�T�?a�����[i����"��\�ҵ�e��p�ا[���C�Gsv�PNQq�^guteB4Q<HSi�,l����q��g�"�PHDĻ��6]GE4��mdV�?�?
>G�EF9�N��ql;�&U�k�c��*�$����.U��q�6�))�)�Bc�¾�
������7[��e>*�Q�;Z�ʍ��jt���N?���%����|>����Lr<e�k|>��e�S��� �&s��!�bi�/�j�Q:G�5r�i�\n�ou+�#���1��p�p
ܶ����lh�9�r����g�a`Du	Q�m`�V�h�����GG��	�ғ���f�1h)qj�Y�[���زv=���9��������2j҃�,����d,s?j�I��g�w����t�W��R�>DUـ�S!�3�����{�|��Z^�T��Q0k�N-����f�5�l]Fez�r�J�����s0 ~��A*B�SО��ʉJg�C��S�%��h�(���0* ������Y��g�jr��b�#V���x�>���
}�H1q�
$A8Ë@�4�9j�<{\���|�tv�QE�o�N�-����c
�-(	(�¼��tjE� ��4�|�Tu��AZ�|�;*�*1�O$���Y�H�W���m~��z�2H�{�V��,]O���輿*b~�2N�����M�q��4���F�Y��
�r�QW��?թ�4E�H�3N���F��
�-����U�V�`�˥�F���z��R�\cp+��0-8�b}H�LX�'ـ��n-�&�NL�$��ܜP��)9���ؠ��"�c]��ɱ �P?(5��LУޑ�e}-�১�g
��_d�ځ�4���<<ݍ����@��bcv|�V4�;���ſ�?�y����-��K`����nw�;��x|Re�9��@��/m�ڃ�S�祖׺v�	W`���t�C@�m�N��}��_��?B�Zk$���F�������@eg0ۻk�f�+l��Oi��Z�_Tr�OJ�u~�q���"���#6�7�^f'2�f0�.�:�9��C2<��74�f1��
!m��H�C�<e0���VW���@P�Ӯϱ,�A_H�>�^��3/��1/:-C;�~߈��(�~��J�=�� R��q5��UY��S����Κ٘[��SC�����ZQ%�凎\ϧQ���ab�tN�h,�&ez��%�(����qT&���(��""F&噮I%��Ũ��W��~�#!#�5�P%����HIIH�a/<x��u����jtvŝ���Nw�e{��{o��%w�5�m�>���*SM��nR�Ys
���(!�H�N��	��=����&�krg�M�ݼ猡y&�ZPB�pl������?&O_��9Y��|��*���LD����`�g��N
ž`���HrJP'uIM�t�ya^vs�V���_�V���#��ZX�������+�zlQB#\$@pjg�?*��
��
�C-(��Q�����2b��T����Q,wQ��f��Ł�㹨�W�,��U�:����OV���M7$"r0�5����c��c���O�&*Ʉo^p	�+/-X���M�Q�`ғ�V?�{A.3,Q�C������ˁ-
�e�$�WYi㤱#��~`�C̮��d\��(�L��$[��~bw%�B3u��l[rZ�ܴ��4Op=Ĝ��x,���+�o��������\Ԥ�����,%�_2*r�@���|hms|�ucqy�b�_���0���̛�H6��⏜�&{Jw+�惽�U&�!'e'��a�N��8n�f|+[酋9�
������y����aQQ!��Z�[[
�_5>_c�,ci�u�s{��l�дxׯ�,?��NK�D��y����Q>a����L&M����0�:�K�K*P,/9z2�c>�@��D�UR
�J	[�����	i"���"]3���Ƃ���3��oZ�t
��Ep-L�-@�7��Z�2*OI�(����ô��s��@yu���V��K���e�mH-�����p�$'#N$��ȋim�M8��c���I�Z�z�w�f�$57�`�/U���aje��>f�?���i���*l�bI�M)�5�5=��j���x���/ުq>�@�K�%�Iܫl�e,H���	�X-	�W�q�6���`�x�G���-��R,��o�UVT:(L2�}+-j_���Tʶ�*>#_�E�)W�$�f!�Dc�`��4��g��Js*dV)4���C
�
N����E��Y4����{0�P��+�Ց14�{��Ƥ��2"Ӥ
5���:ē �:��``��XH�����ի�����xn��_�9s섾أ�ɡ��9�z�ڲ��f� zj�k�۞��<CM��Z��h��辶<���m��M�<�$�&ԅ��H��*|��ډwv=���ڠ�����S@�/�fK��ZH�V�'�����Z��}п�w�>���4)�0	GL_��URI�B�Woi�矎*G�q��V��m����>�9�;g~:��3+���<�t!,%��^l�`܃x}�{A����ߋ��|A���nS�(�Gmv��7G����ne׽Z��$�^�[�ݥ}���a�h����~	l�U�f�vQTy޴����[>ݔ���Ux>3�	5B��y��QV��}��C[	+�mw]q�!��$�	�w�1,Z����j?�h�6)�V��.7e��ЌK*!ѝJ��~G����WD4,��%嵋v�Ѫ����F]��$P�(���L6{�
;���c���	�}I�R��W�[G��-t]GHo�-p�L�/��=���^� %%s+ۍ:�XO�4�ܒ��.�?f�NT3ːH��z!�H����0��3''��ӷs�q>�'��z�NP85M�Ģ�Je=?W��J�[t�Ɗ%��'-�,�$���I6��>5B�]C�!�p�mD�YJz �K-9��oFD퉑�w�l��5�v©|^��L�������$H5g#h�͎k��^��{\
��US>U+�MK�f�$�`��A+|sp~p�i9�w�,��u��Ӫ��4�H�~M��⇮%gq��y7�]��A;xE�F-�6�9e�_�}b��3�U�j-�048*g�g �{�oHM���L��7��o�|]�<����w�G�'��P�{k��nƼ�dK[�Ŧ4+�s��g6�s��}
W��� ���Q�\T���ɽ�ǘQ	��ڧp���z�;
�DǢ�%�W�5`2b���K��
4G}�T
.齹>~�U(N�����v~U.h�>���tw�'>D��v����PM}�7
����ٵ��eq)�{/�F�;��&	�X5FYy['u\������ I���'���D��<��k���QaO��w1��z=�ᡔ���M8t�<�0�"�eMV�G̦�$�t,��8F:����I�n#�`�rM?�9&�2�ѥ��Kr�~�]sq
�{8�Uh�������-2ٷ���W]��t��
%���M��ɒ�#�sm��mّ��s��O�;�*�v�BiOBG)X�R��ݾ�q�֓��O՛�3���Uv/��v�ӭ�M���or\��#:���V���R����8
r I녭K�,��OsX;�	���
c'd��o'�֗��Y�BU"N�,e?��+s�f��}�-���}��|	��� �ꢨ'��3z�$���U
�h5@/�t�dC7���i��r,�^C������Ƹ��6FU�L/G�̊����
^pvEq��wѢ�ݷO��*f*8a�
;�~�h�W6��k#	E�П�Ҕ��IN�õ���Τ��af1�y�(E�S��ZE⢘�h�>���-��ռ��,��`�^����^eNe�!j.��ƙ�s�	t������7T�Vj�m��84L����!��5�~^�_u��A��v&ZG��JbjޠF(*�M@�rԕ|�KV꒽��b)�(�_��!��rQP%���pX�эԏ㙏��VF�q�#dA�l��b�����V,�.�r�!yKE��u��o��8�ڧ�f����ֈ���D`�
S�'%������E���"hP�-��K�1����.kk����x�/[j�>/[�H۱3";MFӰH����T8\�ó�,�$xt�#C5�1��{2Yzlh��f��'����c�-���bS�^�az]�U��l�=<ٚ3Q�CI&�g�����鬘�ʴ����R	S�6Q�lj�Q�1�Z򛮲"��D����8���#9������Q��7.,6l�rO�;��@�`��C9ʘ�#�vv��RW{�t�����i���-۔[�Z>� x�Oa�xiө�M)�k�k%繕LZZF{�I�`�N&m
�&O���i�.��]OC�����q�� ��Z;ln�����w�����p�,�--�F8�eP��iV����Kh�3�s���"�<9&��1ԣ0l9ֈF�`e�X��!8��Q�+���AWD��:ʠ�E2�X5��
	��?Z�[#��cD0�y�Db�Y�\f(�qj��M�W\�P	a����>��[���m�����.I��Eٹ)��ȶ��o��&��*�"Wc��%-+q��߹`�$%�M�S������R�Ů�z�Y��{��~������ǝG��|�������F��&�%:���}]�A!=�@��Ak+:��H�LF|u�l%�,�rEΗ)��1K��W�z̳�,�W��К�J�|�����+�g��{:^�M�P�ޯ�4�ጎL�-���#�m�L2l���i�.��,��u'N¦k���B�(�-�׶N����f�^�^Dٺ"��y,����<;�^_�l�\~�u3�p8�W�U�_8��	���]g��9c]�sF{�@ץ���	(�Ͷ\���P��_���!���N��;1;�c�E��Ń��Mq��Hg�j������yJ�erB��X�шd�Lҳ����6s����زk�1J�rb�X�i��->{~P(�!�8�v��B���<z��Rx����Ѱ�^�ؐU�������=�fS?̉z�^��OX�=X0�79W����@{����,0�j��y���-�X7���|cñ��Wd\nZ�_�@�7W�tD�a
�`���v'�5� ��jU�W�V@�ޞ��f���l���S�;�d�`Jv�P2C���m:�K��QA�aC��]gR�`��^���l�0K�c�`uTEv��#*Z��.'3�(3Q~�N6'@���y��:���{*�S|�fR;>6[mt�*$a5S1��X��Sw<�X�����DQ
Ң���	J*H�	
�_Z?*w���ŞEr��:O+�R�w�&ȏ媱*�aj�d�r
W��c�?�%�
Q�\y�Ú�mNs����Bq����n����$���"H�\5���-'�Rm���#����݃o��U� �ؐ��T�	I��=�5�_�n������#xZ5��GU����o��1l8v�@Mj�'����������m�l�3%�9(��*�Q�!Bd;�/��܁^}�)��#Z���<�0\�4������:��=oO;���5��z�l��U��������3��읞^�ț�
�iD�-\�.U��>��#�u�cg�LuVUh�g[�BB��^�b��Ip��ֶ�����z����"\���>��
ڃ)�Q��Hq���~�O|%����11>�v�v�3,�F�ش�|Bk:�p�5f�A�
	�ˠ��r�c2e����}yr��ZK�5�qG҆�C�TZk(j�#��:*��*�R�"5pU��b��?\�"����v�r�Z(���]���L����(yo	�G)�:�4u[����ޮE!���w�o�j�Y�N��J�Bs�kq�~�69���7�w"��JݣMx��">�����5:vR8��C�A��hga�J�-x(�t�W��SQ!
�G�wW9y��`h�q�^Fc˿�~Re�+.@%Q�V����ɽ�\>Za�2d��K�a������@a⍸�`=eC%^UlϹ�n�u�
�z��E��׆����3�G"�z��i�[
^���1���f�yC�R;�C�湘fg�A�%�
w��M8B���(h�ػ��؞E�]��y�(�ѕ6m��n����y+y�
3�h=�bn�}�Kn�Ռ�Ů��s��({ı�k�<vx���.�����)�륄i�5!���!�#��Z��]TU��)��Uy+W�j+9���,ۖqe�1l�|���.:�<9�h�l�}\264"U��(�>�]q᡽E.�9�ޕ�ȿ8�ώ��}��`���Kv_=�ߗu�������PiRνe�H��|8H��$�u�׳k��H�h-�J��5i�O�٨��×Ó��(ȱ��i�Խ~
_j������	�����K��ۆ ���[�Hds�Tm�����|���_|Y!`zʄ	^6�i=Ҷx���n:��P/���l:FH�h
O�)�܍��/d�ю6�M�k~����2��
E$����
�t�	���t�3���^�@.�e�v�K�����D
Z�2����;�0FEW$p�~e�?>y�i�G3,
g]S�H�>��
7�n��z3R3n�Q{�nW��,���=5����6	���
&b�%5�P+�k3�E�a�����s��\��Ga���o��r�`i�{����q�S��"�o_�s��7Ʒ��wρ�G#󻤘1M0�=��� �wҐ����4f/
�6RMi#jD]�+{uH����}�p�mp�B��?p�p�J��2#����C�@�M�s�T9IN� lJA"u�8�M���:��|	5���TI�-ó-�y��cg��-_!뱤Ǯ�;��
*��{ek�e
!Kvо�|�Ɗ.��5����b˒�p�X�k�2V��=�Y��[�ۑ�K��L3{Z9����2���p�f/���i���D��j#R�F�B��؋��қf-�H��s.���z#T4�@w��#��9F�=�V�]>�i��-��?��uѸR!e-�%M�z,J�$4���
@�MTǘ�����+�y1 �%\�(���׳�E�̤	�V���zg\W]{0�V��V��XH]�4l�9�.MZkSE{t0��qf�g��Χ��!��H�������� NU���� `�y0�WΪm��k���q��i�kv�M7�Hp^i�{| z�7��9��^�"�4CD�`�%#s9I
4qw��^�}���_!�w槳o,�b�7`�p
�P(XO�T/D��=���cO��@�����w�O9r�&�{�@\�`;@�/n; 7���eOZ07����2眿/<y���S���^L�%�^�2=�ۛ��t<���%�氣͑rL���\4�����
������ZQ�q{@4��iG�9�)�4�#�Zju(1h�d�k�&�UA7aʨ4���y�H�!ú��7���KN�y'GN�.��J|�b��,(�d�Zo��3Jk�͑{Ns$7�:7Z�V�rO��$*�\z�7_��1��lD���/��������J'�hqEY�����l�o޻�w�ք
��ӳ{��A�i:���?�
;�^����;��s���X�v`N��i0|�s|\���%��th��ucҗ����cN�R�u�`oY�-��	�#����R��~~n.|Ҥ�?=ͦ�E~�'�&�/?�f)_��X��9V)�	�XD�	��t�b�$�O*-�]�Ͳ�z�.���{(W]Xo�T{��qGsL�ɫpZ9\k}������ڋ,���\�*�2K�;�{�>�����C��sx�5?襗�S�ֹ
��n&f���m6=�/pC�y��a������������7MZ�M�m�^�I����&b��6eM7ݚ.h��x����x�[������5���[���?>y�������_��o_;=���#kD-��!{Bq@�9�y�{yn�-nOGֆ8o�i�P�ym'�IKƈ�ZR5��7�<��k�G���L�9뱿Ž��ƫ�Gd�K�v��E����@{1Np�b���;�4��ʢ���|ԕ�w�~�J^e�ڮ��uI��Di|8@� ��1����҈sHSIv<:<iR"�}O�V��$��NI
�ĕ�*�W�	u�ĭ�xښ,�ۅD��
����X�9��p��k�t>��������X#X7�`f�ȩ��G��t�Cp�w�~��t�"�*ߪuZ��Dz��(��h2�|�x�7QT/ZEi�%��ˉ��`�:Ĵ�Q�$sD�%4��48K��-\J�3r^����`���W���>0�!���쯰�S�|+�T��
qQ^����&̧E���9�? �����Ъ�7���ݙ�HFx�i$oQ���l����o�$�m�=�L����Y���K5q찑�6f�#�Z�̀��(�M]%��̬΅�n���<����p��Xs�L�E��m�i�S��b!���3m�쫄���I��S���
�v�#�bw��\�
��m�B"�m�$'fd�`%%��^_��7k��_�7+u�����zc����<'$��
	*���!9��gЁJ�l�mR�U���;���=���dY|
ܠ�R ������p��E{��c��Ӷ���$ՋKݜ���7�`�<�Ԃ����4�b<�IZ��{	٦��p��� ���������װ���ioٖ
�;I����U���.��,S(���`؟�����^��S*�ޝE���=)�Ej*;>�g�Hexj���>���^���]i�)�1�)��~N���$�XP9`O߭G�:�-�q�EMҭ<�y�Q�C��|J~O*�ZX
᫿?����R9>./u_����Hm&'�� KG:���yF�FF
)"1�o2@I��X:M��|D�\&�mF݇/�&P���R��	��~k�$�:�e����$�;��6�wڥ��)It~�F�{4��{%S�K�a�������E��o#�F�*O�f}e��Q�I���|�����,��Zu���;M*���Ⱂ��O�Uu���=��u"
��k����v���
�;�N����E����oŎ�?b��`d�oW+�s���R1[�R��0s��r�V�GGe�e�J��HwL��`���Ȋ��Ŗ�?�#�����
ɦ�ͻ��+�1�T�4.R����p�6㽒��8E.`��P3��0h�Sa_^�. �;ȶ�w�V+HW��B�Ɂ6�5�0��O�qsܐG2�2�WB�s�T�?�Q�喪P�6nWK�E\Wt�K��艑�����,�_(�%�r��t=�OC%��J�f?^3��mw�_ 8ﷃ}�.=��K��o�m�J,𤨈��~�����'��(�g����'Ob�C���V�䵯7�y'��U#f�n�j����U���W�]3��2,iT��?SU�%����+"�������x��Զ�ޮKvBKr�k�I����{�+�x��76nAk��L�e���!culC��y��
�=�J����덤٦�5�z58��-��0w'�WI�fPdj��%s�"�V&u=�_^�d��n�sf��ZR���A����wr��"��!z�w?�����+2Sj��kޞzc�1�ҟ��#��
ׂ��������&z����3�T}��/��ı&��S����javX�6�f�ҵ���lQ�g[�#����_S~Y쨝�2F+n-}��c�_K7��	�[��(��&e�]X�
�..4�BӒB�E��s���㋼KG�HFW~�i�43mz������bS�O�R�u&��R(~�4�r�l��S�K���Y�A�"�n9n�Jf�zH�Ҿ�+���/��}�
�%	
X�r'O8y����)��
8�o�Iz�l<�]+:�ҏ��}�-�]`��R#�Z	���5�\G�?ơ��A�n��}�g��7Y#x���`����2���y!�Q�1@Ђ�6lƬI��;��&��bO^��Y)N�P��P@A�6(�H�本;l� �m�� o�ޛ�Ny{#����>���h߯,ЊV�����+�7��Du�>H�(	�ux�!/M<��?q�l��3��[�����O�뫙-z���I�}�o��9���t�_EJ�`���k\|ͺ�<|�i��nS�l��E\x�gp��n�1T�M/�����v
�Q���Bi����А�������z�z�W�ĹO��n1&�����+1p�íW����Y�œ
�!Z&o@�d��
3\X��i
g�4oI7nK3��@��������z>��Q9���t�h�2�}k+��/�n�Q��p�_�Q��J�����ף
��Kv�X��(��q54��(�K���"��0į������3�F\I�	��ͭW/v��)���C�1ɸ[O�񟒼����Dݭo�������:�z��o_�?��_>���ݧ�W/v���o��_��Q��ϟ}�����?������j����݃�/���z�Y����>��o�e�7L}�W��}�����w/���/�^6�����J~F%_����r���_���
���٣��w�����K�~y�]*�����"���|�a��we7��U[6��ۧO�/����ۗ�/��Tl�2�"߆}<�]<���F�\){0��-y\%���k���T
aĨ(�l�u0��
/1��v��o3�LI�q�0�lYBrL�ߓhk4�^��2�8��I�G�`�f�Fx4;�U���G�Y��-A�p�j�ք�x!Y@����*���軍���y�s�M\"������(�d$X�{����
)ܥڨ�sٸ�R1�Y����#�4#��;M'���"ƃѸ�N��e���d�PԮ�f�^b����P�歌��ς�>|ybYp(�I�����S);��U:�X�⅖y��G����C�~.�
��_a��kAq��é��;aA��r;%]�$T`���r��Z���u�]�D`؁��FGp��)��B��c����d�WH{���J^\�yf�Q�N
t���G#1GNɌZ��v4n8^����P�Z}m����Ҹ	���.�o��ɜ�M�U�C[��)�x�$���-���C�o4�_A��S|W�MfqH��+�gt��r���-��z�79�J�[��ف,�j���I��@*7�DhC16�>>U�K�����JO�����{������4A�*���c�7�Po`su����g��l*��g�̼��杏�+h�
V��RW#I�ҠR+h�>����v�0�Ω�[���ͤge�a�d�`\k1��}�A���V� �w��hɀ|֟�|�䊲��~�c�I�$�-b��5,-��,K�z����Koq��+���Y+зrRt��a!)�P
�����JfPѼ2��)+s����Ю�kz�5ݬ�%0�Q���B"����Ǟw���q\��,��Yf����'P�$;O�1��i$:%�1�6l>	Jj��@IH��03�!h�P��L�MsLr�\�(cTѩ�TȵH�vh��dX�L[h	緿K��3������sn��I�1�n1��U��^h0~���~�
�_D�qjV$�K6�eY9L.o5�dO當������-��X�,�n����ϥŭ�[K6X&yt-Ws[k�oՍ��Nt��ٿ���L#ey,c�^�
��[6�]M��S��Ж�=+��J�E3V��{�|~�a����T�;��e��Q�ݳ�d:�T�n5K������J�fﰰp�A���ϸ3��V:g������,�*�+-��Gi�@WjOγ$�؀�#I֘�|��F��Ll��-ї��#@V�~�u����nr\cl
Dh�Nؘ�J��pļt�C#-1|*���>1��#�N��
��	��f��r��PRdi˃&.C�����zK����j�t0x1�X *��I6Z�s�KP�1�d����F<��2�qͅw���`��B;��,��������A������K����B�e1�!ch{�����+fvZ���w�%�޻y���܂K�(^Y�/�F���F�j>�A5[�Q��8��f!!�~�fe<8|���6�G���5;�R�V�Tt��e$Xz�˝-���X�VrI�Pƺ��z'��k�i�����gJР��o]e��+�F� ��e�F�;�UsçS,7xR3��p�`Z	��Gaa�Cx��`����,a��)����!i��?��c��{����7�2�8���*�C&���%����/0�
�6|�0�V��L�HY�wUƮ!��*�,|ii.�bV�
�{��<����n.����'�j��x���+X(�7m��K�*���{~kټA�ϝ85�M(̜?��W�PFc3��X!קtf���,�%2��i�+�#x�B3w|xTW��J<��4Z��g�7/��|J�(4�EUp�����1]�l���w�̳�K���C|m�;��� ������38%ѯ�3�?O֣#��a�D�=Y�xt�ė$_N�4�zC�8!�1~]�m�>�T)�i�ɯ�O�������o:���'�Tp�}�N��T�7����Mg����[<����|v)1&ꎝ�Xmy+a��%*\�AZȪ�'�o\�'�@N/E_bq�y����� �x�Lj��L�Tڛ��� �9ů?��ⲉZg�0B埦������յ*ʞV.�*$�.����l����"�bh�z�
��
6L��%�/R�l'�G���S�iT6r�D���
�Z�߫�N��_�-����#�Sd�,��_Lѕs�l�
ym��Sh����A_�r��W��F'�"����tz��o.�[�X��
h9��c�(L����o�e�U����{�z����5{@�'99.%�S�Y�ã�Y�o8�'��61�e�綽�Ƀ�\z�pҌ%�8{ӟ��@4�3&}�䰏�G�F8�Qs��㚃\�U����a�j����a%����a��֔8�]��,�b��b��-���C���8�X.��w#�@�2[�Eĸ���#��rs1O�T.%��z���Q?�O�&Bi���
׍��m,�▊�ᕌa��>��݊nx�Gg�$,E�����^^OF��5H���]4���h��B�Z[�FUB��kM㒩L9�
K.;���7�d#���F�-�鶼Fn`�FE��^��&�$+�ѝn�~�\[��'v��bᓛG�]��Pc�]jpӬi���:@����x>%�k
�U4s��t��y|��=
/a����Z�"	�c��
�˄�6mo�O�
�3#��1ՠ�c>����T,Œ^jY�a�Y �]�]���5؄>�
[��?)n����>�uPB�&��2�rה۽T]���n�:ظ�����)�.ڊF�6pXh@-GY��;����ʍ?�o�˒4Fv��m�:!�	�������W�+�����k����K��I����z�i�|��"t����x�'P�֒�aa���ž�
ŃGgEqVO�$�Yz祲�1D��_���/�~E�j%bV�fQu E���Z$��͇SXX]����Wxġb�Tg��Y]�J��mv1ַ�lF�`�)�ys�3�??��2I�&���;���T��ϪX�9UF���i�O�U]Q�.O�D���Y�
��%��4�Ga�+�9U��������g��_|�(��a�V�/<�r��VϿ����b��R�j��P¼�,q5���|a��ew�n�QΓT��.��DO�V�dR4�����M�D�z��Q�t�>!G�f;x,�E�,�]�O��(s}۠ކ�_X�x\�Qq5��y���[tĹ�-PoA1F����d�$���K�}+���lGO�t���M���gQ��=�4����,�g`R˰$�ɸC��֋R*t6�(�ȁh��@�(��+�)R������	�u�D�f�����a��|�f�0��v��"bv&xp)���oyp�Hs�D
x�m�-{�ah��z9Ʒ�a��р���[>6'�qr:�R��h�y�o����y $ofre��}���Ʀ��[���ٶY��㙽*��"����^���aD!��VX��{ ̂C��(��hP�͇aۅ%��Ob�dk�@�.Ƿ�m#����hR�߅l��H3�0��[d�/ب�W*����+���(��#�I�ˉ3�X�@�W&�Y�P���Ě�Z����Hv(������%���f������$�G�qW�@�%�?n�ބ$��d;���Q�w���8>������R0�����}��t���o�x@���^D�hl�O,7���r��ʤ�?���ϛ�T�(�}tnb>���[j��Qس���3�1���	[��]a�~�|���c�p|t[�
�:�M�,�U�g���u��p��z>�.��t�q.�|6]�ۙ�oR�!cG��>Q����_1�"bHSbⲊQ���d��lp�8����g�>�&�m	UZ�z����
rx0Z��1��mX���eN���2�B=���G�>&ߤ��'Is�W�I
#����Ho=��Sq`��1����T�GR��E�@=V��d�F����q��,{���e�Յ}�.LDb;΀9�(6���QY7DH��.�����A����Q����W��B-���@��w�U�1A
Q�sJ`�+�7���W��$�_I���"L�$���{��,vU���vJ�Q�eǂ+9P�e��_W�`cQ�c n�Ok��{���/w�}����ޓ'�H�}���,y����/_<كﻏ��P@�����?<Sf�y:�ن�t0_���ݗ{ɣ�������}_^�L��q���ϒ�𯂴�!��A�t�~mR�u�|��*��q>�U���PZ��w�.PmT��%H=5����,<�E�[�h��Q�T�6�O*˃1�p
&5�V3�	�,9�]b�f�_��� �Dqt�1��k��,��zi2|���h�x�;�Ua����R�pS׏-t�!�5�����k����4���#F��B�Ǥ���H��Z���ɧ�:,h���z��*��O7��]�Tuc��v�Ԝ��c:�r������oT�P�*����A�PU����T���H]5�f�:�=�����x�0�N�?ץ�rX�|���=��}Q���"�*������/"h�.��2�[1�L��K��K����k�P���{�٠8�P>~6�0��C�#
j��( �AA�SI�+��e3HL�(�������<�Gy������RI��������p���js6�^�;��=��@D�m/ZțS*��B��N&Wu��X���D:����U���P
[�cX��#�Jd�u�+
����Ac� ؆ո2��i���BԹ�����V�|a+����ɓ��H�3�\���"���S�ː��9]��5�}�&�&OMF���pN]��ڹ'�F��k�7k�E��O�)4ً;��D�6��Tb��~�+����N[�ɫ�Z�yi�hj�n�βѬ:��� �G���@�1��%4��b��*�0��p�If��M�h3y�H�U�9߰��!Atj�+פ��ÕT�O>�t��x�$$�H�'&���Ɠ��^�d��Ȥ�6�&w��d�HVjA�i��ƶ��"Wr�(G7�GZO���b6Ǯ}�o�5\�f(��xi[��Ú�&~��#��#�j jM�_�Ok�� �����V�U�zz7S��E�]1�7�k�]p�B�
Jc�6cۛ6.�����m��H(W��V�'�s�a�Tl��-��a�<nd��Ԋ���S�,�w�����B�J�$HUJ��ZZ���I�t����g����i����y��Ĺų���*F�K��W�c�T�$A\!0m|~K"�jo�0�jxr�=�F���X��!���{�ޮ��+�2:��EC��̶�J0
$�ӫr'�\]a�خ�o�o9���am�ѨC�z��U����U5�b2;��X�����^3���>.�>B�c�4[yY`d᥿��'/c�p���Mz��=�T���f��$0c||��c��1��wa�w]�[I�E���������0�K��ٴ�7���ǹs�9w\K���&�	�Ŵ��R�tp�^�B���Ю��&H0M��ó���ML��p`����c��]����7����2�]���$B_d�w�nւ��ғl`#D�gl�2�$�Mw	;0�`�s�.Q�l��
���\Y��?!ߞs�5�'Py��BZ��!g����6����.@p��TI ���m��Q����һT��)��tV��l��џ�{V�h&��!x|�X��pF;lG�V�J���m\:ln���h���R��A636&��bB9�:�J�U
�+�i��%��i�a���fv��n�Y���	��QO���ң%�~���s[�ƞd@��Jd]��⹲��i�IbC�{���	��e&��#�V̠0��g׷�P�eO`_��2�3KNh(L��e(z�46Ye�,F>�[7�贠K u�M��H�K���1�Ds�:����q���Td�pZ�eR����j���Ƈ���܋���-�d�+
Ξ��nRU<�y���Y�mdD̓a'~�r'�������BF��J������4M��de�-��q����gG�m��e;����:|5�؇i����|v9Ȁ+��1�0�$�p���ߩ��0�(��HTn�M��Rv-�a��{����_p��ei��Ԗ��Pv��6���0j�Z�'VX�S�EU'��W1�)���§u�m��F�6q^�b��I-�[a�Hנ�a�=�F�(�<t{�.�=��;��杧�?v��,�л�N4�c�����oSM�K�&@���(^���*j9����O
��I�!�@�6�l
1ˆ��}@�&�毯�$�^_IM
*h�8�F��D.�m@�M�:-�TC^�U�.�H�vۮw8¯���3��c�B�z@f*��#Nk*ct����uh��m�u��7"#�obG
�5�^ӧ�5�s��6Ű0�v#�G5W� h-i��ڑ��R{����Y��S��F��H��C�@�56�J��"����1Mh�.~V��ecr��(|��LN"�>K�38
�򲼱l;KE�л��U1���y�Ҏ���X*3pKWV�ܴĠZ���F���A>n�=' \Iv2~KbuJ�������t��-�u�KT���+���q#y����
�4�=��9X�������	���g)2K�@/8��B����stm��)��A��װ����{l�n<�C���x�u�h���×:Ow
�}�t��^f�j��I����xJ�5T�8�3�s37������a�P~�y��#�a�D��*����իٱ�t1��WaB%L3O9ViU���s�n���`��<6��z���\W��R	$hͯ����������t	;gh(�ј�'�:Y��t��h�M��IzFi�٩6��Z�sw<�7�9e>B�Ƭ�d�b����'�������,zx�8F�[��7�6���!|%3"I��T���To��Un"�Zި��C_E�,Z������1�W&b��4H�9(����+�
y,���e���[p�tL����0Q��d��ݛX��yǘ��r�_�Y�n�)��5>߷�m�;�xrW�ԘWu
q#:m>8kL���]�Axj��� :yFQ
$� ��u/0�~6�JV�j�B#��;\����h���4Yh۾3U�v�o��|&�M�#�
�J�W�N�a�3 ���j\�F�`a�Ƃ ����|���x%l;������:��ڶ���+b5��l��"P��\���,�.�+Z;�e3{V��$�K�r��6�M���D��>N"�~�J��%�MG<�d��D+�<%�KM�����R���ʝ�?����4�h�͛�>(�1�]i�٫�^�(��ɶm��b<�Y@L1
��%�w^
�k�^�D���b�d}1y��X06�Y�gt�h�R�
��,2��y�Y������>��a���W<T�AXlp��z$�A8��&�Ux;��f��bb(\ة���խb����~Ⱦ��K̘%f��!�K[��*ui:m��nRk7�i+J��\��܋+I�J�UFh��N�\q�@͏Ir=��	47�� %�
�#d���**��j�@Qa���_c���@��c��r�+����ò-}�–6ڲg�.�k㓟���c��.V�kh�=�#܃��T[�3�S�8��_x�dIL�0�c�Z����!��J�,kJ(��̜P�э��|��|��rw�Û�)n�O���Y��ҟ�|=�箕���y:�
t�p,�n�
��?���LA����5���9��݆��r.��!xE��|z+�%� 1e����z;����>V��|���}��AK-g��j~Q���V=n"�s�k]�<���D�O���'�}-�+�lD�%q�����Y�i���нe�M�6?�o�:�t��gO�{[Ӆ��fGl� h��c�N]�IW<EwBz)����m��?�(+*4o�?𪇚9e<�-g��F�FnK�CvԾ�{�#Gq3
�~m���Rù���v-қ[�A���B��ﰚ, ���6�'����m"0�$|b*M�j�K	AA0�S���,��e3��f���J)���=¢	��;@;_h�͇R��;�(6�&�(Q�s��HT�xԨ`-���D�h�є8���lG�f�D��sh1IO�ث0�n\N�]2�y>�s�i�o��܆:�.�g2cukrJ7�6�8��O�*¤��2| ��}��R��Y�����+�$Z/�*�|�8����%yuҘJ:�2>
D�1��<���뤌��s����6�v�7�l@!9���}�
S���Hz�<����&d�?��1�=���M��5�G}]��e���i(�������gԢ��r�ϲaҝ��y����Y0�/Pn��w����d�b��u����V��ޏ������_�ۧ}�.\�w.Gs��s�R��R�����ȉ'*W@|2��/���j��p���Um2��=Ynh�ԇ�e��.g$��'�D��*(��[ZR��n�d$�	9�~E	������`: �XF"‡��IMB�`�WIH�h������V��Xe��J"���|�Q6dh���WA�IU-T=R�O�I
�p����MfM.]]M�u`�qAc���k�<{{�
���5l�z���7�F��Fl�ސ�����qxӉ�Vm����w�*�q�Y*����r|�YU�޴��TۼIk`��Z��v60dk[�|oZң���ꮐ�^YJ?*$�AY�)1_
1>�/�/�T���K�?Q*Rq�J�(|��e�P��bU��|�e8��2ͤ吳��������ڒ�BAv�X�h%O?V��"˜zd$$+�9>�\ �.��/��"p�M-���K��X@���3�|f<���B��ql"��hrB��()�7�Ox/V��bt�%��ï<#M+s	
�Qn=v�Q�i����Z.|�[��F܁/�m���ֶ�eT/E��0����m�D1�A�� ֚�h�j>��C�K�`|
&h'|�G
5J
�h�\Z襙����U�cR�teѮFM��/z�
�^��R]]E��H-���� �0Lu���a��m'm���,�;E�Q��\�ڢn`)�q����BFK���Yx-�N�=׳�V��ɼ?�� :�i�*d�9:�}b�g��M��Ȱ$��B���Q/��Qю�s�)E��Q��U�+�B�L/R����uPI�D�yŻP"Œ�q
R2_ ���Ctj>Y�tI<����VA�]N�|QC����5Zn�*��h|a��p���ބ��H�%��uW�D[[O�g sm*�b63���
B-:@�TA^����J����d�>�A2�9��P�3�u):��ʴZP9�����u�''��ߒ�j�e`N2�
��&�d���Q�� ��\R=�	��	ni6��������d_"=�.
�U$�_��F�9�w�3��f74VV6�D�����f�.���xS1���s_�⶛hk�Ę""J:?��aHC3QY��Uv�����M��hG�%�+��KA��R�F�4�)�q�@��E�⽒ja���OgP9���u�!M4*�8�614.�x�b!C��p��b,fh��K��Ń�^�/��U��G�E`�,Y	�n6�.[�l^1>�$	0EJ��>�m(�
 �W��z��I(���0a=���#ʊQ�����x�K�p�py[/>7~n'�t< O�53�U�����膓�4�^&�7|u
����J���s�s4e�p�
�|��B'r�:SZ���N=_tV�O
4�xn����W�)�P*ؐ33�x���4��|h�k7Ic�Ƕb$�:��-.�P��gn	8���-;��?��C��H�	L�o��P	�:�Q'Ó�#\�b�euW�u�
ӾZ�L��Eyߗ��ݠ���z���H�}Vq4	��<LX,$C��Z�tH��߳3f��[V]�˂������~�H~KӉE�؂cQ�7�0b���¡8B�}�>�
1�A'�����Kc��pf"�,t
�ģh�il�qk����y��
���1���%'���aB.
5=>�����;	n17��؀�"o�4�1T[�y�J�I�X��4��o��?���� ���ƧE	�;�n� ����QX�L�9��>-�[M�5�`_�u��*��h	Y)A2:Y����8��ί<J�Mu��?l������X)�F#A�n`��%M�'H[_##N�I�d\���a����VN�&l>TUP�Z�:<�N_p)��p'Kb|���"��%�P�͡^�/�'���7������mE-`t���\0�ِ!~�F�r��8@)͙y2d'��k��Zh�Y��>`'�y
��sT�5�ḗ�YՀ__�$�+3NR�I7��O�R�h�Lj%�)�~m+�Q*u�gƒ�5�j�6�t>����kU�d��w�+�4֢G�ި�'�	�u���?�J\�=�s��|Ե���?�	����DS���dcU?���(I��40�n�N�Q�Sr�K�:8�����iaO>�+�a_��:z�0��i#�wGf�?��WY�uJ{�]%�U�Gr��c�R���e�S|�T��5�N�0�X�)��"�c��w��AL��z�^�,=��/���;M'WM�B8vIw<�G�����5F�$��7]�d�{BNJPq>�*'�� �T�}��Q�%��N���(��p@�`���1��lA05�w�P}��"�6�+��F���������M���jgʅh��x̉���"��x$��?�g��we�p��r��7S���WQ�Ɠ����4���X��ؒ�;p�6���[��K#�cZ�������j�^D��w�Իp?�W~�x�<�_�MP�W��f��f�?3�M;�	z~s7uC�a!*GiFbWw�tI�5�e5��	DVR?G\9�����O�+<\2�t(�n-V?�^S���B����f�����a��fV)3����^�LjՑ�!E�����������2��ԈA��������4�w����Ĵ�H�ފT���'��R(����d)��2u@�FZS÷�p^�҉.��U���`dTKڮ�`�Y$��E1Ł����R��u<���r���5Jφ�4�lD[Z��x�x>%]C���n���R������EϏ�Zm�b����w�s�y>>���st�W0{�Q
����	U�J�ɠ.��$pl��d��0��r�@�!�����`�مp��;��Aa��7�=�K�Pְ�}��o=�(�k^���}$���Γ�#ʻ�TX��+�q���jp���It���Ӕ}\���&oPt�Q>�Jn\��_�n����f��q���
��^��]�j�B�<�8�n_�$�@�����͝��U3��ZHۓ�Q��q&m�8fY��+��wγ�
G0�[X�z2-�I}�u�lg����N�gg���L��,k��Z�-6��+���H	�%�~|\��A) #����D&�lI$�o�>�i$[�Z�d�'���Py;��1Ί��;FJ;Cу]��;������^�-9�Ȕ�R��m|�B�4�hI�}���9SjR���m����>8�N�l�q�d��\ th�W��cI����=\�NH�(���N�m$���'�����?��)���i������eS2vZA s�BB��Hj�R��AO��_(+�8����ty[[ƺ2ރ2��Nz3ȕ���<�x�5;u�����I�;=�S�[�VE�ڛg���ar�xؼ��%E.R`&;�������Gq{�(3�]�9�l:ma���VQv�N���w���#��i@�����P��q�R�Ԣ�1xA�QT0����[7�w`3w�v'/v^);h�/@���I𢘊
K
8���Ia9
v�,]U
"��r���[�����$$��`�inӹ�+�M4x�]iT0Z] y7����#ʵ?u��rb|��7�*�i�Aʩ��a�
�Ht��I�hx�n����w�n}���4
6�� �IV7�T�ħ�^/#�1�[����lO�O�D��X,G[6I皁����O@?Ƃ��jڰ�6����;�Q��.7\I[A;f��[�Ě1���_?�����i���E�c�	I��f��������(��Yݬ��I��~k���n>z�����ޞk���ހ��J��#IT�j����A�3��ҽ'n�H��	6��c2�~1���[�ee$�����o��&v���R�l)4���/uc�^���9&;R-'���f��6c�E��3�����SA�D%$Ԩ�0�h���.]UC���kI�
��&�&�NfL�X#��>.��Rd�a�
�0	��i&?��`�&,��#:��{�."rdG�*�ҭ�Mr�N�n$�I��%�i�][��M{a�0�� K�Ft>ޚO��`h�ˆ�Sm�W�My-ְ�7�
Ը�У1)��tu�]-p����e�Xg�r�PGq)r�N�[��^_�5Mhh��ۢ��
j���,z#ϴFсEG��~|�;��q%w�yҍ�/�Ef�%�pR�L��
N�}��s�䛶1���0�`
�}����"��=&u��O�*�LW�6ͬրǮ'��'[o����R�Q��s��QR$�j~R���gТ�g\Kl}5oQ������Hv��S�|/���x�K6Κ�K��{���i?��;ͺ�Ef�
���B:
����D��@"�辗[�4���@:��εX���n2wN����GMS��:ңؠ��0����0��g���f��Ǖ�f��| r��z�G��H��Y7e��>s�&����Iu6�ΎR��Qmp[�_��N�P�c�%6��e9F�tbT�(*=��J�%�v��D��L9[qn�f{������*�o�KҸ�_Ҍf�u�Х񫲲K(l�,�d)�m��L����K ;h6^HO��(�#�5�g6�hD3֔#��� �+�������^��
�+�
�m���_��P�GQ��Kߚ�@�t������)�H�W���X�+��ҳMT�
֔�F>&Pf`�s&����&N����#��|���W$.��;s����2@^�3��*�ڔX�rp�f[�mݵ��]TY�Y�j.n�b�1�Ӎ?��t���N�� ;�{�9}��W�	.˜��r�f�Ϧ�(PǴ�V��	^봠���wI�$`l��D���%*�G��1�f�zƯgo,�'� 0��O1��;�t�&v�<�ns4���A-׷�<�w�Xj�J���n�����o�B�/�Ƙ�r0��&�+�W�-�$��h?:�����#vߏ/�%�t2��Id
_A��l�]�O���CnbtmHt@U�2̝0E�aj|1�av9��F3Zʞ�*Aa3�R�5��t��Y��G�����rs�����+ZJ�:�7�IY An�e#��a0 ���J���曂�b�\d�:إ'M@��[pF[��E�I`Z��ū(�C_�Pݠ��x𰚍`�Y"��r��cϬ��U�W���	F��h��*[�u#O�l��8*�6���s��'e�4Řk���^�鴟�m*^I��F�l
�B��+N{#Ivw�7�'��ww�N{c�u��a�!*���|��ww����
m�#x�J혊���Vͪ*�G8�r� ����LV��ٜ��Q��bh�����=�����a��8p��������V��Ď<ôl�L����L�YC�H�81?4���_�lQ�y�����?'E�@76?769C�}͔�Ӭ�
�������K�[�M�=>�.�'�
Y�/(>'�����B&9�:e��2
c@�C3s��-X����.U�F3�g�iҗfK��_]�f���pi
J�H�;[P�?s^a��)D�A�+ۼcm1��dIo$��7�4���4�K6�.��v�Y`�d�[����L��Ҁ��J)b]?�"!^���A �w�n���}Q����ͷ�����7KSM�n0!t��3I4��B�E�M�pt��)-H�T5h��w�ƤX�#3��0��[ܳ�&��A��Z�t�x*�����p9z��.���*� ����w�yza�/���/T�v��"@�?v�ls0N�#h�G�,��گU��Gx-o*�I�.�+�*��ՠ���� i����ph�w �lΊ��z�y�RTa"q��8޲��-$l"�
0�%�q@0lE��ZR�i�p┢i1���d��6�m�#�V��>�L��i��y�E���<���ltR�;4�G�|]�$(�1����1�Ɔ�F`�#�
�6�����c�]��38phD�[|��]�����n9��0QdƗNߠA��GȎe`��4���&TMs��(ĭ��:�#��.�k���͟b�u���H*]d��<��"��eg���G�6�҇��Qi�lH�W����o�U�Av�A��%@��q0��"q{����P���[��2�5zK�"}�T��7Xy�6O�8��.o��Ni�����gWp[�-P6�Qu�Dڴ&'�9;����:�ߌ�b-c����i��
���@J��d���d(aհ�
Cܑ	l*1�	�� ��<}¡�@J�\�izA�=�AZ��.I��,P%�r��F��@X�1!^�؜2�u�L�^�㍍���M*“�1DŽ&c$ ֐�Kl��,���c'��eJ��T�j��\)�ok��.}gE�ANO��k�j_��tބ���O��̯d��Z&�Ҙ����ΰ*^�M�Gu�fU)W,];�ܻ
"�N.�n9�*�l`�Xt��g�����21f/R�)�, ��8�<�b�oj���s���d�d'���l�wG[��;��=x:��a��Sq�ȑ����*'(���腘��D�8'�j�q;�gy
*�>�(�hhC���S�04<!���?���~0�:Z̔�+�"��TR/;�����X;�\;�X���i3��QO��
�.��q�;���U:��ecň\]�W��,M7ŀ��v����,?���67��E�Ex,(�e7���A+��V
���7/��j]Ne��p�T����=k�O�#}��:|��Gg.�@�8��zcg�X�mNZ�&75�#Og�2cFF��t��|j�9�ڨI�h�]0u/ǜlp?��f�m(&.�e�%�,�Q41�f�L���1٧$�F�3KV��s�����|��n��o
>�f��`P�$��{�3�^X^�ي��<���A(@��CV";��W�Dp�r|�u��p���Y���d ��;rm�+j��ғ��
~V��uD�-�w�,����i{��M��'��槟��A�D��.���Z��'��,���f�]����4�۸T���ٶ
�f���NK0c�����Z����rBӋ!��]@ĭ�Erԧ��]1�e�0�&���ʣ]/c������::����Ş�_��-"�`$�8�
��q�����W�.�
�*�T	��"P���{/������Q�n�/k���V�=��T�K�)�a��i�;ְB�_د׿>|����z�˴y���h���|��Ok�l�5����w�:���P"2�>�Ί�B��_���&��_xf����I8b����}B��g��{~T5�ml�I���tsJ/Si�NPo��4{�Mf���_��%1�����VF�P!*(�Ƭ੺��k�SVl�\r�bEk+3��3E�ib[cޝ��
�K��f�׉�χ��t|!�xY��\O���QՃ�t�t6�|<u���񨂉3�;Ie�r���_V�%��/�dz��g�������i>���xw�K��_:XwqͿt*�r搜�	;Fĸ��"�6��q�aPi�����RJ��R^�Ȅ�.�S#�3�= ��E��6�'��,ێ}3S)��iRk&��;A�L����M1���>:>�G��g��AW_��:H5��n����yd���R�T5�P����n�vUMFc�,�w3A��FP�g����?��utܝ������AW�,瀞Zs��4�Q��-�d�
���I���1}��4{��ͺ-�Kq �Q�-D�����K]�!�6��V�/�F�4�CǮJ+�L6����Sw�0����r!�ݺ���]�'��o�*�W8��BS�ޭ�p$�"N���=b;���Op����Bc�Xv�eS�cw�h<��
��.��	r�EL໇i��?U�K�J�kW�D�$�e陡Dٴz�����?F$�-�b��a9���ŃL(���-l��;=� y|���O� �3���af
��SJ�anEP'�v��l�pI�4	IC��\Ѫ'����(�^[�<��9N�i++ˆ�eN0C�ㄡm�=�(u�h���&�v�,�F&��yk����8�;վp|�%�}`�o<��A���_��Q�x��
F�͗/L~��M;�Y>2���	�C[h��P�pj�.�L�L��r1g��EM��'�.���HS�B9�ʞ�.I{ � :������9� �7e�O��]XRU���{.�s҄:\R
n��h��A<z��ǼB�Jt�	��lˊ���O)T���ELj{{�����<���3Ɂ��a� /}��-�Iᩛ�zFJ��b}:��6��);(��v��j�F�D]J��)�50t���0U� ���/�/�Y(3�-�$��f���R�#r��0!E�;��o�D�S��-8(q$��}W���K'c�#�xC]a�h��|t�峼V�V��p}=i����$M�o�I��d���S�L](��F�D�]��*����Yp��N/4��>���\�cA뵰s��l�E;	�co�˻;r;���=��aO�2�<2%��|>B1
�D����^��oJYT�-�HԹ�?o$x��?��~�A����3E|��������o�Ͼ}��)~��K2���{��՞v��(�8$j���l*�i�ܣ��S�����>�d��+U���/(Sv��x�#-�542����q�2x���*�V�Y6�taLЫ&�Muq2�B-	RTU�x�����:�ԋ�c����$�uk>AH��e���d���ugh�=�da�c�'1&���09��f�bl�rŧ���T��w.�[����n���;OIN?��&�z���*�G'0�v5W�pz4�w�A�j��Y���S�mU
��l�ou��J�q�&_˹e3���.����c�>=�}1��O��ŋ�K��D
���Y.���l�-�ԃ��(#Ƈ�r�`)�z���G�/�è_�47ݭ*4��{��!�F����5_)�+1��e�r4�S3�k2�Z�V��"dУⰢU�X�x�I��GS��x`�ڽWi�c��n���b�=�0W�UKR�66���"�A��	��r
{��iͷq��a�v�'q{�����%�pR�2�MШ� q�L�*����ٝtza�6w)�u'�AՎn�6�)|Ž@�Ŏo��57���F��޳
���$O^�Qq�Z��^��o���1'H6�t�
��p��R����p7є'� �=�������0����˾�{1Ě�ΨEy�u$�JU�^��v�w��

�(8}˥����������k%����ID�'Wfp��c�J�AyZE�2��A�D�WT#���ZLL��[��9�G��D,ŷ�џf�ە��l�o޻w��O`��YE}���Wv��{�N��`K�e[��	'��n
c���C�B���@�7��9ԖIa׋��7ٕ]Ew��cs�:�4�X�[�7D�z��c�A��0p|�	2��UϷ����{kw�VIm��%���.F	��ԭ���=������W��1��-;"����JO��R��MOs'�ª�i����!�fS����+nI��-s�Eik��L����1�����j8����6ri��J�.��A� ��MB��$��b��ɵ���9���N�B���+o��*9>�:���M�?�4>�H�/�r=�S~`ںX��v�Β�/��{٭��;�w��?v0(6U��>J/�����vCl�9BQ�W����B��>�л�ֵ!��嚸�:��h7�{ ^��Fە)��W�p��K%��\��8����{G=�(�w�/0ח���̬�]q������);��vH1��{��
�7��@�)��GxƝ��\
7U�Tl�ɶrD��k�Q�慄�,d�F���&ÇW�@�c��#h�E4�>�Sf�s���c
	��X1g.�R�4�]3�"�?e= �V�
&�F��e:&tP��Ëa)r�3k�`,��΋�
?{�����s�cZ0.������:��}�z�ZnI�����B5�V��v�{�
&�x�B9��]9��{��v� YO��ֽ�p:9�ҍ����n�K�P2oc�X9~d����e�y��
2�	{��@��ك/���T�2��#�-v�	�f�-J��Y�p�d1�m��1ط����n��<��gi�}�-<���ɏ�x��bg��4{R�&0m���2�5"�t��A�P��X�tH+ĖC�m�*Hŗ��(u�5F�|��@�G���7/�6�[����ŧ&���R�%�i���+�yyX{�H޲&�Q�:|wѩ��N��?�\����wS��s$�Ѫ��$��IR��)fע�k�����}����(����@GX�V�Z7]�0��9&*�T����/����Jj�a��,�b�$�U6�mq�)�����QC�(ܮVS�
�](�3�}��v�#ұo��8�PB#�DY8�O�/�z���~�/N$t�;��G���Rb����ԋ��C[�J�_����_�f_�Ñ��J.=�x9�����4[�������&��$�������e���YQ�ܡ�M ���L,U�
�0������d�h�F�d�M����~wP _�H��ب�WS{��<�<������Y����S�Y�Z_l�glɁ���1�N�#�H�|b�`q�=�ٕ�ûv�y������K�u���l��1:�������$za�q�OA[	�J�6Q�6�*���k^���w��8$��,s����7�{H���-`F,�eI����$s��!3-��ͬ
���X0�$f��z�S�d��j���BP*#sNy�2��X2��
iazWO���~8����z,�ì{�������h�@����p2E��K���-�I[�����1�C�4#O���xU��:�y�kS����*@��C����L���Ykf�u<2?|�a������TTW��AOh�پ͇�t�Ӫ}k�v�d�f�\gS�l�9†1���+���Jh�W�,슥声	i�a�If�x_��
�+�y�o�q��:�

p�c�>��^8�&�M���d#�������%�#�D�<���b�0�me?�A���`x�]����<4N��S#��1�5T�z;UM6ۺ�9��]G=�.�)�&k�]��&�jT�%m[M�X�,C�ª�� ��aFS"�z<�����+�Q& dL�.��ST��eް�Q�
RD�Lu4;@V���=ŭ�
��4ί�\c��u?��x�(zo���b��Vy�L��me�u�]�ߖx;��A�un:��)�
 �@S�KZrt)o�����;�ւ=��z���@b�R�%�y���*|vͰ�>sc�~o`��B�ޯZ����H��6̋jl�_���C�hÕ��WRx-i./|T�
���ӵ�w?�G��Ys��l��GU� ~:�@�Ég?P�F?m$�5�~��z�|vt�l"����\
W!���I�����G�S�m���f+����P4̽q&)0Ɓ'
�P>�Ò��O:�<�9�J�`�@ۇ�O��3��u| 󡜮4���%Q��W=HD(�֤��3~�|���T�%�OjD�֨��.-i둎?&�@��dnHuZ�Z��1�̈́����y�I�~���y��1,�g 6�O��sp�Г-8�Yd���9�b�oo��/�c8�'|��"ߩ�2E��(�b-�o�0�C,Ŷcm'9�>'0��ms#�s-�e�PN�1ò��ќ����1�aE�i��`��Zb�i<��+gf.�� ����Tx3����Cu�bDy�R_u���V<�璎��~I�>��/��Zm�	�pC�l�nu�-ob�H��&�XF�l1�ZNS��F���A/��_W���W�%脿Ҟ�����2��K�J�O��C���E���j�
K�˺�vf�����V.גJ���ehW�}����b�S[�����4{C�Ԓ{����S�D��*�?lsrb-iD�tD��ϴJ���Za{k����+ڒ�/�Kqݝ�� ����n��ռ*�QL]�n+����"4����p*�@�*8���F$���,��q�(�n����Ĥ�:��=���?|e�,�e���כ�������~}�~U*u��5�yw�v��]�O[�Tz����U�2E�,?[җJ�Z���T���A[���}���/?<��ё��
�k�d�x� CL�{Yaĝ'�Ꜻ�yP�I� �OE.=X�K��8\�v�V1��+uJ~N�u�,���y۱vW	�ma�c�����S%�A�H�]K�+��v��r	EٴM�(��W}�i�����W�:dQnb�̡3�vWm�~����#�
��D�' �6δR��)���wt%_4�5����V�ԋ�h��]�$�^��{�F�Ӑ��e�^f������ؽ*S�@$'��"�F��^�x!س�^���t4^纯ɤ�JRg	hq�j�p��!�*�d&���1)��H�Ec��z�ɦ�D-#��C���JR7�j�Ȼ {>%��H�.�64�3�X#�D���B�FV�3�9�>�/����ݝ���r���.����L�A�^8�?"59�I���[[Id�AG�1��=S�U��N$�{�n�wL\�v��9F�v��A�.�
�ts�[u@���}�H^¿d2�Nd��R�k�I<l�ǎ:]�����oU��y��}�}�)��j�"ݎոo'Agk�7�c�$f(�
�����ꩰ4�V��i�c��u�F)8�c�Q�F���q�0q��u�.� �)�wg��B?yWO~-�'��ݝ��W���n�^;�q�xZ��o*l���dr�j�׿ra�/W����{C.x�S�Â��P�7Vy.�^_��ơ݊��XEҀs�̈�%?�����M�N�\�఻C�����&�ɝE ���/�_�i�<���a~�&z�3�9K#F�8�&��Nx�mq�*_阸Yp���Dȡ�����.�]|@�ҹ,ٻ�7����)�b��X�2.Y���896���&�x\w�}q,�R��"C˝�wi�Z"�Yӑ:y W@�0����7��?9����^��w�/_���W�r��c�W���1�rݗ�N�͒��NƇ��
Sp}���kI�?�n�݄���A0b9V����џeWD��x��uE�m�(�>�VglWt�l�"1y���ۅ��v�ф�`�b�!����
�{������|�c���Z�@iPΥ��������nY#�lu�l��B�{8w��N��W3��qn�Z�K�”~�G<�QL�*�>7��$9��9A�\��ր
���L�YH�X�L�8,_���A�Q�aJ��>	�1N���)��]�ܐU"9��R�|rIi��<LG�Y框(Z=�U7�Na��}=s�D>�eg��#6�F����!5Ǫ�u���x�Q�@�u�s�x2w��1��a"�;�0�\ͧh�Ɩ�_QDl<qLg4>e[9��5���Gҫ�,ﲋ���)��&�.D��c1X?�]H ��٭��1�ڨ�2v���'�“�
]�q�x���a-m�4�^S궸�n-NN�v�`#|�}d�=�:[wX{׸/�(���Y`A>�x�M%����L��l��r_DV~�q������.%���0�Ě`�EQ�^��p��t�Q�ˌ͊ߌQ����ш�$۷S�}�}]s�Ը�&��H��o@yC\8��d�����mm%5��F�{	�U���r�LS�/��iԟl�����U��{�U�9���bd�w0�s���wu�X�5aeƢ􋰦��R�<��P���S�y%7�����6%c<�>���Ѝ�?��>���g�އ8B��:Q��Ç�n������a�=�cj��]f�T�JX)wI��F��H7S}�d$H�bcy��\�2�{$a���ƀ�L���0��|�Ʌ��ݎ��T��d�	ǥ4�������jwϳ�Y6�S>��?�����MF?p�>#����D�ITR��O��7�G���Y\?�<|��뜥s���0���0�@��K�w�Hz5?)��JHX24���N���ո�rhш�I|<ߏ�eʡٚ>�I�}����PF�LJ�Wb��Z��O���G�,N.�k���a�6D�V���Uz&����{���&٦�|*ɥ�/.�����Ӌ���I����mdF|o���Y���ϼ~�(�Л�HR
��ٓR}��`�����ᩊ��	�,��h;���H}�a����}���B%m$' �7�ަRp�b�̽����;�'<��5���M1�63�_��k��I����w�&��������S�zz����j�m,sr�5?�ҟc�[���Q�� ��������ʈ���Uf�Y����˧�$��_��ݟ��di8IF'9'SH��8���p��l�5���"$�/Φ2���������T�^꽤��o��.��©Կ�6O"XSNf8QT\���S�'��Ծ	Bv�H�e��h�{����=ksGr�+�`T����C=LQR��]VL�r2/��\�`I���ٹ�U��%�\�����8�s�%uW���*ݗ�MUN\�T�2�=��� ��9�"���~�t����t�Kpuw����h\�!g�6��)�C]瞌�\*��8�8'�>�6�Oʪ��.v8T�9�}�
p;l�8��ح,���R����"|ˊK+�?�.#�+Id�\@��+K��y����aaa�A!H/�R��⃽�ҕJ�ޡ��S�D��F<��������c���**\�n���@l��=�4�++�w�?��s�o@)(++34�
R[���&�8]$�5~�>� &�z�-/�� �T
�CbϚ �]&i	��,��y�ɨD`V0C�iL�/zF{�]���q1���%��!x�i͞H��ùX��NO��N�9g:�d�2v����	�&p��k����d�h�D�4���1w.$�Lȗ�7�
�\(�I��B:���Q(.^kĬoj m=)+��3iQ"���-,����@�=g�|��K�>�*z�?���\pŦ���-K��p5�W�`��#zp�Glvy@9�Y�Q�-y��e0�z1I�6��Rħ,�����V7@�3Ӛ��IoX��5����a-]�O�7��U�nn�;��E���aY�,p_���U"=�0nE�Ղen�_de>U���/�Y�n�c���Ű��eD�~8��&Z"Ԩ~cg�b/h��������_���׵:�����z(	�����՚4�1����{Yx�P�ʭ�G�Ш
�!Q�Ν��.N&Q;�e��Td��M�/ʣuSW����(�7�{-y�ਘ��Ü�xM��P3���Hϑ|�H�y��Ϙ}|#�g�\�-|����[-�P޼�e�1O0�ɂ�d��W[�mle��j��fB+5�0�Ll��s6,���W��_y|����rr��\
<"
��,�$�\V�V��܋��y�b�T�Bdԃ��`ل��̄[��Am��!�c?���$W�K�&�e��>�8�QB��:�C��`<���s^L�W�hU��Vǂ��5���~u��1/��x�$�������&x��a�z�4maO6Pi=Ե�^��ꆺ�+Uo����Z$�����b2��^K�a(�\�V]/gy�誣$��4a�]��� �otsH׃��u�v0�_�F�jO'ZE:F���qr��P*ݑHY-eJKZ���T:���i�(\@ -1FP,!�R�u�S^J��$�$�@m2���K�C 
�a+�ݩ�1�ԦC��\i\9h/wZ
�Ϥ%b
���2q: �$]�3��2ذp�[G+��:�{Z[�ɤ(	��U��f;��v���o�k��j��fT�6V�p���a�܁���t��km_F~)V��!8��m��n��f%�*�sco�(
+I��!��2�ɴ��Oz�dt�����t
?�ݢ�A*g�i�ai�j�$�6À�'�#RK��r��;Ѱ%^oE��&/�*W���M�[�)��n�&��6΢#7���F��y��b���xv�{����W��|��_���ۋ�a0�Ğ�«$�.ҎX�p�G!�3^����$#9�x��R��?��:s
����P3�`�4nJR�>��7�H���Zph��4�%���C�

�ʪ�'x���뺊`m�Jk���F�Z�h���_�
%�8�]�ߏj���n�^�}��Xg����`S/sJ�������,\O�wx�r�}�Hc�2֥@�;`��
��Q��_��7�0��씊�0�2�Yr6uqb ��K����p9eL�R������q��_�l1�f
^9��u�]vA�1�eJ5�M�0LrE���x6�ҘY�E��ȧ�Dc����6:�j2�1A󬅉,q�S��̩���L5�pf>��q^�\�.ӕ�2&�:ʡmRgh���R}۫4�D!�kf���ԣ7vv��iE�Ç��&�"CΕ�E����@��W��<j�e,A�+}����/�ݭ��Uε�C��j�c�R6��Z��s�D���~�_Բ�2�NE)��z����?���0�/f�
ɒt���e�����T��W��~g9�(}���|b`��%0ݏ�P���bk��Z�H����O�h��˖l�eg��6���bq�w�W<���Ň;Y�:�ˁ2�K$.RFsuk
f����Q���C�9-���ҏ����sol����u��RJ��������7��3)�x&�@�6���`�ؕd��"��k�[��ͭ/�Vי���Vv6��{P�V�z�(�޳�{�œ0]>h��w(b�7>femY�N�����5�8��rJ��d=a�J�Wi������l��$����&#*��Q29XB����+Z�Ľ���]~��D�p�
���$kc�TTgv��x���f&^\z�t�R�n3qcM�g�C��!�d���E�n$��\U�{�۩���e�c#���aq�(�l�":�u�7�a�\x\���Vf+���jX6�[,����C��X~���(�5O����Sn���Щ�r�=ș��LfL��]a�M���䓈�K;�A�y61S2��Mͩ��"A�@_�c{7�l�K���!�Rۚ8j�Z
=�|N�XK�DR;��z�ȤI�X��Ҙ0ss2�m�,�jQ�M��u���R�,Cv=����mA�h��-��np��YޢR��j3�r&�vJ�܁�'w���U�\f�r���P���bW��o�X�#4�tR�Q/����'��t�pg��Cu��6�	XLo0a��`���N�c���J��<���|h�}���w��N�+�WNJ����0%�~ԏƾ��t��L��:p��雅���|��?�5��PU��4�G�B�Ȃ8�y���,�\��\`(y
rBz��Vv��_7�]!6eB��1�D8��l
G�Z�K mN}�5������
|�^�n�)n$=��G*���ӣ�P
��,��L��LDu�RC��I�ƶw���H�l���%�����٪�-P&�n�?��Y�B)������i��`��3}�;��'�GR÷Ȏ���H�4�)�{�W]b��+E*���x�* �*���O��B�h�S�0[}X��V��ބ\�X�N�-7L±����rޕ�#��q8�0��Ľ��$ba�[�J��X��oÀ��b�o�OF���E�j\q�_E�	��Z2�Y��J��S���Z^�B+�9髫��K���b��8�g���l�<N�uu�1+
.��kP#\��_�Z�M��*���Q�2#��2��@=X-�-��e�)N�Rn������>E�%@o�P��ݦN�e�;��ě΋b�V�ֶv�+v�H'=���O��S�eI֨Eh_�Z:�M��[M���l7�f�	��d�H�*�^��ʶ笔4UK
�**�mD	�X��l�e�*��U6���^/x�_�C(^�e}�B��
�@֮���+�W�e6�K
�E;�Q�37E�*�mZ�_����_ ���I�0
�{����Y�c+vc�R�6��5�
(�u�qj�چ(�]�%mQ����:��z;��
J7x��MQc�,�6�׶�ڡW6%�Hs]�4�SIk݆�ş��D��(iʒ6�����*�t$��jX�n�=��Zk֞�疜u.�묻L
�
���>/����ou���U�d�IPB��=4+M�~Q�u67`<��ߍ��k�(8
�����qp��ŭQ+��	��2H���/Lo8K�]�w���x�4��<ԉw^��5&^DΖ�Ѽ�5�'���	��g�,�=��-�f >q�jR�kkDb�/	��cI���KڛMg��uE��t��j,o�rP�wzK�bE#k�8�R�%Pw�-��p`�n$�k*�h&�hg4gk�����#��+ط�JD7V7y�͔�Z�Nf%�j�M����H�ǵ�>�LF3w�zcn2�x+H�.��h�J��MO�*���!Wԝy9�%���L��s��i���/`�/���>O��
���3)|���}�_|����w���&yw:��x��W?��Ff�ϟ��;ϟ>�%����O���3�g?x�K��?=��g�=�ų�X�;��?���}����~���?��"���W~�Տ~�_?�k+!
Syj`f�������\p$���������i�Ih��?~�����_|���9Sj6C��~��?��~�3+D>�M���x�ዧY���4�'����x��O>y��__<��œ����;V�j�t-Hpi.�m�|���v��`�;�2�,�j�P�).�~�؇�K�7�.=�tG�		?8m(y�A2��sM���G��WaVC�ވ��Gz.��L�c�z�l5�'pn�U�k�e�/*��:��0l��﷣�����8}�nL��Ѿ�p��Y�&���2J3{��9��1����=8��X�!l���6"�G}8�Ǻ� M�vR/C>D��5•�^8��_2|X�.���yl�ݢ�")�S�c~^,�E}/
X�<n���I�q)�x�B����ޅ�o�Gq<.!��o(h��V"�$��Y�]]�_Ӳ���Q܁	8|H��25��:(燆ԣ���lSGA�7TO��:'��9���~(d�α�x����D�R��S�r4-]D`�����oQ��z��?z�k��M�z���O
�B���4C>���w�1 �!>f�a�ږf�y��Tcf�(�vx�ϩ`Ĉ���`ٖG��r��O4���g�φ<�4[�����吱�EL�5�v��10�I�ێzճ��!E�c����0�qZi�֦��8��U!aՔ�v��*�\�Y�w-�����q��$�yZ�+/Eb�䪱��kbP0�N���#�uXH4��Є2,x���m�ƴ��U�8`7����ъ��("�������6M3`�C@r^��#�Ħ����z���<���вA�w��)V���V3)�w�V��V�\Ӊ������m�?�׹��0�$�q�J0�����j&lҳ[3]8��x„��v˜����k<ɮ,�@����7	*�[0��;¶טD��u-����t��Lᠯ�5ԙ�.3Y@�HWѶ8��@޼\بm���&����%�vN��.�.�(��f�
_'���Yu�Yr���c�؄������		R�R���Ab��Y�fL�~�9��t���˓?�E������$A��D00�2���kR(�=��D�ǡ�b��h6��.���v�]�ޓ�r�'_bޭ�Io���\˜�]�-8���P�)#$���2B��-#���-�I�ҁY2�E��P�sϤ��U�?
�x�U�G�}>������ww�1 ��td0������e�Ǔa7�e&4��Ί�#���8��xߛK=Aڡ��d��#hE1�	?ì�5��Fԇ͠2��ݔ�}0|��jp�l�e_n�2S�ɤgnrl��w/ջ�D	�V��:��d��0F���6\�-^9��f�xI��F9�c
c��r�|�J�%�K)��*�Ah��GGhǧ7.�S
���5�&��ѣr�),R R{��,�L�M���v�>�%�@J|ٳ?.��<?Z,F�C�I�4���
��c���8���F20��H��D�	�Ef1�pbF�g��`�VNσ�iJ|/�ʇv���Y���lX���U6|�����Q_kA#�1+��.3�R��%Bv�l��De>�s�[�ɭo��Z����"z��9�k���t3G��*��oj�Y�P!5�7a3�[�'��R���K)`pC'�K2�M!gPk{�ƪ��߆��7���`�߫�L�̣14We�-I�B��_�8�rL��.�&����S�2�f�.$:S��-Lf�b�N}٢5�/��E�H�g�y�p
;����^�}���B�M-(I�^=.xmA_>��������hI�c0�<���y�jv	\di
#g�x�S	��Ӓ�����$��[�)@7�F7�LKLc�U�e��lKU���"���<r�|�V��6=`0jI��(���Fݴ��|���/��>:�X��^r`׏���VK5��L��eeku�!r�a 1ESVOL��{�֠;��(ɒ�����p���|�~��M@�)&�؄�*��#�4.��sKť"�n�p~�d�,�����~d%��?$Z<��A`�_jB�/��x�\1�5	�b�lR�D.c��ZI�t�������aN�y���C�f K��Y_=-:�lmL4J��
Gc<��kà�b�Y�����=��w�~��!��E��`{�_���_����Q�a�/�F��B/;;Wwu�!���	8E��ѓ�Q
>q��S�z����9��6�.����F uM
@ٹZv}���É��q٤ǩ������s��@a��)k�nH����/�]�w�BZa�$��O���Pۈ
n�O��N�6cy+R�
\>=��o���RdѣE#W ����^��)�
����PKEePQ!{�
�	�&pip/_vendor/retrying.py�Z�o����09�S�\��\4�K�`m2$io�� ��N�4��ct���/�Dٹ"�q�X���}|�|tD��N�"g��7�`�-ݑ�,abrt�ȏ<f�d	�r$j��EIc�S���/LH^��,\�	���t����n^(RI\��g��������Ŧ�8�cF�\�5�%D�_k�b�(�SXP�Sj�j��J��''��6�Zذ'�!�'?^�����|
�~�3&%����jGh	�tbftK
A�`0�
x+��Ü�"U[*�$\*�W�r�ՈZ�`1���������]�]����7?ߓ����W�w�於��~wuus
Oߓ��_�߯���	k�T
���hI�h��1成F$Y���<��>0�P<2��F�db�%zT��	�d|�Uzh�W8��B("���LRQlH��0zd0�%�iɟJ���W�7��.h�V4�<�L��(��'�+rB����;�ӽ	�HR0��I�5}�[�aN~��g���,���7�|u��7������.8N�x�sr|�|���'>��T�}��BP§U��2�P���SŤ6�-B�ي�'+����
�!�����@3Ն�J��Ji�iJvN>�ݶ�w���"`ƪ��]�W�i�ѯ��`F�$�4�	0W�I/�)�Xh
fd	6�kb�e�f���cm6��a�����dA
s�V
 D
	s�L��dI�Ǎ[Z����y�s0Q� ��:�s��e��Z3�ܭj��e�
��i���K�
igB9�N(q�(
$��@P"UQ.��6�-��|��E��U�mJ��f��A�et7F���?�d/��Gц疠�(}ڻ��`�m`��^(ęm�B��Y�Y��2űLԡO�mT��>�����8����߁}O!��|��p�[|�	�U��#�0	(�_c]����tŽ�q�Ѧw���Œ���\�L�ѬA���t�P�5<�&�!ҧ�p��8h�3�@�i��r��>tN�Gt�g�����[��r!r��=�64^�^�(||�lt�f
a��.u��ͻBh�Т�v�dY1��x!�E�Lt�5%F�4>���(���vX!�y�w�P����ԛ�^x�q��,Вw ,�a�����f�PRk	���]���>�x��4��|�V�J�^A����74��v��\thԺY}��N̸��o���^Ɍ��u��
7�x����/�[/c쯧���	�ri��
��T�/��^?&�3�Kز#�e��Ϯz�Xv�^{��S�pvլ���A'�̑N�m��+��Wx�i��y��f�f[��@О4����j�>��tgh�`�v��P��I�L��O���9�פ��9{����z���~�����@w,n_uX��A��do�0җ'P�T-�FZ'��tz��\c�k���q��rl������4ʾ>߫�V��)�A}m�Oz�Wi���>���ѡ�3/L5{9��x/�AAB�6T(A�M(��N$k�{A�y8����=	�p�+���A���H����$�7Η٠����	��xt1�z��I��o�?��:��{��i�~�͐w��2�5�I'�;A�P�|Ӯf��1h4{K�s�j�e�=zB}E�1��Y:&�X	{MNg3w{�|�J�n�ʳ8��Ѝ��慼���Z�1���i��c�o�aG,3��e
l�ߵm
�e�z���V:-��V�uQe���9t�Kqt0|-�k�pMe��
��g9�q5�h�H��}8��E�}�3
�X���r����F�4���k�
t^F��,	VC�%	p ����YYy7�<�j�_/�3\�@��{��/�E�Q�y�uN�	������9��N�&�
���R�Ր)�Ի��>��p�P빫�&0_�㴷�9�6(����
�w	�,s>c�j�`��Q���]��yO۸G����Y��B�m�yM����%K�dU)�|��y�M%�24d�O�Q2�Xw�~�s)D!Z�O�7��;t~�|^�^1�%7�xF��b�CNj�iU�_�c�b^c%�Z�zʼn�p��^�y�E�yy��i��4��E���Ǵ���S]1H(�t/��0�F*�j����Յ�:�4k�	�uDN^��6�O�u�U�q%�I%p!��+\�
���}	h����LvQG���f�;5(�^�8L��y�$nJ��Vk���5�Ek8fֿ/᭧���Ъ�ղy��]�=�xߠ��œ͋Z���Hm��dnNo+�^3�%�Ҥޞ��y��~1A�gU�
����?,>έh��y<;Вt'?DVx
V�:<-�>�5�v�<'�-~�����N��)f^�3�c~:
?<ڟ��ԑZ�j�g(��\�I�q�����.{I�';���)(j��bu>�GĪ<\3-v"Zr{N_�v�6�T7��4������a>�/PKEePQr�(� o�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ЀI��;yX�aF�(���:��A	�8싰=�#CPL��B.~5qv@y(��]Ȓ���獔��b'ʩ�o�Pj���PGw�:juD!������s�� S/���Dl�2��0��?L�1
��?&ޭ,р.�ƥ�	Yf�А��qx/��A�K����BR����;ha��bYv�Yb��
�s�1��6�8"6�3�{~��5��B�
�F%�����Qf�:�֞B�:�{&ǨD�uf*~liK�6�F�d
<�x�?e{*��F���"�H>��QE�9t��A�Y��j%̾�H�(p$��'��L�L&��b�|�i� Tè�6��S��5>MeX�[�^!,|1()�˽w��!��͙(5�,eĨ�:הZm�J����p��\R�Ak�����?S�ʶu�Y�$��k���ׁ€X�(x����
�=FT��c.~�&긺��u�f
��|J��Ha��Г$��4�6� ��^WZ�X��������`9�8�xmo�E�[�G,��M:��K�j����"@���@��ja��ޠSլ�&�`7v2m�^_��K�u~׺��t:3
�Z��C����
�r<�؅��9��`@��b��-es5@�h$փ�4x���4����T�a3%ꊹ\@
%�R�1__��� �$����0��t�����
�P��a$^&��y)�k
Rz�q�E0�~Q��F�Pbuz"�T�.�"��n�c����6�Z��0p�Rj�nO���+`Zl�R�גտ��=��5.�D�!�*i�f����2P��e�Ț���Y�f�U��9F��t]e!dw�˺jX�]�Z��
R)��Q�5����<�Kgэ��� ��kB�����E�P1$�ZWc���JV�Vv�*d0�_���y��#zҢFaġ�q)���ۂ��7'@��\�0e�m��j&5�TZN�:K׻so{4�]'�M�F��`�ώ"��UMcE�.��_LJ5Cx�/Hb���o���`���[,��{ܷ�
�R��}��1�5T���i�vh�B7l��F��8��+�I�e�l�̃�S�(������lwh��0r�
V��R�ٵz	|Gji�'�
�6H.EW�E�ΎS��}��m���z��Ej��F7��Դ���&J1�Vl9�g�S���-���SB��Z�YB�ű�f����W^��/R��V�YBe	^O���4�th͔Q¨�^Z3�o�`��i�v��e��C��#���}p
8~��E-�t�,�e���t���|���N���~�i;~�4��L�b�\D�e{2�|�F�r�� ~�"%����$��0��p�-��A�	����{md�%�.�t�G��<�}������Y�f˫���ϩL>)�|��0�4#��*��@��Q��̟F.�6@����W��A)��&��,��x���j�V�3>̚��zq4n��VDN��/������N��諯6B�s�H��U��R_Y�r�H�����68�pn#�G��ccRxT�ipJj�w�|�X9�<�.y��{���?R�C�\ö7ϲ%t��] �p�<����̶��5R�/>֐�E>���+����z_A�U��H'�Ҽ>]��\o���5f>��q��ӆ)n:�b \�CJ�Oǧ��+)d�B�G��(��ID����Z��&��Y��i3�h��k�Fq�A��.��5�*f��U%�P!������K�ܳ	4SH�)���8�e\Eh$��pIQ}�-m�"��80��Ԇ�g.s��/zhI�2Q6���0i���,-y���nF
�dx����Q��`W���7��7(�T����q{UI�#�5�0}�R/����fz�޵�jr�^�d%wl'M�*p}���+���ڋ�����X�ڇ�;m�JY��WM�L��p�3
�Ph7�5 � �o���gwG�r�S��_f��6+5rD)ZG}E��ҿ��hv�,#�ő2Əœ"w�gu��^����S~W�ɀ�Vݺ���}w�n���I~��~ �'$h��&�����x����Y�^�B��n�}�z�z�L�i���O�U1f���z\���3B NP��A
?�us���L.�ʎN*��k�G��!���!�)�`x�XQ�mO�]a����|[s�oz��%���Q��.�;;��k����׻�.^�V;7����4//}���l��f�6�/J��F^H3�h��]=mg�W���t
�w��\��`h��"�A�c6�mfiAD��U0�j�T
�|�F�\��z�`N_�� ����3}n�
2��@*qo�D�#�-QM���(�-q��9%���eSc�W��Y�y�t�<ڲP���b�,vhl|7��#v+BF��t�H}0
JV[�fEcy*f^�y��J���PD
��Bu�O�x$�,�����]l�����ӱܐܯm���n������=\KP�ҽ��v/_;}�>xMX<l��*o���T-ߵ����,�`�P������q5���
�
T����_�R��r�k[[}A��n�k����VvK��v���S�VK��VE��n��Z��v�HpOi��,WѫڮJ��z/^ʨ�u�K�06	C	�^C�{����}T�����|���4�����2����e
�DeoS�sڇw�ty�5$�|�3�"�?>��n��5�>��\:��s���[�
�W�a��Y�pq��~_�l��5�n�؊��4��ˠ~�w�g��V�"u}J�~\r��6���ߎ���_>�N(?�y���\>����>W��7��*��&������m�!z���OP�y�gQ��sx�	�>�nh�=��H�Ɲ��~3�qtW�Y$�����no4���S��"�패k�^Sk�zT]�� �N�q�
g�5�zdͩ��� N���ŬU6	�^�r�жp��sp�#���-t�j���[�F^�:|z{���� ��^�"|�IhB��D�R�횅��Wme��c�HF���6Zt�0�6����vfW�[^�O6>S���\�]k�UMt�[g���ނ%�ͤp�F_z�K��g��T.��}~���(�6��@�y�Y J�.�m�R�6�qކxzF�T?�!f��1.7����@إ�6%PU-�JY}�u�0vGb�����L�sI�����m�5+V�˺�u��n���,��(�y�.�#��DN�A' p�R;�bB9\���,��)�>%�Rj�9ؚ�_��#��P�^�8_��Q^�0k��roNtG�d �T���a~h��7Y~�9��8#����	�8� 1$���@g���ᩚ���I���
s�S7T �!��U��V��Ǯ
��m5(^��PI訃��]va���Jܹ�g?ѧޏَR�h��?7�*�dMgd6���;�D�X&���>�֏=�k��Y��,T:NG;
�_*��>�㯩#:��@�"���3�N�zy4���w�5�Jh2�2X�um���9K��}a�a�.�1Թ:^�6K�,F�
���0խka+�np��_�:�U-a��L��3��Q��J�u-��Ý�p�ږS���,}����p�Ӓ���4`�X��H�r�H_��VZ1`��RWN(H�!����O,�54������Z"�.�pb�h�c�c�o�A�����4P
��ݨ
���Ӻ����S^�=��;���D�=c��X����(��n�j�����e����eʎm-��;0����ob���
�U��^)$�����T�ئF��F7��$u0���M��!����	J)@��qZ�0X��Y�ą|Ձ�ϧ̺���}�&fi
%U�u��S��Ѵ�=}���d=}����e֯{�hz�����6ol��o)z�������9�1`��)AJ�%�LJQ����GH�/����~0�q@�J
M4D�\�|P��V��#_>Ҟ=`�!Z��eӛ��!b[�Q�{��9��V�;x�U�A�����!F�4�[>����Z�x �;�wB�'L�|,	��A�KP�n��e�>���:��R=�cC�6b�	,
j��݆)�'wn�!������ɉ)�Z
!�|�m�CJ��N�2t=i%�����H�<i�(�82�ܥ�')�?����:(��-ĉ�___�>��uk��F"�@�g_��a��/�qw�m�Z㗛�b��Qi	F#)�N�6��A�F�x��ol�O���OG?c�DH7�����)?��䫉�Z��Q,/��6����j��1hChC��])ː�օ4֕��r6(Akf�B4��r�NP>J�1N��9,}th�/�4YeeKե�D6��՘�"�\�Γ����8F�D�"n?���tn>�*���L�i���xV6�7@��Y�=U���☞��S�Zs�$Y���@/8Juܢƞz�LtHy&��r<徜��͓�����.�Y�Έ����zS���p��L����gv�u��K:�^'�1e�3���YŨ1�*=ā��%L�V���I�;���W��
���j$�(O��б�x���]cX��sז*���;Ycä���Ŋ
�U�݀�Z�P�%�uY�!��
Q,
��s,����@��H>�J�U(����8��-�Ÿg_i8�%�ʄ�e���pEU�f~�g�����4�V���i�n��]���!��C�[�<G%0�
�1�ې{<,
F4h��I�ȍϨ2�Δep4GbC�Z�B����wc̖��I�������F��8���C3��{�kA{�w��D�?z�g�>R����"�pR2Pr�8�"3�uピF��oȥ)��5��RM��J�j�E>�f�D2��:����㜰Z�BNy��ɨ�*�����q��_���5G�
k�ߺ�DrÚ#��
�j�-��j��L�I���ɴx9�9kX%������NrK1D��0�O��T�M�ޙ�v3	�<"�&k�hPmh�_����c6K�H��PhilMs��JX-&ڄg#W�("i]����I<m�A�!��f�r�d�b8J6���Ǐ�-�����y� mOlv��{��Y���z��iO�e��cCBL
��Y���L��9��"�o�&��&-���3����Rxo�ԥt`�|t�,\Q�L�t>�|{��ɻ��j�]9�/}\�{H��R&7�\����i�zc���#�e�wnnE�w�M����nntY7j5S��MeE��(�A�q@xsZ<S԰c�z&`�o⺹�1gpo@���p�=������p�����v���p,�;
�kO����R�_&�����r��^�uٍ��nA�|����v,��+�˭Z`c���t�jw3��ws��&�F��vD}Z)4���H��m���i��f#���~�0m�lA&�>����_Umø��m5�����`o+�y��;�3���~��ҋ��{�0*XS�,u�t��*9�e4A�4M��I��	��'��4�)�d1]m���+
�bp��i‡0�rb�GY�nD��#?4ŏ�D�K�?�G�K�#��>�3�g���!]�6���խ�����S�6W�3�����,g�s�cj�$2c/�69����8���B<G��$���O�Y����)��[ޠMb<C�dz��?��54��B�ĝ%���o[� l�Ψ�Å����D�b��ݠ��D����&�̩�K[hZCW�<��G���]lj��1g�O��
\c��&�>}4mWAH��R�?�dx��fK�3�׵�C�>,�6q������W��H�f�1�9J�	kH~�ܽYi��d�f�t_z1/�bâ�E�F��]/v��MG��{���S�,��W�F�0��*�O�:e�«Ch��t��]#?]�Wz���Ӓ��~|i�(y��6�@�Z��!r�[����B�)�dh�+)��w�Vт��*�u��2�޳�VÐ5Rx�9��"*���w6B��S��JGŜ�n��^�����9��ɜ]�>c�g�|��|�7�*��>S�Z�č]ވW?��3���J�)��
!8�No�]ҤEk�5~'zF�n05�Dv-�6p��&{69��s5&(�AW��3�txM��w�.�I�M|�aU�8s��ӗ���V#P*
�_��2�9�a�"�K�*�~D�żU�Ϛ��Ol�2%>tV@�[�xU+�ھ��i/xm�5���G�>��M�h�|ca�6W�T�3�z�DRp��%/-�Ud�ߙ�������b=Ñ��Ξ�<tʻ���jpB��*)c�z�T�=���C&�g��R���_���l���	4�9p�o��4��K�z���p�#T����O�Ue°fŖK�]
*���֍��a�,J���*h��f}���81���s�.��E�K�3�l��T���w) xn�JsJ�E1k
m0�~Z����zz��"��7 Y"tSߥ�}��+~
*��r�ʛT<��{��b<a5���\<׳�DH]��m��c2�0�Yd��/Z�;��-�|����D��~F�y�S��=5�a8@�{�����o��	��@� ���?��'����i�k�s�j�&�A����ډf4����>'�n��i�Q0�x?c�D#�u���x!��_�*����n�$� �O�J��-����4�F@k�iDc DS�
/UV^�E"j���L���.��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��
b�)�?+Ԓ"W[\oozE�ij�����eЙ�m�g
Z��o+�Ʋy�FT���T�נ:v,��h�l�t����uc��r��y�%y���g`�T
�ɐ}��t��PKEePQf8��pip/_vendor/vendor.txt5PAr� ��
fz�l'�S�7�:L1PA���a��v����H�9L��^J�T�s'��T�o^�	F�s�GO�j:���nT�MPG8B*B=àn}K�5��Շ@�v���~��3b��K֬�}������ϣzP�k̫s��R�l�"�
VU*�?���zjG-�V�_wl�Il'f�|�?��1�p���<�΍ BŐ���N��E�����o�3B�	;=�3���^{)�G��}��1�T/�a>_��W�K	����PKEePQZ���.$pip/_vendor/cachecontrol/__init__.pym�A
�0E�9Őu�NP�A�P�8��m&LR��7�)����?Z�
mK�$܃K��O$
Z2J=�#p	��J#<����t'�Z��_�q��h��Z�5�K]�	�U��;Jd?#��LΎ����k�o���Eؙ���R�f�d]��L1�!m����o�9V_PKEePQJ�y� pip/_vendor/cachecontrol/_cmd.py�SAn�0���z�C��!M��E�	�Z�D%�!���\���$�.2wgg�3���q��f�����Ĭ��x��T8x��������3c+{i,c7�w�zש���:��h(����x!ܕ��t~��v�<�?bAUG�!�Vd#x��>����=<��s������[C���}\�ۇ�@Nw�Λ5��R�sM^?@�WF�����-9AⳘě
#[9�n�f�ཛྷ��������N��t&��1��e%��Y��dfx}
�n���M�6��9���Ul]A��$��X����S��/6Q���2�,;u��q�����XG#F��{��޳`Xp���L����LC��=˙��<V���Q�Y����)��w��,�G5���F{�b�E�۴���,,������^|�/���E���	�B���6�ݰt�/�μІ|����#�E� ώR�N���c�?�`��
�3!]�g[^Ǩp�ZN �:V��N��bS�PKEePQGi�#pip/_vendor/cachecontrol/adapter.py�XQo�6~�� �CH�=�C��݀m(0}h�l�E������H�%:�& �D�w�}w<Z��-���B��}[�V)�I�[,�Z�X#��x��R:��Wƚ�W���
���n?��cݲ�T��JJн�=/�p�{9�E>��:�nr/$�5o��)w�|��S_��b�(%7&ڡ3'��z�`����KQq+�Cq{T�a�����r͖~{�>,�Y8�
��(D-lQdn�r�_·����X��f���LA�̞,4��
�d��Ɗ2��I蝙̿�`F�o���۳�0f�𭝧�<D�+sJVQ4: 7�ي�=��5��b 
��xq�
������(:S�e�O�j����#���N`��S����$T�M^GT���P�A�j �����X���k�{hh��ex��0ޫ���":�f�^�&���U�+���`��n����N��U�F��-<�*R��<iV���i��zܪw�O��A�]��՗x P����<H�m��*��%4�v栵�߳a��)3H��h������V�A6��1L�U��W*�G����D�Ṟ̏�Aƫ
ӑW���V[�$��m�߉�m���YU]	"�E'"92�L&^�I.)���"-&!"]CMbW�!��1�ȥ�kY7��cv�L����@�]؉?��3�"��54�*|��|�����mP@J6.���{�U6�Bm���K�aU0���Z�Q�:˾31o�}  �/�)`0&ܲ�8-���99Q�\��.���$��'�]q�9�_^�~~�An�ύо�~L����r��q�aoo��sþ;�Ȓ#��&�a�C)w)U�T;�J\��#����F$��y!�;f���g�����B��W|HX�����g��a��?��Cp8?0n_a�A3����+��[L��&��$�gRl;ĦV��D�녚�QBlU޹j�0G�V�#�1�.�<ap�rD@1�X�(c��PdB��
������HB�wÕL�D�ZG<�if��,�VWp� �w��RC��O��#7xŘCҀ��*(U�0"��s_uW/�q��|�%@f�4y	y�3jf���
q�����ws$��đ=�x���`���-ݖ<{8�oM>���n%t�u>���E@N����t��'�^@������]K�a�:�;��4o��3-�� 'N����܎9��ЗǶ~�*����)��D�����mF�'��D��]EҮ�Z�Mxьl���G�N|o�޷�7q�
3��Bf'��]�и�&��]ǰ�렧���o4��؉F��X����q~n�qs7��ErqL�L�[*���1��ӽ�����z�s|��z��’��{Xy�I<�WF5|�j*���5�,G-�6
y����+ͻ�Ԅ�#�{ʅ��`��PKEePQ�b�M2%!pip/_vendor/cachecontrol/cache.py�Q�n�0��+V�@J��H9�u�TE=�\{I��K+�߻�4��J�vfvf�e�x; (����?Pܿn��L�ZlБq�KHh���,�� ��Q���5�Ѓ6��w2��xI|s�&5����ū�BY#<Ȉ�iK>�(�B�{�<��WpĞp9A�����9�b"�9y��v�W
�	��AYG���r�k�'nl�-b�@Ug��.��T�f��<M��{��P/�X��$ɣ+��O��Fꂛ4�������dr��0Xv-�0?��z�8�v�ɛ:�9��h	Xzh}��PKEePQ��d�"pip/_vendor/cachecontrol/compat.py���N1��<�%�[ؐ�ʂ���)��\h.N��o�{��C��%������]�*��&[.a��r��QH���}b&�Z�m�1ri0��epۈ`��t<LY���&���#8���{��qW�H��|Ք^�b�l��A�������Џb���
��찹jg�!7��'n.��*���X�	�/%S�:�X���)���s��h��W%�-�v�[������$5x�9g��A�p��P�:{�-x�V��j
���E/v���yf6PKEePQ��omE7&pip/_vendor/cachecontrol/controller.py�[ms�6��_��'c��h��z�q{���x.i:I�~���$�|;������@$%+mO3��,���.� >�9[+Uebq��lU�B�sɪ�V<e˲f���������R�� ��"�1,+W+Q��m��Ug�H���+��e]��ȢF�L2�k��X��@��D��DYG��R�M����3�bɯ�)���E��(��Ό�W�����q&~k|�ꃃ���Ҳ��zG����s>�O~�x
Cj%e^���u�K�rq������������	��BW���<;#����/�(�M-B�7�8`�y���%�.�H�S�]�W����󂉂��*��xd߱r�>��bg��<: *�%� �S7j���LaE��2�p
7�:^�P��ߊ�	�]�eSIۉ�X%k��\sPU�B������̻9�._v����׷(�$��d����Pu�e��r�+OT'�WȺ�2N8S%�������l���5��(U�2C(��\B��a++ɳ�Tϻ��,���s���纁'��f�T�j�<)S.��3��T�i^vVNp��b%É�g�y�hd���p�a��`�s�l�hʧ/2>wA�-�OON����l�������D�����}��t�:+�:�LNYg�F
��+�h�?~|�zLjL^�K����]ZS�3� ��);��u�%ˎ���c�+%�">ن�Yf�B��Uk�{��<��cX���3��H�ޥ��p���v0��nG�w�L�[�'058����|"g�*~d�)+�bd
#���5[p=w�căn�P*V�i��	�>�N�S��I��<j'��k��~X\�,�6�~-E�8����&�A;�	�i��=g���q;q=wW:p����Q�a�ڷ�t����7Qkݝj�P��$:~�:���������|(橨Q|��r���xHyZ��,aM��2*���Z��q�L�vz��Pj���z��<~��+\���a��L�c�ϳn��b�`�(fKH��Ċr����8J�I���0UDž3̟Z�+��R��>18o��������f���A��߃T]>n�_Y�@9;����dn�l�\!~	���Xb0�_R�]�/�`2�v�F鬄�Vk�H�z$U�i0�#�	U�Lv�
{�ؐ(~�j�������]��_L���/�ԛ�[��OX՛�Ԧ�R02)���M{y����?��M]������Q��*�WC0�6��<}uL\`�v��=�f����fy�L��a�nьC���kL�ۨ�P��E��!GF��E����h;O��I}�(��$�
�n��wO'zj�I��}�V��-�`}?���"�V�:WޞA��	�7s{0z�l�4>j2H��^���C���u�K͝(�돚Rl�?䭪�zME(���W�+����^?���uZ�@`�E��#�����]Yޑ�W(���Ѵ#��O��ʰKZ��B��fe��}���u��e؍�;�����K�:�v�3���`�X:�
Cl��s���7zW��mA�^�Pc�ܴ�!�\��/�̞Q�9�][;d�.�}���=��Z
�ae\I[�>��	�@��:������3&��#�`G=�T�;�Ֆ�
"�`X��1{���{Xstt�$.0B@eh����YY.�"�8��L���e�!���A.��n��Yk<���3,`���&��{ޅ(s�vp.��[���� ��8R���(eG��]���KqƢ0�8N��t�ԫ�/0�
�꜌��8�l�9��pn��Ë�v8�^:�á��L�B�o'0Vs+��uJYl�a�{ע"%;d��h���B���g6`L"�(P��nG���F|���
n��t*�Ռ2��ޗ�p�J1����D�PX��Rs{/�),M��&�7m��a�����,�C�#�ΐ���yGN�<v*[@U=��i^�y����u�3��I��i�D��R�{�t��tbCG
�h�tH P�4���M�r�i���{�
���	�z���:\�E�ۖ�+��G�+r��^�m���U������F����IS�`��̀���.6#�[�Gp��1���@7qZ���#���^�`�!�Q���ɩ!�+���|��jc/*�D���Yg/��e���2F���f�(ay@&!なz�sZ	 B�����.�@G&8
ȴ�h`Z��K1�K�\(��%��n6�R��:�(����y&���O��k@����C�̂y��Ve8��{tf��vx�[K����Ƭ��Lz�Wӂ�
	��{$`��㏕�Ӡ�<�X�_[C��}��]����㤝	&��9D\���a߫
��q��QE�v(��~�0�留׭�j�mɕ� �[ �X�3�# %�1G�� �ֵ����q[�Y����^����6y�2�)+��~���s:���k4e�ߎ��t���@���{C�`�ޗ7���/��v8�+Zž��ve��'r���
�^Ȫ��E٬֮|F��KzWe��1\#В�`}$i����,�E�=v]"��
/?�9
��҂�S`�
!�$�1U�<�y�
2�y�\t�_cp@-�UJ�D�%yN\��<B����2'"�5t�"�̶��vu��ò_幵����騻
pS��j���~���nn���S��=��c�����|J���X�Y^�b)����ޛY�O����!Y;�]�(ޡ���ͭy����f;e�2�l;_��{e�ei{��OXځ3	���v�.���r��b8�_�\��������c�� V̙�nU�,г3 r��P�q�jKh��>��;��VLI���&̌O�u���&�ٳ�0`��nYnG1�m�sy�8�i�1|N����
^�/kb������a��R��/Vxj����׽��u�be�F�ű�݇+Gq=����#��T�cɁ�B���TK�T����3Ё�s�CLމ
�8��'ʃ]�>iO�^�	~b�͈۶�pU2��pӧr	�BVQ�d0Y�6����\2�	���HﴱoLI�
_�e���o�1�?v��c��JW+�|�g���p�?O�@>�x4�om0�:Ə��V��0:�Ou��t7��8��ޱ���:3�t{g����iMv��J��뎞j�-����6����QuZ�X�P��[{�����v�/���e��m?�b?Űg#5Y:�����U���!�Hj�Kd�����V��&�dMI���rJ3�A�������݁�˻��AD�4�R��J<���ԍ�%Y=��>���+�fk$��o-�A��݇U#V���`_��=��h+�>m��8������KC
�-<����ʀ����3GZ���J��E��;����+�0����E�W�>�i#]\l�@A��ݫ����趡��q�k��Z
�M�>�;�WEGq�G`�|}�Ծ\H���hχ=3��i9����.�C��Iw���:X�A	J�<Y��#�D���n�'Ms����K��E�6M�a'������o�g��u�gy$�}s��}"1�������\�NW�W��r��~P
/zDLG���p�ew���f�����xZ)����.���A'�^�@n*�I�߽�.��R��-g'/Qet���@!��[�uh:��Ql��T��ی����6˩��Q���J�~]mL?�l�*�e�0CI�-[�*-�U��l�rK��|��O�D��F>�R}��@�v-�~�n[g��9�����ʪ��?��>ha=ڀa��i� ����j��f8j!�z9s�w��s�uT�ؒ$HU�S�TU)5�#H{I���w|,3���߳E�FEQDU�n]�����\�%)\?5��ne{�G+�b��3G<O��T?1�ť��������I�&t:út�ڊ2�Z��O�-�A���~O���o�P�R��2N�������ҕ��moRbvzrB�׆
#	v/�N�[�a��q��S��w#��ʓ�'���PKEePQ����	'pip/_vendor/cachecontrol/filewrapper.py�V�n�6��+�am ��=�!M�@��{�E�,�)R �8����lYv���!���7o��ߑ�d�އD?ǟ_���*FzR�VJ��A�=�����N��\.�O"�0��
~p5)jz����� *1�r8�ָV5�<�U
M��-;J�JԀ�H�ȈO#��#�>Q����`ڻ�.E�͈3����*�`*`D�f�3H:� ����gf0Vs:�G�	�PC����C(��P�D�૲\�E���n�E�3��I�*�M
�H�U�?@��b>�����4�\E��=T���8�I^�(K(@�s�W���h��_O�n'�y�'!8Qp��Y�;h��v�
�s7v*Tj�萵��x���c�.dL���D��1""�2 ��9Q��e��t��U%���۟� ����{A�?a��8�er�f0��B�a�*lY{��C�3M�쑘����k0q3����V9�(�����iY�y9�Z�3W&"�%h.��)��a����E�9��a����'��4o�
�}�E�:{�����4���'����&���;D�./����Υ�ļ�=W��8S���6�V
�ˇ�K�]D�zNj)��4�馉�8={�/Ҍ�C�;���u�b"i�VM���{Ẇ��Ǘz�kl�����Nl#�(��V�ge#���<oU4��_3�y��,��ˣ�Z�ojAu�8?�Y:�I�ãZag�Gi�`��b�l�|̀pA�*��z�����q�X<��-,�8����Jq�X���q�:��i��[�m^Ɋ&�_w����5¤!�,k�X5��>qJ}Uo��8�<j;�\Y-�%$�o6"v
0j�����A.�c�|�t[n��NV]���Y�k��ex����\��C��Zə�;����{��73�ɠ�8�gT
�׼�EyE��[���n�Z~	_���
�ZS�Pı������q����<�����7�G�n_��,.����
PKEePQ�%m^��&pip/_vendor/cachecontrol/heuristics.py�W[o�6~���T�=[�c�Ō�[ӥ@�n��b(
����
Ej$�-��wH���$N�Y�s��HZ�Bj�bFx�e��Ϛ��˥()0eQ�)S�}ͅ,�ΰ&#Tb�H�6�ߝ�y2���Ya�z˷�ɛ�%:AA�P?C���g�����	�u�z�^FrDnJ*I�sMdh
��Փ�������g�����q
I�\l�DW��B�"�u��-�5��q��i��C ��EF�Q{����p0�єa��X�3RI�4MC��FRc���n��_���|�T)��)�_��:��1����x}T�l>T�Tҕy��ꜮIcg�*�µ�z��%�y�*TJqM3�!-Œ��w��WM��Fy�u��ce*�D瑐��Z,�y��h6� o*��8:��h�&��
A���1��)4�)�l�޶"א���E%�eѽ�Z=�N'h���{>i�Z�|~Uڅ[c���ŠZ8����P�F�o!������l"8�p��5�[h,��*#H	���Bj���?E/9ͷ��06X�%��j[�Q(�q�;V@\#�[���M��q��%�>�W�k恅�4�Q�Fqͻ��V^%���aGi�Rr��}L�q!���Ų�I��-2�g������^��{88Ƚ�f�|��5�i��&�ߗ�J�W	T�.�Yd�����&������y�I��{r���2p>��w�j��zC0aW�K`^_�E󉝴Y����U'Ӂc?�á���x�uж�8��u,�a��e۠�Tp-�&��Z����gN���im������0��C��_E�V���1����qnx�$���'	�T'�+�px��+���!����J=}�<P�����	Ԕ`q�#�A{�`}���E�L�j"yUi�O����ܸ5�U��)��Z��tK5����M��a��EFsJ��E~k'�t3�/��I�َPa�N�����[�V*�k������6�GGёU�hҊ��Ő0V��#�����67�(��>�6��]�6,	˳	DA$�&L�ۨ�)c�D���S��Tş�*>[.��M�����?�������K� N+�R�$�Do���aNj�
���3��%>|��,��~{i]\p�3i�4�Tי*G��ZF���c�IV��"��N`��J�~�Ѭ���d��������̻�d:Bs�n>9��tb.�x<�Z�۟h�{g��53�oMo��.;�6
^�݌{�@C���݈�76�DO/����S�[��6}��3}U���J<j��[�$��
�D���w�}�X��i��ǒ�>�b�0&��9����\�F�\����M�ɱ�7�dd���N�Ӊ
h|�V\;����D��Ѽ>k6^
��#"��i82���d2h!p���O��~4�����]���¦��-t�8\����¾��68H\{}��PKEePQ�ȽZ	�%pip/_vendor/cachecontrol/serialize.py�Y[o�~�_��(,������10�^�}�&h�̓a�)��p-��H��$��9�H��v�h�Gɏ�~3oZ�i�Sž��p���铒�?�V�|��:ِ����D);�V����q��u�מ)�2����}ǔ?�n}/�k~`ox��Y!��j��_77?���V��Ћ��5��w�Բ�fS����o�v%+d�v�I3�����cp�p\f����	�QUp%�
��)��&�d3�u�����*E~f�5��u��?�B���{ʾi�0���8A��4��i�A
殷$��ݞђu�l���m�ۖl^`�A�?fe;��e�X-��L��;Z+��|����5�J&z��S��y�)��=p�@��a�Ϟ����yOJ)�5��#�491M�$m'l�4���*^к>�Y%�Wp���{��u��*^�cGۖu�k@����_�t�0ۀ�	�U-	RDj�� ,�!��p�_��~�B���V��V�*�'�O�(p�F��F�T�g�=b��7�Lqa(�k��(�G�{B�8f1.h}�'uAZ�rV��B��xw�Q�`��#��~t��>�lLsW�`�\f?���1F"��&y�,���\�#�0����>W���
�2>��t�{)�7�g��bĺ4`��	n�
�	��0��gK,8�P��q��y�y�5k�+pe	�1v���p ���.yU�9Q�0}d@AH��X���X��@Dʺ��Ҝ�
.iR��G����*%S辏Bg�e��
g� G�ʓx䠧|I���NC��*�p������>1�>�&]ϖ�2�,�W���"*�(1�.v�'�S���*>$	��@Sr@7���k֨8Y�&k���u��0���^P��R��ݫ����lIs�=AP2��o�N�Jxf�2=��f|
l�54�}G�;'щ1܂`-�C�� %��P'>�N3$l���|�pG�ښ�8J��:Q�v/�6Ż^������#�v�V��@�Me1���"5��1���mY.<q�T���g��[�U����8h�Ir��QQl���G��T�Bʇ�C�����%-�j�3�s�|Q,Gv~�@Q�clDŽߴ�d"��DhW(7|7��e%4�7L��� �z皈��M
)��:�kGH��2�:r����if��v��Y)J5%�F��k5��:x�u�[��Q��Q�ȿ�#�% �'2)�j�)L�����2�j��h�i
(I]A��(�F�,9@�^_ޑ�8��)�wd�oSu=��?])�	}��^�k�$8�a3Ł߃|�F��_��z�vL�+�|
��Ԋ̘+id���\���yZ��m���^Ƙ|�3�;��G�`CuHIO�a3����C�fgc�5��ȦE���T�(4.��)Q���g`�z��Q�X�aKIÕ-]S��t,t�c-gC�9�xS����GQ���:-	�����
5�#����%�X]���W�!�e�0P�u���������F�BaT`H��C��
oC~B�(c*KgC\
�!2J4䘪YI׹���\�T��ے
�[R���&��cH��
����
��J����~�H���y�]N��.L^����eSF
9<y)��c0B�?�*��4�U5X@�$5��x�T�$�����
����1��eޝ���ꮣG;��۱н�Z�ƶ�
|�����v���PK!��^���LX�,@Q���Dž����e��<P�,IC��6O�D7��(�E������P����@	��� 5c(?�"6ʒ�ί��P�
&�~x�cӆ�)�-�L�� 1����%�"��D
>��
RA{zh.،�*�kSU�d�Ҿ��"�p׹im;ܷf�g�=�j8`]E�'�3���-Y��a�5�����,�yg:�J���Ҕ�ѧȯ_,�e��S5{��Ʌ>SaY[���mC�paM�"N�$�m6h
2�`8��9�%H�+8s�2��h�ݫ�[8���[7��l%m����q�����l���z��7_��8�6�Y(��l��`09L̈́<c��bR�ŪьX�
�-L����fbM�ٗ�@�1�-��OoO�tL]�:��w�d���dzW.� ϓ��s����/A��3l:��c&�
9�,75Xr����ٛ������/��Hj�8(U�c	����:+�b��H�^o�:i;�å)9B�}�f1G�c��d���62����b��������8\�1����D���k�/PKEePQ�=����#pip/_vendor/cachecontrol/wrapper.pymQ=��0��+�N �v��p�͝��\0G�@�m����	���~q�ҡ�Y�jb@i��!˛�=�����O�D�ì�_��K�-t;[!�U����FH�X�S��yA	�(k�����
�ѩ=L�����(��]����,4p�ڕ+�"�[�4���K�㬷w�;��db�-!��5վ]�J�(H��e�c�[�\����;v!� .��?n�8���r9U���%�i��g�V�PKEePQ��07V+pip/_vendor/cachecontrol/caches/__init__.pyK+��U�K��I�ONL�HU��-�/*Qp�8������*�RS2�Q���P�PKEePQ��/�	9-pip/_vendor/cachecontrol/caches/file_cache.py�Wmo�6��_��&w��[�6M��
��Ң(Z:E�%R �8��wGRoV�b�b�G��s�O������(�f&��2�\��Yx�;�k�3�@ڙ�q��Z�;n�:��V���nq�ny6�z6c��%���R��.�VzO)Ԗ�xn��{�����g�9����q����b6�e���@�hHT
2�ia!��D�K�W*�Ek������*�vӃ-�atjɌb��	˄;�!����%0�2�:��]�n>ς�tq{���}�/��.n�N�%˹(���8S��x�g�$�5����
�9��K	���`L
���
��1@:�@D��:��kn�#��9�ꝋ�~??W�{Ť�,�ԫ3��rkȁZ�#�
C�@ITM���V��۝ο�
�j��0>���C�3���C�	έՑB��d��Z�ܬ��!��8���k����Π�_��mO	�[!�����z����q{^�Z{��..$��@�A�2(i�e ��\q�&��di�����F5T걯������R��k�Y5ƺ�:Z��,M�d�h�ي��e�8���v��h��p�iDW$ݏ�fHa��e��脒��BI�H�ک��)�`pTr�D�9˨�ˠ	\q�6�z��,�,u��XQ�Q+U�
i@e�PM�
��{An�|�m��j�B�x��C�e��nîE�i��4�l�%��32C"�6��l��aV���J��4d�zMNQF��S��>�j�
R;dSZ*�d���ߴ�NB��]QwS ��fנ!�M��;n�̗�[&4Tz�/Q�<�>�⥁�2"L�O���ӑ�v���:�0AYB�;_aFz-%���u;��8�ʁ6;F�
���'�/�E�.i+qk��@�U@�ݦt�uӎ��&��wJ��q�E���>���p��n��n��J<�C4�o>���V��3v����X�k�"�W�o?��;-��8i`�~��Ԏ�]܏��Z�g��R���4�r���d��|��ul��E�.
y�(��0�%�snʷ�©.���+9�\�<�J7��q(E��lj� Oc���������T��)����Nf���իߣ�8l],��2��F�AG�e�zs��Sz~�Q����>OU�\>���<�	{T�
�n�]<���Xamm�NN�-�
��	�Yc>q�L��O�1
��7�;5�� A�:�j���/���r�����}�_��7jn�����K��)`�}(`���*r����$��V����t�n��" �b���g^�4sD���h�}p�u�y*�>3�c��'�,�A>?�-��~��f��~<p�]�&j��2�3����0�Mk>�m�t0ԗ7CXO~E�xj^�ISt:���"m.��#M+�ӟ������g6D��a�[�d#d$���J��~����F��U	ş.,�i���-��������#l����"$���&��>�)��E7��{����?�x|����"�|�m��n��PKEePQ��A�gX.pip/_vendor/cachecontrol/caches/redis_cache.pyu��n� ��<��S"e<��^��N;L�1p:4
&m��3IJR���~~�)A�~�cB����2Xwr�b�/Vg��5����
R�0ؘ���M9E?�\�WM�VB�5|�u4���l_�>{���J5���U�a9%(K�Sj����6DBn2��,��dEi�vp�~��2�����7z���5��o�I�/Y��Z���Y�����s���	�ܴ�o��|��Yd�Y{E�E,5m[]Ԏ-zF��kU_�nge<�4�f�۽�0A�\�����yX�� �Ҙ��W��Eg����c��{b�+jv�UԚ������wLO�#����8�!F�;~g�r��f�B��:�n�PKEePQ7��@>pip/_vendor/certifi/__init__.pyK+��U�K�/JU��-�/*QH��+I�+)�Q(�H-J�⊏/K-*��ϋ�W�UP2202�30�32P�PKEePQ/ ���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�h��	pip/_vendor/certifi/core.pyuVMo�6��W�!�b�9��b�=�ͥ
��ͫ��mdɐ�x��%%���d=����/h\�����m~���(˲hГ�t5L��So{�w�h<��m�#hH�H;�5��u�(A��y��BKh)T����P�/��/q�|�s�A��j��w�w=$�����F�(�5�A�!���U[~P���o���o��W��Y�X~}z�c^�-vpܣ��C�T�;���O0z�'3��zkp
ۑ�pT��5��UCL{���дe�go��>�[B��CN0hӣ%m ��$_32eC��Zg�i���&�v+.���D��'Q�b�Xa���b���N��:���U�k�4U�V�8��-�f��ݥf���v���~(�>�S�(��ח�M�ɍL�\����L�1��8+$�u�νu��E��7g�$�T�|`�+�Z��M������>`��o��W`G�_���P��m�QI�i	y���>�X��+����{�JSҴ��"�wp��B���H���1�V�~.0S��'ϐ8e���CS]�D2�n�P]�]A������D���δ\��&���kN��Qc�+�9��],lI�>�
{��[����
a+�_��	+�z"*�R���6�kĮ�h�e��>5�٪�P����U6�r
��sˇ�8����tŔK���r0v�xE�
tnҩ�r��>�?:�.��Yc&0���y����-qb����n�e?ba����&DW���;t�m��2��T4<ն'^F1Z�s�A{g{M`�;r�}�V��/�e@�pu-\�r}�)T˘X&ͪN{k�3m�_K�˳Qq��⭥/ώ�/R'�"uiqY*٨$�U��^�����A�:��\�һs�K#��M��9��BvP��ҹ�����f����՞{�L���4�p���<�Lx�r��j�m���t�5(�3F>����7t(�PKEePQ��S�pip/_vendor/chardet/__init__.py�SMs�0��+v�!0�!�^��IL�)56�pa��Z[r%9���ޕ1P�1�����۷�n��W�m�(���ȇ���+���v������S5��L!���yb
/��$L�”k���2��g��_Ȕg�ݪD�
���*4Ȭ�s�`�Z��-
T,�I��yB�OPh���{z�)��7�F��%�3å��tn�~D�iN���V���nj��@���'�5��m�n�����E#��%��&A*��9�*�Y�;�@X���,/�ý7�za<� �YK:�G�(��9	SU�	S�q��O���]� �[�� �(��x
L�i\�F�&��d�.@���؆�VȻ�3�,$%��a<כ���^M�����	�G�� �e�_=̥xh�%�>��ixR�f����%�}D�:�e@ &~�Ԃ��C���0�R9p%���oqON��O����,������_F���dJ�&�(mߋR*���Cg�a%�%�S��ʸ�Ͷ7�AK؎l[,ڍ��4
�!ݜb�ު6��y�w����Q�m�D�����f=p;k�v�Ń�i(�%S����ݣ����*Rj�Ϭ��
��%�`�ri7�ri'u���s�\�ܴ���0Rߕ��V���k�b�&/&��RR����b����6�־�^w�:� �9�\ǿO���t
fzVhߎ~��\㡯-
.��
t70��g�wq3��]����C�\j$�_PKEePQ9���9zpip/_vendor/chardet/big5freq.py��]�%E����W��Z--%�ѽ3��SZآШ�UI�����*��~�y,j{�a�].����x����k����w����?��/�ϟ|��_�}�������?y��n~�=��n���o�����>yxy�ݿ����_�z���ǟ_߿x���q{�����E�烛w}��}|�Ow�{������7ڌ�q��͋�?�_��?�~�|����D��W����ǻ�o�^n�j���Q�i�_�Q?����[9�#��ͷ�}������ٞ޽�{�����'��>��s�7��C��my��o�W����x��=|��}ؾ�������T���������wwۛ��������ۋ篷ǻ��o��������/?|x�����_y���/c8����o��៿�f���M�t������W?��E|��w���m��l?�ڛ�1S�ё���l�=D�������;����xe��wO�Z��b��{����j����u{������c�/���6�C�}�
�@	�ھ��~~s��ϯn��x�O��˗�<�>��ۿ~���G_<���1���X�l�ǟ�_n1���������O�%>���O>���'Ͼ��믷Ͼ|�}�}���gO>���n_}��/���m�����3��5�g���&|��|y�����79����z����w��/��â��E~���k
_=���㍏�cB�����~x{���x��V7Z��ކѿ��v%����%�:>�����g�o��޼��(>��R��K�˶}�u��}�ş����n���6������a�Ͽ{E_�@�=����N&6�����W�?>�؇?�~q�*��~x���?|��/����˟?x���������/�ض���m���:K�T�|��X��Q껗Vϗ�^���q����K�G�O^��>�Y4�{�4o���+�_��~������i�������`t��F�����i���#7ү?�?���=��]P����S�c��y�f���?l?�SӁ��y���77?���_�z��G���'_?{���o�=��o�~��!�X�O~x��a�Q����z!�*����?���'��S��ּ�����g_~���O�Ƿ_>�ӧO���݄�,�������mtyܖ��m���6�zƏ��ۼ�����}{�m���֣��n��2o�Qz|���VW���\�۰`�Z�g��X����9��v.�\�m���9Z���M�[�xz�m�[��Z����8�-X��c�����8n�ŝ����V��~�<�/��Oo%z4��vk����[<����_�ᛣ'#&��g�}�ɸڝ�&���kw��->��;o�r�mć���o�b{3s��6�Sy�5�~È����Y~�Y��t�5ZcFJe�wgz�"�����0A��h��7�����X��c'�}�#�:w졸F���h|���y�=�nbz��<x`l'F:[,�~V�9���o��<�k���-�c�3����-�n�u++^��0g��=&����,��'H�>zO8��m�?�͎�I{���o��r1�h<vR��?g4�;X��y��l�N�f��׶ܩ�17a7�;���Z�!,�����bF�95��I�3Z<.��3.�h��>Ϸ�ig�qnJ�t��G��P�?�Îӈa�;)Q�'l�F��S����Q����&lЩ�+���9�M��h�%f�O�=ºK=c���nig�7�j���=�mѷn��Œn�l1�X�Rb~ce�-�
��������>���ob�[cVW�1�x��c��4�MwT��k��a{�kt��j�(n�����K�.;5�ߘ�X�k��+�k1��U�0��l��q>��ųʁg��1o�Y4ڍn�ӝ�`�Z�X�>������AW[�9<��;�g�+�[gC.��ɚ��]��ij0��4&9�v��;4��ŋ��h7�j�8n�
D	��<�~��h(�C)|'�nll�9YP<����5��<�=�mFc,,��ř�]��y`��m����T�4��h��n�ßU�KL^%�4V+��1��ѱ�xL�ky�.�e	t\ˍs/��Z�7�-M���w�1�XX����Gk��x��LP��[<�<	�p�����m�L�]n�:-:}�ӈ;8�N�˷�o��/�0a<���c�̯+p���OS�N���z=�]̴_G�H8$�V�`����g]�c��qt�:��`�	�w���^	SfFN¸�*:��l��{�u�5=�1�1#⍉�㭄���bHa@�u��%ƃ�)�����\2�[1 �K^��#���.-��xQ�k���=pI4�<���S1�Œ-�lb�,h���#`�@b���0M�(�.i1�������;�c�t��緩w$��1������v��-�X�y�E�S7��{�EX~{�\Ne��8�x_�v�C�0P���V�n��x,v/]�P|�<x|boX�a��?�>�K"�b:IJu��p���f��_8g��Ǣ�2�щpH���.� ���*���6C�����	c�5�u,T�2�X���E'��[���х�Lj���@��tgG�c���⊩��7Zt���0:�ο����n/AJ��$cm,&+���P���}L���n��-�&T���;�uΧ[�(A�5���X2�s�0�=����S�A��̀��}4&�ǣc ���8L�ʆ
[�v�T[c@aD��}t5�0qC<>I,��b�Vc���k.\=�%1,�=��.����������0p�Cu�po�0H��W�o`���n��"����-��V�f#��w�
G�Lf�#�a.	[a��k�\�5s��U=���d1��N�/ijb�GF��X؈Cþ�V��.)t������fJN>� ��Q��0�ޮy\R�b��?t�ly&�`�T6�[A��ߍ\9�������1�V�@� ;��OO�m^�"�
$���Iw6P�V�<v�ķ�`~͚�r�N�-:�ݩz1\)�IάWZ�v����V�
S�xu�g56������i��4�/���apD��Q�j\���k��l�Q�?,�1$r�XP|��	�3�c�܍1�Z���L^&���C�2��FBq���*&�� |;�H����r����u�El����&��������t�xQI�uY�g�,��<.)�q�1z'6d�<�Ly�Z���qߤL����ć�ᷴ�\22a�����Wt%8:�ϝ'<���$c�ISWb���P"?+(�-q�Z��������<�}�b�Y8��ɼp��X7���1�Eʋ6�&I�efD�J*v2�5Dt�|8�2��#���$>��^����9f��vIN�ؽ��I�v
�K��
0�v��p�����5/g�-ǰX{�!��dZZ�(�ۭ����}|.iWOV+:��<]�-�Y݅�ݞ��:�C���' ��!pI�&x�T6:M6@��4c�j�w�O�c�ӧVf)���|7aHܥ)s$�NlU��C�.�mA	P�e5�p}���%`�&U����*�1���D�0��d��?�u����'|�LB���t�1�����������
���B�5%~8�%l#�V&/>$�6��0��ğ� 8:�0�i70,�Q=�,RX�mAw�v�RM�!|�LJ��2ü�+����2.li^y�	_�'omĨ�.�c�9`@� �ĦN6BgFd��(i	�,���x2��nE��
�s�Y��q�s�}l�hݛ~]�O�dF�=�
\�aϞ8��-d
ˇvmd�e'#���&-�y�m62�𧮹���v�ć���Y%%#�(�|L�(�+���hRw�X�M�����A���d��
�p�U��u�'�]��ǽ5ir�2
ɗ��U�Ez�t|��K�I�Y��7:�$�9�n���d���.	����/�1	��[�9��w��t�V�O����J���Mt��v�����$���4�9_�&Fa�ڠ��3p�=�-�M!<VX�؋4|-���n��^���X :iI��Vpj[r���M�6ra�!<%�H&y��s���@zR@o�o`X�侈�>�|'��reB�>6��{��$�8�X#p	�d����	+�.��y(�n�M�*��,(L���m�����莶R�5�<.��Jl�A�������H��A�3a�BA�y�,ӀڅwH"nb&�:f�@�r8A.�Qji���`i~c��`�d�״�.������$/۬KL3J��2œno� ���,2�}3q��F=��uN��C�AzDj1��R4��e��Fɬ&��ā�G�@{����X��j��*���_p�޹�\�u�w
‹��5��K�
�ܢ�e,$[��\񥳄�$�cF'�U�$^����'�ڮ�
\R�/����-�#o��^���p��X�[@�p�^�.��[��%7�0,�i��lp<����7�C1{��7W�[\R�Xm��j\T�.�4">nH
�ةl�W*J
qm?���7�&�X �z�c0���f��-�t%���]K<6d-��Z�.ͳn�Y�W�e'��T�JJi�jAqoC���F�6iR�!ἲ�I|��6Nc	]��2�Y��R��E#�q$#J���	܋O��C���*#��j���ÍR�h���Y�������K`bc@e`&țҒ�%u���t���SbM&��T��r\�;���'A@����`�$�`��\Uk���v�e�՟�Dg��%pDp�ѐ�"���N��03/�ogi�QE�Y��
\R��#2L�����l��#g�c�na��=�S��/'���:|Ia|�b����؊�%��%��{����끉7A�)��"|Ә��)nW�Y#d��p��L&i��"1�I\Yx�,'3�q�|�pY�Z�9��l8\
�S(l s�U�s��-H�v��A/2	�.T0@A�p�iѽ9��doJx�p��ўv6��W\���
E��VP�b
'�����P��TbHs���Fjx��O�v'��2E��CK��ԂPş-�M�Ϻ�L��w��ő��RcW3z��iL�OBT���ؗ�-�a}
��
\Ҭ��ݚ���s�j3ϥ�����1��G]� �K	BQ��~DKr��b����t�b����
�x`���)�ӡ�$۝;�v8y��3��	�*�/�g
M���9�%�u�������q�Vp�XA�bV�/3>��"k�OX*���F�0�]�.�H@�niSb���S�;S��E�������@��ƽ\�—ȌS�ad����p�c`�N\YϢo)g5�R������$u���'!c(C
h
n�j� �ެ�
7Oh�7C���U_�C���ܽ��W�7�W��j�G:`���Q���83?�%��f�k��,�D"�!�HZ@2	���R�;�M�[��IF�E�+^,�8��@���Q��
o^��Z��,��>�=[��N�[����P�+�$�$��X��>���Ҟ��D�].)v`�Rg��eG���3ȊǬ�{�3�~�|�����;4�%���u��~�Du��5��f��K�:�x
���� P�*R;�W�~���hƴ���쐓���CKw:
~��]X��4GD:�v��<ԭ��s9Y
h��3|�ʨ`{�4��6�&ƄKJ�Xl��3S�2�HªG����i�{�"�=+��N<�:�xW'^`�pp#G
yt�H�p}��Ωw�M��`WPl.�7u ᰨ�d��@Cr�ZE:�4��]{MN''+T�� ��Y~"��.A�P�?t˂���:X(
B�n�j�������
�5*:����/!����9���8�[Xޑ2�"�'=I��[`���0���_��
<Y�/7V�`���J�!}>#�7<�;4��A�:�� ���=��4�t0�봿�k�\��tzc���BA���8�T�Klc�	�@{]�� ����_3�&�:o5G��0��v—�g�]䑢���q/80ͣ�8�����Ka��l�cK�?��%����S�*�,�Հ�.�NX3��J��� ai�@�w�Ӊ=c"�X
K�r�`�fQ�02ڸ���u`��ݘ�{�/Y��ꂊH��l�Z��`��ﱑ 4���2��#%��m�.����
M?5�IO��ړ�D�5��NL�\Z�
��.L��K:�b@��*�9�X
�(
��А�ֽ��O��fj�vսVձ8�)��FP2��p��ah ��E�2�4]&�Yϼu���P��y�7�}
-�&i�����W�R�sC�wb�m7�%��!�=I��d�ѩ�!�!xc?VHE�+�[@KiI�+b��V�vߺe�]%n~Y�s�(��8���X�/���p��<�G�&Y%ćw
&�
���/��K�&p�t�Q]h�5��^kI����w�Ю�}O�?�"�E�P�۸Rx����6���=��b2D4g�U.��&A
�Q�`<����	�r$O[ѽ�C�An�J��;ϒ%�X)ZF��‷�
�ZT W��^�5�bh�ة5N���]A�H��%��!<�}!� t��xf��K�����OLJZ2��S�$u�>���l�B �aj��.����~��ZE~����`�~�F8�6��q�aΡ<�f��uC�ګZ�l�X�J��;�����b�s�b)�G�(����k����kE5d	z���^N�Ad,d+����@M2̴��G��MS�	צr`�{0)$w�>��B)�`�+������*������rWK
�mE���¡k�ġQ]�ݘ�v��U�b��Y�XLI�5
�̖aY(��t0���iU,\�_ҥ�O9\d��?�`A�*j�17`M'�V��I��3��n��5^� |u�e��"Oo�"ᢅ.�$������J|kz,Ƃ+����nnk�	��u�z���,�<-J��o��h�	HGt�QR� ��kG���1[
LQ�7�h�ѽRr��M2>^���Q�F�c�N��v�v�ެW��K�θQ�Õu�.��*n�.��5��r3Ō�1�k]Y�PU�J�T�z-�5�Y�HV����z��B������H�GM>�R3��u�`��e(�6��5]dv�CEK�<�P=�1p�:�ce��K
Ţ��Xk�0�r?TX�F�8a�Ʈ�3w�!Ӯ�"��5�JU0�-M��U��F��T�L�n�^GQk�l��
�[��!pI�>��E�[�
1�1�0�A�kTs:���-�z�N� ��.�h3�����/�yP:�1�I�Jѥ���Ԭx�S�
^��e�^�f��"1
�Gc�ޱ5-�E�1��Th�Z䄫��
(�pI��C�d�|��i��
���eP�Oe<l��b0]��c�/���<��!�ر(P�fr`v�h);�er���#�\�	�vѽzv~r�t�fŬ��l����q�!x���aY_`��ʗ0*���i25�GΛu�K�B�f�1�Ѭ\��ɟA1ag�2�3bI�6ݰ2�KM�ʠH^�qrl�hH�j��F��*��:����9��U74�]���G��{��\T�Ҥ�7�/{@�ZH�+�B
mbc�����.���3[M姍����n�e�rнs\Ĥ�F[v��K��P�6��W��|�%@oJ��X=���j�&�����eg���:�!�P/���+�EN�ں�.i�iq��
��au���P%���p��L5%_O��;�'YvUjS4S�7�y[j
r�To���
�M^�Z7t�#��^bbdR��[�,Ձb���R+�4��kt�F�Do�ѽ�Can�Y�J�L!wk��b�6��$�UX��nCD��U�~�t���P%PA߅m�H2P��I�_�q�g5�(Tn%(��ݱ&F�=�1.���~�zϧ���˔�c�ZTxP��\h�f��V)yϪ�6y���-%��$M\(/e�O�zÁ��0X\�8�z�n^���4��1A���-�ycV�#婞��v�>��>���d�"�q��@
��
I?n}�؋6Z��Y�6+']�xt�+����O���D��1,�`߬�6�)���y6�A�>t�u�>���Û��t�W�tm��fkԇȻe�a��P�y�C\HvKNi��'�[&�P��Se�H��),�}����_�8��ǸY�5����4�ʼnc�.(Y���,v��}�t��L�j�3�^����GJ2����MDŽ��e���YE�:Z�5� �P���ؕ���0��͢^�Đ���S��"yp薈��u��
֨��X��/�/�Rgh\G����Ӎ�gݿ�{mPE�s��u�{D�S��P�-���Gh�*�׭;U~�sT��#�?�⟚�G/��mR��ΐ�v��ٔ۫�(Dm_�Z�+*���Z T"��€�����Qx�v4�u�H�J�X����hnM�̩�����41�$��2Gr3��S�~��5v��E_�YT���"5X$���zn�#(�(0=N�R�,E=$����|KE�Z��,5ԍ��.TQ���FA��촖�M�[������u	
5�z5�"rV��H�����Vrd]����'�?[l(Z+��A
U���8ْC�nq�PPY;<�o�(�^�Խ*��f�++��
�\��u�>4�
�m�dA�g���R�l\f��C�3MI��~��~L{njN��J��p���.޳�{=�h�&����<I�_����SH�>�%<h���s5t��,��6I,)���޶��T�T&B~nh%�w3W<���#���/�m�)
@��EC\C�0��̌���-+�t?A%�$��vF�j�T@�<�j(L�=��!8v�@v��6�?�wӟ5t�1R̚M����?�)�j�I�4����e�[��~���D�B��a��b�1@OІI��S\��<D�>2�%71A��
�k�ʃX�1j2&y4 A���cm�'�Ġ��+�=��\7u���,qK��|�6-���Ԕc~�sciBdH<�Ny�BC�:ȏ7�p���� Х��E���8U����S#�#�h�^����������D ���곷O���%��D��S6%���*������4=��[�)�.�/�CC%yL��"�?<�aY�v9'��֓�0^��<웓L�Q�9�ǽ��,V��D�X���؆�@�
5a��$�̢knkf�ƃ��@��)Ȋg��1G�zlC�ZqnE魩��T!�1V>�SV��!&��h_j��v�<�{����8�
���?R#b޿A�u�te#4��� $!�A�{Օ�r���4��"�v�]��HI�����La	w��3��TpK�M��M-��X7wY��0e��7��ac(�e�>�2��w�.����(-aGSG���o6I0����$�]�u�Q����W7u�����;cM����1Q!�ӕ�{�M�%����z�W���9��,^s�#�	��)!�X7U^wi��S�Y�&�����O��QIA=��΀}�O�"Q��,��DY�!�ο\�$���済v�{��F���4nc�;���V�碼a�D)ϋ4t��$fX�0Z	��K�<��<��v�R��yt]:�����yZF���
��!�JjQt�H�7(!n^ys�**ܼ��t̓�WE���P�$W��O�=1β���P�GJ�,�V�9�S�>��V�5^�5uҞ�˓
)$U��j�=�O*_�ͳà���5��q�V�)���9Y�M�5���8��>��i����`�yQ��6�e������T�5u�U~�B'pG7�]e�M���8�SQ�35�u����)T�fHT��&�p{S�O�2�߯vї��S`H��a�n���(U" a�uz���B�0pQ���j��u�3�ۻ
�S���]��F��Gn9��Y�����4t����y���>��ݜ�3��v�aH�S�R��Q2"Һ�:���-�{,�XL�H&��b��}
=[݃߄%���.o�f5�#;�<֣����ܩ�}�S-
�B��׉L#�c�u�U���]�N�/�|֮udVRAXr�Y���I#��گy���ܺ{2r$F�)jЇwHo�Y��y`�!������K6O
�J�a�<zS�
��a]q �J�,��R	7:kHh�1d$����%���^��R���r��$ȤzN��9���L{qْ�>umi^�@�<����e�)p�*Me�mJ���cC��1}��Bua�d̴3t�Cz�#ƒ�F)�Z)KJ�pFYV!H�f{��'
 �����нn^;�-A��BL*a��iD�Πւ?ps\��@����j���`�fjq(
�� Ɉ5�Θ��6yq���*17⧟D�:�#�'�H	�JU(� ���-Sxm�;��`8as�u�_t���T�7?I�UYPݽ **|��;A�x���L��>�'Hݫ������%���^4f2۬㫅=x�
�_��e6t��@5�k�l���JV~4�QPݷ�t7�ʱ���kЗ(螲�8dY�C�-:���,��'�M���YI{@����:l�̺��J�/�7ɀW�d��W'˼lϹ)���5u�yۀ'����݃:�h�
Y��=�zh��c��If4���%V���I{�+^�b�.�j��n�c�V	���L,_��]p	T[�l�t�h㪇�@4��(�@Y�+��μ�����#���B��<K#���J�]�2B����rS�~3ŷ�ʳнn�B��DIw��.UP���&To�4>VЊjX9<l�PK\��Rn�|P^�^ׂ�R�!�ġ�]\V-R"F��� ����/��-�̐�6rY-�64̃���M�p\^Ԅ�����/н��/|��S����>�D�Hu��$"qsFo2̔3�r���{�̦Āl�7x��D�W~�9�
��-0�X����!�ը���]�'û6�K�N��� ��Ib��T]�`���Su�u���LDN*�����Q^�%��
������ƌ����]�f8@��0����Q
-g����y�y5�]�|�r j����3�{�ю|�Y��0�Q�d��Y�>����)�<}�C�!ka+�E_ƒǗ�:oE#oI���'o���9�b�ܲ58�<ӄ\�_:���u��m�+Á�@(��-����9R���&M>���*�~�/u��o�S}��@��.OՇs���5�<:kLv��p��[r_tu�zXom��
��RW�'v�1����t�F�k�@M0]:�%qS�W3�2��,���<�������v�sC��L�R�ѽ��2j#{4J�Ρߡ�CTl榠e�v���:6p�e��^��z�,���z:��>q�KW��TY�	欆�д��CL���YG�Z�s�������	�FWv
�e)�߬e�|XU����{\�0��j�P@e!��e�+HZ�K�p��`�$�+��^�g�H���<f�|V�2/��,�O��
/ZQ
A�g���/�(����{gq�u��G!��TTjϋ�B`R���9J֞�ynČ<�K�}�Z*���'^LJÇm��:��A��"�L� �j�rO�wp ���ni6�z�&����'�Q�Zv�O�΀�.�R�[)I7U��}�1껐:y7f�^u	��ּ��@�y7�'ïg��ϚVN�a�Qm�Ԣ�Ff�E�M`�4G����C�E�E_�vKy��e��H�N#^�K��K��9�bYѪ��н֞�"t�h�K�:�ak7Fz)I$�18�:8����wԽ�Y6���g�����$��tj�@0� ��I��}A^i�
İ3�YB��g�\hX�v-`���Ҫ�J��4��V%t�#�z�-Yo���^a�.�V9nU�E���.���ewx�J.��zJo����5�q<w��E��@�gS�Bx�:KKCv����|��ӥO�x��R����[�=I���ʋK�&�>{^���bz4a��3n�{�@ȅ*	f�&;x,�t����x��=F^��.8̣�\����^�4�Rti�iety�C�Wño٢VB��4�U�\r�t��i��
TF�/��J	б|���Bw��K��o��%"G��ѽ�d%�y�t��
� �t���bZ�х��1�vR��ѽVdH��[Y|qH��Uz��@�n乃괄��mZ��9���ѽ��]a
���+J�t|y/ 1���P�
 C3�k��"���*׺qN��d��uD^�Ͷ�K���G���Qmx�o�~��/:�׆��y��l0�C��zK���z�F\�B�[Vt䀡\Ǽ��k����'�7d�e�����ڕ���-��!��E70�c�}6\S~�/�
@�X�7��J�6Ms*�Z<צ)�	@%$�F��ۅwнz�u��:��ܰ��W	�6᝷��gM	N��|�x=�lx��<e�e�X�g@9�E:��_���;�R��x�}�Zu������]���]J2��UQJ��mh��0���7g^:~��r�!�q8`��Elu(,w�!PV����a.t�d��s{7��XY�~����A�w*Kv��,q�ޙK�Y��vd����_�!�G��{�F��b3>�9"(6]w�	�P���5�2譲]�K���Z)6j}�+�=UNR_%5uo��{zĿ^��G�{�ut��d= �����5�3��܆�k$H(U�)w�4o:��y2��7���w@�P�-CF廪��r�
�B��ߵ�3���Ӎ�8��Q���x�ޣ{���e�y��̸�l����y1�'�HO��.9pI���=����x�;<O
�������%�@�ĺ���y,p��vH"���싒�rՂg.��pRix惔�{e�i��k �1#�c������z���ë������Me8��)g��T�@Cyd�讨���@��<3�/����d��ƉS�SG���'�!��� �G�f�x;o��݃��tG$Eye=�E���m��,:�vz�7q�T|��~��{m��3�w�~�n����Baz��cMR�������p�l:���n=���K�OW@p�^Ka.�	>�y�+�Ur[A�����d��x}���6o�	�i�Xz�FAE��AӞ���p7�xqȗ.O���\Q��)w�Ӽ|4"e��r}��K`���82��{�9z��!gk�$�J(ƹd���KR�)ANF�%��nݸW
%˜���
"�����h�zP���s�I�g�׺���A�0f��W^����6x�
��q��cyPR�%Gs7^��kM��X�L�"};����Eo9�J���@�-�{>�+Vgއ�ѽ6i=w��S��Bm��|Aԫ]�J‘ܦ��x��.|�.z�Z���<dl��AS�~Q��2����\���ѽ6�m3dy��]�T��Qy�;$�ڣ[��7��A5s��?�{m��<�8�{���$�D�*�V᝗*0�c�,I����p�W�WM�O�0���z�J~gn~�����ت�%�i�EX�����a�{]i�'/cTH8 ׽_.o��9ш� ëao9��Z����]��%h�w=���I){3�4z���E��8䆁��ү�m7U�����ȯ�8��Gn��x���J�@.[��`����—,��?}����cOvM{��!��e,�̮�N���q��/u\Y��9�"���A����nkjIhW���dH>��7�Q(Og�w��Px��x�zqK��=��jp	�M!l^O�XW��b1��z�T��o��J@r��6�¼����Ϋ]�U���,ŵ���a��YF@EU�@�g
RiC���R�w�z��j��f����7݅��/?���;y���_�@���#y���^ݤ�!P
C����5�T��>�r�5#C�-Gqe]�W�D峼g�\l��^L����[�=�x:8O
y���I��D��`kձ�j�'�kb���d���b�ޞ%��J����s�~�
#��������	���˨���T< !�LƝ8�o�Δu�p�%&�].�{�s�%��>����+X��t}���sj�Cޕ�Eo��
3l�G�����r2h�<�����$���8�G~u$�Z���M����g�X���UBL��ذk+�]�f���Lޡ�0�#:R�mk��F�<l��N�޲������X�釯�`};��$x��V/�a8-Q����#�%rŕ<-��c;����h9y~)�V�)�j~_�dhq�*J�A}�J�C�7��w`yF^�{"u�^
��C�7�t�X�i�kN�7���o�0Dίw/��OO�����Mڸ�a���ǐ��[������+�k�JH��F�5�@@����lpj�z@��$i����M�^��r��R��#��s�\q˂�l���U��O�������oPKEePQ��gf<�!pip/_vendor/chardet/big5prober.py�T]o�8|��X�/�q��
TV�Ԩ�`�(�d���&J�I%P�
�\jwz��;����6����
�$�So4�Е�f�I�-��ʍ�BQl2&�hl~K�����2�XJ�d�)EN�q����G~aevl���/p"�ޥb�oh���vgl�b��������U��U��]����Z�-u�|��;)E��hΎ�g�Jb����e���߈���E3�6V�Г74����C��Jɵ�
�喙��+�=PeJJ�&˙t{z�I�죱�&�yB��PNP������dI#vPJO�٢�Y�V2x$S֎I8څ�۞�!�A
�kw�%���/l"��=�v`lz�>�G7wx�)t�����+�H�v��B����5S�8/Uȥ����rA��~F�y4Y<? N���3�b��UY�}� ���w ��p4\<���b�OL��,�/��r�i��ϦI�C�0-f^2�dq��Ɍ����KF{������%&�~�]��z����r6�dN�6�Z����]�����Ч�6�w�$�/�$�d�2ƶ�g���ػO��݇��.�2A��C���\*�F#���N�N��:�;k֨�?ѸT^�*�1N����v�z�<F��Vj>��$	'����܅�>zrs��&aU��ι�<|�_%��x��5�T	�j����e��X��V+���Z����+�{Zg�6�	�S��9V���Bͭ	}}��J�r��W�x��R���o����Tᡛ+-
~_�e_ZM7᪛kJ�M)6W�q���M�PKEePQ�Y(==	�$'pip/_vendor/chardet/chardistribution.py�Yms�H��_���-��8�q^�
�����R���JHL"$V3���~�	����\j��Tlfz���~�e������4[tۼ���u��m_}�-��G��j�r$}ۣ��$��Kϳ�}2��ұu��I�kr S>Z.m�RK��_�LEH��t&�[B+Ǟ��|���4��}F�N(l-\,bV�2�tUcM��"U/.^"W�L5ϣ�*�%¯Nr�:���YP�W!���/t/�Q('tBء&�B�?>?L��Ah���0�T0�sl�5-�9�O�p���aM��!�OW<4�]�w�E8QK޴�t+vJ7�!Ns?x��[�_	�MyL�זj�F��F��X�5	�y�U�
#tV�.�ň%����ÛS^XĦ��re9�듺$};���q�9hEA3%�3����f�]�ߣZ�>�:�Z�����4f�IN���K8Uh�z���޹z����m����o4{�z�K�v�jt_��W��Z���v�^&�
�413��+9	`IWh[z*:�ܫ�Aϥ��U�͎�`���b/z�?2�Œ�A_����C	�}�e��H�K�
!��],o�!�^�%��fѻ�VΪ��I�y�J��bdۇ��'&�㣣aL�,f��#(~c�q���G��X�����m�;�N��8�nu�����h�'�|�o^�n��f��i^�{�v�����%����M;f���%�>�=�����\�P��x�)X�>����Hm�y�"W��x��H�Qş�J�}�����ǵ�:���V�"c;�^�C
�g��*��������v��u]�լ޻N���}{Mo�Z9;7�~�n=Ի��/.�c���T��]�ռ��e���yWɲ$j�e��~� g�өD�k{�	��㷙����ˁ1��S���P0I����B��eme�Z:�Պ�R+�ņ�ق���"�g�.E�2�I(5I�8�J#�Wۛ	���3��*ھg���=2g\�^J@��B�؞3C}a�t(]BDy:!>�z���t>��'Q�R���4���T��;�k��1#���Bc�K�XO���,���r�8z1E��Yn�V�iT�m��h�OT��q���.�܊6����33�j����'@ ��p��H�9���гG�P^
G���wi6S�dh\�9�73���V	��@�����4lO�6J�P���m͆"��
�
7�@A�l2��̈́�|p�ވ$.�(�܅�(�g�l_Y�x(�kL\2*��-O�i����rQ!��sj��'�.�+z���^���1�x��@D��@��:;,4"j���Y���ϥJ�-��#�FZ'׼�]vRM�;�6JKg���ƹV�@��njr�&��Ҋbax�~ٚ�~5�ʮ�u�����l�u��
/=�D����)���
�_���t�a�p�+]�z�'���x�*�����K��X�/F0j�v>a��/�ph!�e��&�E~)K�/Vl��jx�[���f4n@�_�̦N�PȂ�d��Y���],n�nE�e�ϲ&>yx�p���52A��8`Ϲ""��S�T�Nj���)�6��@[�f���<ʶM�A�[X� ����V������D�.'P|����:�#��e�d�I�s�����yO��Hy*���6+gQ&��+�7�J��#�Ӝi�E�����Q�|j�b�r��Q2r��	S�1�Q�ېe{�qM):�=��Jx�Iۙ�s�\�d�i9�ޖp��n��5�T�epU�h&ו7
�Ļ�k�}'������V�Ղ����
]2^,�W˟�]n����87�}{4`�]��w��3��>��Y��Γ�Q:Մ
e�4�(W���7�NN�s(R�J�~]͑���FF5�Gw2#˸̣�C��%�,j�ue`6e-O�k�S2]'d���:�M��H����-�Ok��'3Z[�l;�K��F�|�I��h��S�	��z����>R*�{���<�ԗ���������؇�z�c�.^g��� ���V0;�|*�� ����R�4��$1��/d)_4��B��Ԫ�}�!�q@4\�ыې��-����`�t�(x����W����
�y.?*�%Cb3"j����fbc뵯���������<�
���+{_�}��c�o�a�����]���������D����Fy/���h{4Y�@,�
)�b�6��Ƶ)1�oS�.�iI��˗9��D(�i�W�h�里^A >��z(]G�&d�sg o�"vg�ч�X��Iާ����T>�_��M�wV�?�&���(��nO���wo���)�PKEePQ�Y$�r�)pip/_vendor/chardet/charsetgroupprober.py�Umk�F��_1�s8G����u;g���/���F�r�]��JP�����T�~)�ȳ3�>�̋���x�?
�0���yF��P�{ո��a���K&��Bn�Y�ͅ`�{��%�U�QZ��k�C�-��G|E�v�AE`+0���l��\IC?�N���T��hdCX%)�UL;�]BWm,4{�й��� *�=�
3�k`��+�Y&=%�櫘�l�������w�r��|7@-X��n���'�_i��Z���Ⱦ�;HT��1�&�'!,0��4�oUȣębR:��E�5��O�%��SxB�����+�
��A`v�f6�RGd���"�T�;@N���WԆ,�����-�Z7�u���;xM�T
]Dz�����e
�!��)�7j+X!��X��|��p�u�\@w�ߺ�Yw�x�#_R�N�~��C��4�6!��ܟ��RD�a8.^��p1���0�̠��l1�-G�L���d�戅�N�*��G�U�d��qa��_����6���r�(`4"��
%�i�R
z<�l�4�ޡ�;�.���mQ�^~����`N��@(�[�u��]�m�t�7�����,u�Ǐ�\*W�F��<�1�2U͍�T��빥&�σ
��NH�ܯG�9�ijl4�`��'��]v�<r�����E�&��EԢ��k?�Z�~�$��1��9�n����H���%�{>,5�OY�=���$
���I�
���1���Kq�ic���ee�|.`����k��qy�{�!3���=���ړ��~�{�c<s:��:�;�H���˻̗l��f�U|�c�&�@Ɉ�(<I�4�h����[
�w�L]®Cc���'[$RB��s�J,��9H�&v��Rʖ˓�<�ɻ���ƭ<j�<6�aϾRS�~^9��ъ����.�q��({�+]�^v䁢��x���b�L�w,���ep(���Zm緖�EE*�VF�p~��Փ�9��9�
�K�Sh{��{��5�C�K}�p��w�;���/�����N��k�	q��?�40��؂��z�᪤���㢬�Ae!}0�|��b�Ҹ��Q��K�p��aAݿ�.Y�ek��̞O�PKEePQ�aZ��$pip/_vendor/chardet/charsetprober.py�Wks�J��_�0l@�ukw�c�����p���W�f-Fڑd[������TBURf����O7���?�q�y<��x0�·�qr=��NȞ���b-�Z˕T^D�8$S����Q�ѭ��B���מNEF�Ȅ�Ś|�:g[
c%3	�O�QDq"4�!eGTC~*�����&W�2�_uk���&�����D@��h|i�Ӭ+)`j�QcФ7�N*��;ԏ"��lJ3�
�(� V����5�f'DW�~����P��aFYL7E����������]�� @ɥ�t��ZJ�0{��o��s�=EZ2���TF�
�k��ā>�U�x9�L�M����&"E(�Y(�a�&_F����Jy)%|��+(G�ȼt�F1��ߒ��gۜ~�����Vjl!Vjx��t'��	���.�}����4 ���5��?��>��h)(OE�G-h�,}/.�oԟ~�/�٬?]|}Y��H��$7I$�QiOe����lp�����x����|N����?[�����nng7���
����<��*71�D�x2Jm�_��F��G�4�]��
I�_�a���O*@ߒI�Y���D�<_dZ�����Ӣ߻��C���|$C�Eq�[�1N3���m�M��iw�t�n�89�����O���2��+4�j�ޞ��������/!5�P^ggg~� 
��\d|'t#^���=#n����bp�p��!�L>�{�8���^"$ו��m�"
[�\�rC�~�Oc%���8n�ơ�/��jOq_�v �P����Y�lb�����p�f�=eƷ���Qq>
�b<�lU�+��xY�SXҸ�t�W�,�ʆ�{
��,�t�OY1��P_�\?V���O��8�� ���F���S������"n�����4�2-�4_6��oߟ;���翍/�]�@���'�K����1/r�b��z�j��f�P*f�լH��tv?��xQ���"�P+f��IJ߼������v�{.��{>N����9�Ѩz�����L�1�PV$"�η�X+�'�7<��J��4Di�([rHq��d�̂�&m���
(+�2T�^��a�|��_<���l2�j1Ccg$�銄�f�r>��]��\�q�¿��\���ҏ*
��;�<�NP��"��G���5�u�8���g���H}-��i-�51�8=���2��!��7U��h4+����b%�I<'`3��;ę3BQQ�Ҍ)/k��i;�$��l��ʏr�{�����gȮhBUp�Ӥh� �Q�U��Zվ�_��?/Z;�G>��+1���RY뽽�[����|뵻w56�����V�[�7�B�������d��]�@ݶ���Xn��!:�Gj�xy�C�BqV
S����P�,�4��:�����!�{+T#VM��l�&0�/���j�t��8h��F�B�n�nO��(��#SCc��1_)x�T^�^�n������	�U��V�'(�S㖼�F"��ό������C��޶���צ�,��l��o�fz���F)眡�����Q��Gi�s`x0IN���
~�`\GE��"�=7��\�Np^9,�ǩoK���p�C�v�����x\�m�_	0l�ʀ��q����O�pյ[�/Q뮞��y+\�<��j/����}~a��	�m�D#ʔP�w�_s�%���"�
�e
X��-c���۞(޵H~c�=c�5u��
����|�����f&��I0���^.�&������=��Hמ@�?����H�B�����njZb[*m[*\=|��z�;�s2���m�*�z��9A'?���3��BWZ3��`�fkƆ�R�U��I}E�B�L��~���๑�P��;*~Ȭ\W착���	�y�k�W2t���hM�$�A$���ݿ�Tv۶��{�8<��z�ˁt�_��]�=	����PKEePQ\�7H�)pip/_vendor/chardet/codingstatemachine.py�W�o�6����|���Z�b�� ���i�%N`;(�"0h�ds�D���z�)ɿ�uF��ǻǻww�����]v?��tӻ�]������^�=j�h�tg�T�BѕN���L�#��6S�a��k/�N��/X�9�)��ﳳ��3LYV�2N��⫙k���)�a�8��2 �_%�ǚ/q��Q���?����u�����4`�f�IYɕΝ���iӴ'g��
���;B�������鼪�(91�,=K�a&�S����i��EN�iKx�H�ɯ� >ӉL��T�	��Y;6��9����Ȕ>s���%c�Șs�$,ͽ���L]�D�U"t��='�8�w/�XX�}Ԯo�[�
5��sx�����
SGF)XW������D��#�0��B��_��}�{Q��H_;�A�?z<�/��)�W"�l�$�Q��["q�vW_ѹ���F�>��ި��n@��F����΀��w�nD4d�)�d"yEq
�L�Ʉ��ʖ�?��	��fb�hs�E+2_��*�OC�YzN2�\�=����u(�0�qԢ��p�w�~-S@_+�M�.�u���������6����>���I9j4�)�.JO��F#5:����]�݊x&s:U�ш��^	�[u�ԓ�8v�I�$�y�&��!�}(+�<3K�L;����e��$%.�0k�$o&�1@�(�.z��U�ӶVs�2�&���~41�"vpX�i��EL��)|
Q��d�Q���x&�)�#g7�&��b,+�47������$���h�u@��z��Ʋ~+�.{�$�9v�m�:h��$��)9k��UB���?nU���<1�x����L��4eR-��Ixf ���$4��5�A�&M�	�N�ҫx����iUy�dؖ%�=������^)``}�1�z}Z���y�c+�9������C��;פ��i�Ę����gC�_�O�R���.\�qT�&�)I�D�ex�|ݸH�Y��>��Z���V;P�� �[
� �5Nq�Z�~��[k(^�纚C��c�g����5�z�,��U�ppڇ[�"h�`QX�#�4�.�w�{�”pJ��O��iY�-�Y%^e�*��x�Y��v�˜��j�N���й����p^��М�s��`��h��&ؚ�q.2�O�# �'�Uq����U�u���GA1�9�p�cEQ��u���g�i�/��oĆ#^�r�Ril)�-�/��!(��������ks�َo�8v^�����O�ܳ_�϶��Z�r[�Ӫ���<m��g�WD�	ɖ��M*}���V��{�r��T�u:~�_��y����kӲ���������ey{A핃aW�|���`�T���P�cԝ؁	2Q^0�D�U��L�o`.��17�(n�BV�!P��O!վ@�PKEePQ|��eInpip/_vendor/chardet/compat.py�SMo�@��+�ąH.�D���`�I�@�(���q�겋vפ���"%�ڽ���޾���v?>G���x͓��b���v;]L��Vf�7�箾��c%t^	[<1{&������J:(�Ya�oi��L�_��S#g��B�#?Az]|5��[SȲi]�.��WOv�`ʃq?_cF�q�4Y���3%s�dN��î���
d�7m�$'!��^=I��w��:��?<�vb`,z·�-̮^��J��3��a.���@[��U1!�"�BF���
��s���u�p��S�Z��t3�\_�Ҟ�Lr�S���*+�oX8<F��#�q<��M�~��(I0]�b��x���+,׫�"��@Btnq�̏����)��;Y�R�c��c��@%��c�I�Y�@nv��P��P/C.
A���x��ߎ7��,���u��m�IB�V<���SY2�Tc���m�c���p8�2��už����?.T���I���a�l��w�,ui����5^,,7׸Ejk:�7lN�rG;���]��ǟ��E榠�C����~d��@�����u�~��-u�xr�zO���_PKEePQ�B�1h?"pip/_vendor/chardet/cp949prober.py�TMo�8��W�8ڸ�6
��ةA�Q�d�e�H����~%�NZ��I���8�f8��Cç�&�h8K��0�G�t!����r�in�V(&)�'a��?��,�fK)lA�:V�	D>�W.���9�3��qgS��0E�Dʜ����쵩@Lm{j8s<�MU3�~3�k_᪝�^tM����Aq6<�PJ�}���[n^y�Ti�ؔN����є��rkDA7�9M���j�4Rl3�W)7��չ{Cb�T�R���L؆B8b*�C�����Re(�g�)�Açي&�"Sz�T�(7R�ODʕ��,���NJ�|"I��4�ku���ݯ�XX�S08��2�I�1��G7�x��+��9 ���*�H��v��B��1�
���}0 ������%����q8[��#JË�5L��KbTe�r�tG߀Ɠ���g?/g�$��<��a�G�I�b/��0 J8?H��<'�Q�����wLH۔���Z$(3ڱW�6�\`�����C�ն�����$rR����������>�>
��y� �~H� |$rP��֦O�::
���4�����X.����v:��鎙�@�aC�+����#Ğ�,vD�ûP[�0nKwB�2�=��LO)6�2����
�n㧥t�r<�7�nQ{Ok�#��u2]O��I��I%��17��y6�l�FN��Y�{�˼��cK���;�>��p}���U`�쾞���1�+v�~i��ϑ5WC?���9���}hM;����9@��97\��c��)��w�'�z�ÿj�����4ٺ�(h�Եb�UT�]i]��^]b�LmK���~ƻf��/PKEePQD��}pip/_vendor/chardet/enums.py��Mo�0�����*��VH+5@�.!A$��S0�����v���w�@(�����~�?�Ṹ�p\!@��l<Yn5��x�Pj�hU�r�Q��G�
/24���3_c�q��4Uta�%���\f\����z�s�J�ʹ�K'\k`rW��p��j�Ss�u���L�or
HXP�@��hˑ��]Yk�P�� �R���D�e���t>�7�3���J^�o��U��!�=�)���r]R��\,�Z������vbF����1��!���<����K"6��lȼA����n<s,fa�v�n?�S�گ�[��Ù����*A$�DZ��u�\�������p�>��ͬӣ��	��@Ѥ}Z�e.�_�);�v���~̂Q��p7��q29o�	O7��/"�`[��4��Y|���,�5�,��&��W�2E?F�o���S4���v��VJ�J����%W�%�8�Fn�~x
�<�����fY7�4���Ʊʽ
f�4s2+d��5�������VE��2���[�)�� ��Z��x�ɜrmC���:�W_�n����I����.��ۛ�U
M�-� �$��
Vk4S�ˋ� =U�
��V�2W�ͦ*�@mǻ�~ij��J��yF�T�!��Q�{Cz��`����xI���؊�䈞&�з�M����>��]]�㭕�v�PKEePQ�=5n pip/_vendor/chardet/escprober.py�Vmo�F�ί%R�B�Jͥ�J���o��NiUY�=�U�.�]�r���~�8��ܵ���<;��3�//��s�yS{Cw�p7�
?����%,�3�W\��2F�6�3OS�H���lN�t�7�<��	S�E2ӀA�S4:b[$�f�<b�K���J�� `�K��#��`�}�xzSk�������!�Fwi
����F��q^�P
��rg�j��[�L���<])��7@0�{������I�R1��,%
�L�3%v{���	Ps�������72��ޚv"�rl��F���>�5e
�P��j�e�#
��F`�֦�S#�HP$#I��7�����O�4Y��闷�]�
�����[ء���R7T�4RPU울�/H�>��`��Ә��.!�/|��gL������
��tJ�ˑ�f�r��fO�����)bp獽ţ�~�-�n�h����
���|�@�XRl�l"�@qB�IL�hOu^�#�WS�ik����9)
��v�M=L�Xe�RHE�
��4]xV��C�;�.�T���#�?�ɉ��RjA@�#��(�Ru�Njc]'��]���7��z}���,�p���\"��V���h͔F�UrI�S��
���g�ґA��!}mX����I`O&�I�bGsRx��X��
G<%�v���aTh��*�u�7et���a0	'�{wL�����pzj�0�l-hx
������j���i
��j��k�h�X�����3����MҺ��t��
^��T^&QR'F���y��4�H�����
U��̖)����T��Q��KYMgG{����(�]Z$D��"�~�%��ö�4����0�t;����w���/	�
�8�c���
��-���[����MRv|?��3|���p������s���\��!�Q��S�+��>�S!��������5���[�8���]<K/:�H�OH(aD�P����>a>��2��WZT��m��#E�`ڝJ��!S�k�^b��v�+5�*�sW�5���3���������C'26���:��2�3mHQ��v�߮d~���#:��y
����+4;%�\���u`�w%�%C�'vkF'(���S�]qYϹ�>�1�xƫ׫�O�b�.��zd������ʳ:�7ɯ��&A��R3R9��U� � /f�B�����ӔM=�"฾?�ϥr2#F�7:7��[�7z�=��-�9�q`��ƙ���=y��,�ē��”���쾐�h�0�����@�}><U^a�j�>�u��ʨ �:��=?�PKEePQ�
`�)pip/_vendor/chardet/escsm.py�mS�H���)��jp�׺Ȣ��T	֖���DRj���_7$�����]	Z�t�{fz�W���y�Յv���M8o�א�{�:��XBO��+hx#	��/�qD�S�`b[6��\;���|��7�
<&�we�b*�i2���)�s}�WM=��C�S�vSI�狈�]	E��s�j�I��ZC��Y�;���.}��h9�����O������#���ν�'�a��y0��p���*��%KI	�g?q`g0�f`
��2<&"���'�ȶ��4sG8u �ďrxٽ���q�p)]�p6��бM�mS���Ô��*S4#\x~��3�6ک��|l-��z#��Sp"?�攄�8�98�*Rf��f:�]�c�������f��fN#�/|k
�z7�wo�[]�����b�ъ뷌dO����qVJ���:M�q���y�����/Z�n�0ࢧC�u}�jܴ�:�o�~�hf)�S2�$�J��!'fr$a;�r그�>��X<H\fSڸ�@���wZC�s��E�*�g`[�zA~*���(��M�7�i(��I�?\����/�Si8���\;u��|>��ry�[�^��~��9J�,�M +��e\5::a�mWn�T��]�m��p�ʧs�7+�'.WI�8[�lk˓.��q��N#����N�u�x]�t^W$]��IW�u%ҕx]�t%^W&]�וIW�u�U"]Ki-���b���d���Z�m����j��F����N�N�!醼nH�!�3Ig�:�t&��n��F��:I:��$�$��Hg�:�t��:]�Fc�8��4k��Lǚ����Q��B�9�횖!�&�2x	l�����4�j��(��ыbl7��,.V��g�.�Jj�QJ\�r���H꣚��4�#��?���>�\F��}p	}�ܥ�*BF��
��~�nv�?�M:Cx;�~��չ��4����߿�БǟaY��Y�^��%L�Rt+oz�4��8ƀ	3�Αn��ب75���秫���V�k�6�����=97(K�<�'�j=-�i��
���
_8P�/�*�#[X�t��^�Y[X�9[T�Y[X�9[T�Y[X�9[T�Y[X�9[T�Y[X�9[T�Y[X�9[T�Y[X�9[T�Y۪¯er��.�h��)���"��c{Y�W��K����!�ޫ��'���l��8Q�\�p@�4�{�P��w��:��ݓ�#�
.J��Z�c���o��؏�.i��"�Ca���Fw�#����I/�P�Ez��
L�}I�r^�%�Z��Az�l�������?Lzo{��o|��ʜwF|�B�:k>Aw��V~Q&��^���_�C��{���u�\� v'�@�1 ��Y ]�ض@���F����3�n�y{"��ߎH���x����?|,��V�1_��c)f�x�����I�P��~|�x�b@t���ˆ�ڸ�������D\;Eϒ���mK��,>	�s�3lLs{�ַ�kOI���PKEePQ 7��*�"pip/_vendor/chardet/eucjpprober.py�Vo�H��O1jTt��N�&�����_�FUTE�bث�E�����[�l���jE
�}�f���/.N?t۽�
��kw�^�n���:���\���4�b)$���朄���&��5�^R��Fe�Ia���#��Ԃ�	�ܚ�m8���X��Y�����(�����J�����9Ͷ	�+��fW+K�v��o�	������&kh�
��|�f�V�j1���US��
р��4�R�5]"�d��v�d�?���L3�u*-4�d��~A`7�U1�L��saRza���J�~��b�uK��#��zmv������=�\#�q<�D��4����[3��Rw./���uo��;��\���Fs�-c���Te�ŏjn�a
Ao)B5�βqR�}�s2�]A{�!��6����E�,}���O��#}lM&���x,��.�2��& FV�I�E� t'�X�n{���袿�î���hB-�&~�=�&4�N�#�� �8�I��<%r.��k%��2�4�G�� �hN+��Q�t1���j)�L��^������t�Qu���oM6��G &?G(��;��]���ӭ2�A-�^�n6�.�o��DS+��;?8D.*��Vkjp��Q5wt�Z̈́\zM�,\	ɓ����+�
� �Vf7�#+n�����q;Nv3�"pDzNwf�d'��|�L@�w�;�Aw�~?�l�0���+��gJ���vS��% �0f]� �:�~�R	#fL���R=�!��ZnAA 0˂�jx����cbL��U�D#7�����
ݻU���l5�K����n����lK*��4��b�F��R�̿J���h@��m�2k�@�5/{���Z���|?~q�"br��Y�l�$�x�Ot��<��1�- �J��Xt�F\Vs��=�R�|��Yܠf��I��V*�$��}�с�a��Nr�B��!���^���V`�h+��+�Fw2M�y��r���,^V_�4��lj�p�p�!.�$ŗ�U���IS8(t=��N�v:�\�����`�=����sa�G�%E�@uF����F�a'�Ŀ��=v��
�w�_B�0֚K��5�xp+���c�}v��)ǧ���t�t���x�'逯��Y�tr�4��N����||6��Fͧi���EA�")�_J|�|�C�,	:��B�w�~�����S=-�RـK/W>�X�}���y��I3+�s.C�_i$��hⷧ~�?L�x�w�sw���h�2�'��JQ�n�]~�?��K���Y�O7�Y�,�5�Z=��^�U�PKEePQ�Aya�4 pip/_vendor/chardet/euckrfreq.py��k�G�����H�/Fj�ʨ�K��+Ok0�
h�8��i���{�_��<�Jf�]$��TeFF��K�[�W�?���Iy|������O������Nn��w��q����<8�ݕ�u�����ˋ���ç�����ñ����nʛs���Գ���>g���uwy��;�ûr�
�9��������"�?\]������I�<;��o�����������Z?�R�o�wn���$�9�n�wyY�{]�w׻㯻��N�n��ןr��]��|S�O��g��_���NIo�͡<�|�p�e�)������3R{w������o�����SysqU�����|
�\\�����?���}�է������?\��O^�ǻ�����s7�>��ܿ�ɏ�ovW׻rq]>���z#Ͽ0R����������M����j_(���w7��������r��8~�y��"�c�o�J��S��G̍��fU^�ʧ�ݻO��I!ǖ�����ӗ/ʽ'?���;?�������ؔt~M�m��>�	�-�������d<	���_sƽ�g��^����^<y��yy���+�8{����������-�n�U��[B�]���CJ����by�m��T�u2x�����u�j~�ۧE��t����_:�<\��~s����ߕ���i��O�I�v���=M�s��L5]\��2U�<�?ڿKҏ.��i���a�O�r��w�8�R^>�7��_y��#��:I��/PV�����\�F�1����_7����y�6���S��e�/�S
9�#���'��f�������g��XK�s���pw�;�����{���uf����[c���?^��.���.�_m�8G��_7J�X�R��w������n@�<��
�y�U����4�ɿoK/���w>L���ܓ��/��Ջ���=����g�_�������W��Ii�;�>���_=?����>W�����Is�ϧG���宜~��N�3��zt���_==���yN�:��C>b8�c�OK[�i]j�G�+c��e�i����e�7��莋�R���$),�����8��֚�b���9'���_IzV>L<fXaf���H6��ז�FF�SgȌɈ�ۚ�K8cd%	�ӓ�[.�{�1-G���Ø�%7M�+�M	��kY��QO���/k~N�0���G�PYsi�o�!��殰0+��IJ�E[��<��3+�Q	�<�R5I!�`����ƐiH.,��e
Vā>&�XdJ���qP��0��s�]s�Ienf��_P�òvD�˵�B[X&���**�������Y
���"{]��J�:�]���}-d����ΖWLW=���D4,�G��SZT�A����k��X��b�u#����
K`�i�I��HC�9zRh��<B��������H0��Z�y}`4��,p���?�EgF������u�t\od��d.G��^���`n͝�!%UW|yDR��#�0�#6��}�y,<V���C��h��r�"����_k�m
�伕w�{ԅH����i I�B�4఺<^���w����@�К�S ����ļ�hyx��J���YG2B��He�0;.��Uʊ�;ҝ6�(Ӵ �UuR��\wY�G�H-W�G�R�>̡�M���݈u����63+aw0
L�$A`,8Ċglne�TJil3�&X���p�����Z�(����[�QG�9�"��ڲ�1.�s�r�|'��X��=b6D�t86���ki��:�&��,V��&M	+[^�u�uO�	�b�:@b�fgDZ �y���!������c��V0s��A
��&L��<\�C�^W�oM�'�TO�8��F��
  6�����@ڢR��l���R~����h�C��@"%&Ue�����
b�P�leE�V�"���`�S����c��p(H�h��
"\DK8#����
~d���o*�0(������V�����Z,���*.�se���Pա;�BN���eёjm� 	�kn�Yn�N-WW�q�T��Y�JUݲ��reԗ�!���\n�W��q����3B2��A���"�@7֦	�)$�!~��t�3o꨾C���l�#ƣ�a0qa�C�i����28�p�N�W>c�`w��C�p�h��8�$5H����>n1o�𙊻{���g6و�]Q�6~TA��_n�j�mY7Fd-:Z��/��>����󝄳�+�|L5�r�ݯR`2ћX��joHe�=V}�& �����*:Pn~kj��f^��`Č?t ��v;��'
U����\d2sp�NJ:ag�-G�u��a0��3�,n�@�n�ص'l���̹�"!i"lǗ��O��I�"4g3wd�N:�g%���IU��Ӻj%>���/-�	�X_X�N�Ae@:��A!p�	��LkQ���F�M�����u�۪m
�3�0#+(U���S�
�Y�`�ٲH�e�N�"��a%�+��,�y��*��F�nO?eg�	x4�teh���;`Z7h�_Pؒ�\���������0��o��Utb�ևر��q�w2��ӦИ�[*���u+��}�PE"38��77���&
`0����"\Bs�`>�H�(˻U��V
1>#Gl@IXM��jt6F29
�:`@u5�(���H�Uu�	=
�.�I�Q/��?��$K&���9:?�Rl��p�B2��̧amT�i� ����Ϙ�+<TmZ��K�2���&�G�Q��m*�q	�Q
����fDLVel��U�,,��d�Aښ[v�D�}̓a[���dp��
p�f�C���H�#
02K�b^�M�����.h��(Ve�}n�Pml�/�U5���m#���:�b�p� ��؞�T� eQ]Xm�b�B+.Z�X[�'�,�=���a���^��j�@��jWm�����o���O�'�Pp\X��m��#+�D�Q�z@�8ע��e�l�>�a4�l�A
6#��a��ŋ�2|UW�}PoT��5�f�a#H cg`��l`"$�	"�,�
L�ˑkw�5��)�U>o���E�"�=b��-Ov�6�/�'	la�)��@V5����ԣ�<ɝ��,�t�B$(ʺ)e���dZ�� ��=f��2"Al�R4o�-���eL��!�n�' ��k��3+���a�+3��FLi�gT�e��"9����"��(j��"+XQ�8ͬ|
�}x
j�!�2S׃/�/?�@ݿ.i���'F՗q�|@�2:�+�9��*�"a����=�E,�4Ffd��I$�N	��b�u�&!��xh!�"��B<�*�0�
���= m�Y�'N��)�
�
�i��Q�c.�X�p�a�����b��r>�f�iӶe����=h��J> ���n\,��#A�����BB�f���4�lK �c���Ŧ��Ŋ)ج=Q�O.��F�4d9��A�\�L�3'#9�.<��F��Xy�p����q�:ϣ��H�/�
�
��noc�w����,,��� !��@Tц4v�ޱGYZ��@aQ�����nɾ�%!m��G
(
�������j�>�,R�Q�\�p�V��ڥ"���2U9��r�*q��M��nA���_Ƣ��Ο�`��[KS��`��H�Y�Q-�#d����>�@��eS�ŕ-�xU]#F�,s�� ##�;�'��fh�r�� b���6�;��VX�QDhrq��Mm�gdhM������FMP�׶}�4�DA�고�
��0C#ڇ���t�G2��\|2p�$82��Ha8�Td�g'�ۈ1�`��A=�B�>h���-��L��j���@�<B �hfe0�|
]�tGQ�i�I5=S�F�삼[�5L�5-��n�Fmd=NQ��d�ZdK�z�M���Q�c$*���D��B���C!%&���&L@,(	�eL�O֍6�xh?��b���B�,����AE	���+�}���e3�Y��7-6pݼf
莶l�A�j&P�E�Q��/[E�aT�?�h`��)����hRf���l�7-����$��*�� `QP���T��k�v#Ú����05}�4��C�ܬ~FQ���d=�|��1(B�����|)��2��i�m�hB�<�P�`9E�h�
`��€���ITH����M���� �(�U��W귚 �'O�la��j�}G;��D��O�e�S�Vxe�A_�iɀ��X%���ž�Ex�7�d�֒OD��3Z���<���(���GՏ�1ţ�	�r
������#TK��q��/p�7�.��x��dc��>�}�;��x�ρ]PŸ�N��\=9`���5�@�Șc(;��Q��9.���5h:�'>�e%�hdc�n�g+(X{���q;�&V"��x�;M�ȱ�
"����$�'��?m1����&	�v�g�^����k�#�>ʡ�Q�D�nJZ�χiǮ\���CO"i��G2'�1��L���T�5妄#�L��m�8Q뙽�fc����Qِ�yjf&Jg:͋�e��$���"���Vf�X_�D0�*�3F�fd��v �z���>����ڶ<_��D��W�pZ�/�[!�p����,���L�dg �{����TDs�9�%�Ku�'�GO�G��<Ei"O�7�!V)��v.�Ȱ+lgIV}����o�5a	1*����������6H�hY�>8Q��’��D�BDp��>9�KѨ����O2q-!8���r�NH3g�*�[�y`'f�U�ۘ���fZ�ET��B\��Q�cTm΃H�qp�܉,�<O\IL3�@�{W���Wa��Y� PwQO�h-<V���Vs�csP����|�ɻ����\�Wg@�C��((��#���Tga���E�?����v���A��=�b��Y��dq�=IoBh��/�1Ü$�O���[��ݬPw��;1�CiZdy���0J���{d4�ֶdۗ *���k�wBS""�-[o����잕'IK���L�(k�]h���`#�]��-�܆�4�-�͈/'��a�`���?";�8�(f!�X���FP��I9�$%6n�piN�h��<��E-{��Kcp�_\,���=�'0�ɻf��2�y�S��>�"A��ۘ/��4�B .]��^I�����T
n����%� �UZ�Վ�,6�l&YR4&h��"�`O
��,�f5'��v���P zy-ȋ&3(k
	���[H������$#��D.�LNƒ)��4�Kߚ��*��̖�d�v�”�B3��X��s��o���A^����t9��{e�S�0�Xx���d���ڋ�;km��c�|ٖ�`'J	P�_�X�89����6&�E�,ly�i�6�2�<N�br��Tq��Vѳ�Qcg�g\����sKk!=�k�����M���D�O�T��IY�����j��J�\����C1Y��,S�����K�f#��)�d)H>2ow��|�a�h�"�*=��m�
�V�e��`���L����x�M(�J�=����Q�D�U��q�
�JK;�2܄ʇ�9�$�J��G��3a��<��S��F9��IuᏴ��[u1m�k�A��Ix;��UU�t��Uƍ :z|�-.C-��$��H�a�Nb؝��z��?lk�?
"B425���@?jxr��[���O�މd��FϦ'��^��X,m`�I��Ф.�����ɤ~�8TM�XƩ�9S2�����g�K�@�G/��F��-=��L��8(�¤�[\����ɲ�+���Rv�1�4P��ʰ��=�޲!��`��d+��𠓻yAM�22c�˻��Z1���	�A^p�Z<�T��ô�{�U�t[���H^���$hѐ�A�]��@�,aT����%��;y\��J�2\�zs�b�M7d2Qu9m����#��E����2f	�R�Y'�a�橀�MQ�zg��r���$'��}yI�K��l؛m�fO;��3�sL�$͞�y����}�On���PKEePQ&��8�"pip/_vendor/chardet/euckrprober.py�T�n�8}�W�p�ql7(��b�F|�d�ȓ@K#�(E$�@�����6��'i.�g��ݾ|�?xMi<��d@��,z�+��V����k�����L�Qi~H�D`�2؂�1t����|�WVf˖LA���]&�SYVZf�K�~�����in�ޞY�sZ�;�߯���ָj��R���q1<�P)��XG1;����+���V�*ol���D��4�jmeIw����y�7F�4J���u�Ra�ə¿��զ�Lh��K������0���eQ7�J�(�a�ٖ���tIcv`JO�٢�y�R2C�Xf��p�mlnsVj�IDhh�S��X�����B����b�����
ts�$ނtM
ݰ����Js�z���� 
}�ъ�r\T��ҷ���l��p�B��8����Bixѿ=�,�JUY�}
����+2�h<Z�4쇣�t�$4���<��h9c�/�,D	�Q�F�K"�$.Y(��R�}�/h�A��F�2ڜ��D��������^��} Y�6�KoVbv0}�u(�v1�YХ�z��B�e�2�v�o�oB'!r�?�z�w�?�{D��k����DڭVaMIA��6�:�[kV��kѤR^�k��	���{�v�z�<F��Fj>�E;O�x&{�10��kf��0XF���;G�uT;��=��_��d�Nf��q��ʔpno�3�\&�u�m��((M%�N�v��`o���~:��N	��X8*�`��Bݝ_�~�}/E*��@�/��x��j�0��w ��S����Z���P˾��np��s|s
B	���j�3��7��PKEePQ��I�3:�{ pip/_vendor/chardet/euctwfreq.py��ݎ&ŵ���*RB���g�eD��-5�[�4�<'��.L�M��1b�~��D$���EW}����]����ۇ���gۧO?���/?�>���c�/�}���ww������ë�����}��������|s��Ż�����7ﶗq�7׭O�ܿ��;�p����?�=n�n�Řq�gw�޾|���5�Û������o_<<ο�|�{�����ώ�Ϗz��X?�������~���1Ŀ��������3�}�=�{{����W�M>zx����5��׿��l۟^<�m��_����b��w�?�����z�X���<�x��U����n{���bb��~~�q{���x���>���ͫ�<<��?����g���W�:����o�5��g_m�޽��n�{s�o�ŏ߼�7z����ۻ����������'L��5�퓇���vw����=���l��t=m�x��^���;���7�:&��:v�����x�W���.�>�Ƌ�b�}s������_��q�����oO>���'Ϟ=��_~��Jǧ�s���|��[=�x���x𧏟}��qǓ�~��_��'O���_n�|�l{�}����}��g�_=���/?�`۾������W���C~�+���݋��o�%��mL����m~yw�����=|��毾o����v��������}�NH�?�n��
�����R\����^�|�r�m��뇇���Ç���OO��=����ʞ��/�/���ǟ��Ѩ�w��G��F��wo^�X����Դ ���LJ�o�ڶ���$��=q�Ӌ7�=P(ɋǘ�q��w������|����}履~���Տ���#����7�ƳS������Ԝ����h���|������4�2*7�u�?�����?}u�b��%�L����7�J��z�}�@��,f�����c6��U�{z?�������M
���0�����^|�z�ߐ5��z{x���Z���/�۾k�e	;���nnܗ���勧=���?<��~����}��I�o�Cc?���#2�?j�����ɇ�~���O���̿��=�����?���g�ϯ?�������	��n�����6&�nS-�6����O�12�:n{I{|�{\���r��8v�6�=.N|���oJ/-~+���Ŗǯ=��z^�_)n=�a9�z���-����-u���Z�m�$&W�e%��O�����n%&��3�ӻM��`�5���mͧ�§���K���3?⮒�m:w�x��c���'ƌk\��ع�ޖ+Xv��se=�5���Dx��7��F�ծ�G��gǻ�j��2s�[G����x񷔝�3ks�7�&�6�-Fj;��o��xb�֓H1�XW��,�8��+2�#>=\���1�36%~t�=v�de��x�.�`��o�tV+Q�Jϒ�Q�M,q������;�����3��1�R�j�[e�x�Z.6>6�d�����z�}?c�l�u�{�gH���$Z��� ��P�z�7�Ë�2��lg����$B�b���B�xŌ��{�fų;�H�@�uϥ��2�)mI��M,/[�{��J,�v(�����3�k�v�^lHaW��ۘzb�s�����M
�GH�
��ƭ�����c$�<�������[�ˆ���-��i܄,�Q;��y>j��wfr0�)O�f>yb�X"�);���g���n�sj�z���{�R�Wl�w!̱�j�V����q`Sb�c�k��Ļ3pf�s�q�J�;*��e��[{����Nqq.-Vx�κ���<��x�0l���@7R��У�ﱃ�01Ye�D9QĐunc�b��8�x����l*k��!�}�*�)L��`5�a�J��8B�kٗǥqC������g�cb#4�l��^����vP����qm�)ڪ�F���;��#B�ĭ��@��]źH���5p��;b��1Ye�ƭ�lع��x�`)|6�;�g���#�O�k�z�u�j.���ƘD�S�z�*�9*��	y`�B�SI	9���s����711E�@�j�bl�@*^�k5����.�fsk,Z^)q�������LB�QEf�U^�Wd���x6��.��� �"�/�.aXYc��c	c���.�h�xsW�Ѽ�]�Ӝ�~��q��P�p�X(
	R��:K3Q��eݙξ���0�!�,�νb�bf},�����~��nŢ�
G��0�^��d�x�Xq�;�yo*lhs���F�k`�#�쌎��<b����n�'�<��E��x�)��!|V�n]G�c�8xLB�!B�	�R�yD(H�nǿ2���v��a��s`lUL[M8
�>��S�XuN1\94��x�ȹ����_R�"`	��P��D��d�c�2�CO�3+�n�O�U�-9��	!U-�`�5�*#F(�����L�٥�Y��pL?Hk�X� �[�o��e�ik
�~D����y= %\%��J�T:�D���RD;=6��E�T����P/*�I��R��'!NYG���=D-a0B#b=�1�Av�݊��7l؏�
�AŴ�n8�4/�)TZ������+
�_x����Dž1|�!3�ɖkTuW�c9�T�X�hh3���ȅ�i8N���x���G�~1� ����6��b�"`!��N�=!Iͤ$�,&?b���ă<;^%6�a��\�$Dr
KV�OfR�k4?��i<���-c��t���Xr��������|
��0�|~��QNf=�K��xw�>�xڔA���k�X*���q@>)t
D#����,�	�we���dq
׀��Z�X"�`S	)z�؆���n�DE*áX��2�b��0Q�;�k�A�М'��<�P0��p�)��Qn�+��g)�$Gp�3��2��d�N,,fl����$\?㉱GH
I%j��x�� ш:)A����k���Dg�d�c�	c+��+��1��P+�O*������xv^)o�Y|!�!o�xE��H݌Q��ز��G연±�h-&���j���P!v;�?:;˒�X8��8X��cMĵC����I�ؐ����τ^ Ě�J?�+z�[D�G&X;pR��T�8y���L��A�I8UtC�	��X(s�Ę�W��P���QG�I]�w�y��_���<�0�z�&cf�\����H��5��Z��ʛ��`�jR��੍͎lO7���"���!G��O�?�뮁	Xo����h�T�5I�������ژu�1H&I�f��z��L#�\:�x���GÔkv2%�Xe��
5)��<��c��։]�����<�qkl�!��e���c����백���a�1�}�F\3��%���b��:L��` ���?��[��L*Y��E�ȅ�k�XBfQKb��������aC����GdB��_EŒ�%�v,9>"`)���p���0|�{2�p��;���	��%�/3��-��
YDl-~��P�P���d�1IJbA.Bb�JX"�ǁX�%n�H݄��
����b6XG�{ܕ/���|��{1t�&a�����X��a��QR��h5��+!���6B�M��KA��]|�M�&�;V||���B�NNfTm��ō��#A޻�)"B��`�B]A�A��+�ʪ؊����/v��,�if�?�-Jωk��R��`���dN�4!���fBN��b`�BHL�'HG��l���z���)�((9��5��c��'A�I�/}�P'{I�w\F(�̈6�v�x��o$
HJ��6SY���b(���y��@�1����>�Ɗŏ�_Ѓhb���Z웩�/n�����,E,]_�{w*�Ȅ�����9n�a�)U#2e{	�܄I�<KHr��K��YY�Ӕ��-z0���HxL1^:L!�/RK'�	Sꏻ��b�3 &�>0�͞�`ua�S\%��G��1ք�<��lI��J�YM��0�䒑}�����A�Y�ڼK�ͺ�adY�tB�N?��!pjc}�n�F����4QJ��%�ߟ�&�$�@�c0X�k��˝p(����;�%3AH�
Fu��A���7w}n�� �'�ˏ�:\A�7���ODv����ȿ�$�h3R�p�3>'x-�&z$����!cL�"�J�S���LN��K5�?�
/pr�c���pr�iA(]&Z��*)��L����0d�
�s���rTЃ�1���F�/n�=��o���t�$��W�,HD��20����rF�PU�H:���&���%�'Kl�I�ᒋgf�Y�8���*�

����4`�F�fܨ*��T��}C����˂��R(}��_���a੬��UU�Vo20(B�T!�S���Y��S��n�b����=>#`�A
��W�I7!u�6L$��D���:n��5/[F��V8y
��J���2��`C��I��+:�b�u@¡JZO��몎�M�79�M�
ד�L�Rdh�R����l�x�HǸ��m�cͫ�n��];��-C&a8�s|{6A�� sԯj�w8YV��5p,a�x;c����%�J�复�̠t�E�T�H����JTN�,Eg�B˪�9��2W<>c����5���� �Y6#�n�$��5�ϫ>�0I<m�+K�{6���&��"A��h��P�iڊ�g$�UL:�!�Ho��84bF=�;�r�9�/�fX�cy�po���@�4A�Si���r��ͽ0�V���26�ϵ����l,� #��#��1o 8�K���2�q'�w>>q���$�-��U�$i7CU��qZ�_3��\�H3��~���%��\���� AM�u���P�2�,
���_:{?��$JB�yy���N���Eub�`��K����͘��J	�؀�۴Bu�-3��d��S��4t�(�����:�a���L�T�&�y"�.���+һiɪe��� �`�E��k�r,�Ng�
j����$�̳P�(��Y���������7�b�^�����ÿ�2P�	�$klEseR�7b�s�c�t�C��8���l�A)�k+���#˘�����w�lt��of�u����l�xZ�!���3ŐM
�R��t��f��l9��3
N&�K�3���F*U�^��b�-*R;�%�BO� �ځ��8"�T�!`�7��f��݌e�=�t)	դ���
K�}"娌�Hߐ2�m
K>��-�#�OHe�'*@�Z� k�o�M4�rTXc�%��Xc��IO<��
���vC�z���nVc(C&�D��\��ƅ��؄L��$�X6n�2�yN1Dߖ��!���&�/�yY�B��[�)Jj��vi:�A�{t2��]K� z�C|_B�MeLI�O9F��a��5=�V�g8��Y}�+eY��e>	�/�i��F����d�}r�
U�N��f�|��0H�jt�bڂ3e����5k6yE4��*C�,&
�4��yD�
X��i��º�O��ֵ���n
��u�KTy
^vÜtjb�bl&8�\�YL�	Ʈh�k�,�<�X�Qϫ�@�0/��;6�����K��e�B-CA$i��O���`+:�E�Xd�$��
�|�%Tspa�����l�����ItW��V���>�_��V��j�x�$�c,��E�U�gw+ȿ�ͭ�<���mơ��a+�X���8p,��FHeΔ�ܳ���*K	� E�
�Vo����7,���"|R�$�ǻXaĽ�q"ƌ�o` �6;;A��#&cQ�ҁ)	Y�j�y�y���ZV��nQn�2A��n���(�WlIH�F�v��ӐϟU:ʿ/������(.p_v����,��AH_
�d7�D�:ƿ��5�]��҄�q�CQGK�k`8,#�j��1|����uo|��Z��,G��Y�X���"��Lj���MA>I�Y�,�u+��MĊ��/2�p�5��[r|PR�����f;J�
�	80������X6M�W{z�R�ԛ�'Q��Vx,3E*ǩ[)%tB\��;�KP$�D]�t\k|�����h�xY��S��|w�T��-��pm*RQM.@C:����qf��] �ObvڎyO��NJ(X�pD���t|E)�cyي��v�z16��L��,4Z�@��Ğj�1��A6�I��q���M�y�d�n�n����0��c��P�`��2��b��8�Bԕ��)�>H9NgK����!#ꤻ<��&U��2|3ړ�՗��A����"X��~�B�?�E	4����$�f���!U�rv'�be)a�	��D�,{i�N�b](B�z��n�.�/,%�ب�Fd_@ԧ�"U�0�;�s�\�	�m�*wY-�x���+�V�)�D�dM圤J�Ɏ�6�m��Q��e��Yx'�=X�}Ŧ"Q��S1O��a�0��5p,i*�b��6���
p��m�j�d�����$���te��n3d�7���3��1	�RM*��vDH��Us���tV蕎A�MHz-y%�>�A$
���w(?���AGγ�����W�ӦK��"���TAf�����6	L��g2�d4�Dnhl����3�PMe�
I�C.h�B�Mk��f�xhI(Sd��0E�6YX�	⮁!�жB�����d�x?&R-���"�dK��
��7YW\�6�	U�!�%�MÆ�$U�&[��V��DƗq��jN�o~ܮ�AX�T:p7�x���"Qӊ�F\ȋ�3`b�tu@��)=���A���eE�DPX`�f��>9,F��X����{�I�_q(������-�K�.#�?aI�:�ɦ�pVk2��\�H�M�-[�vۤ�XS�+��YG�R�O�;-^vh�g��sb!�r
|R�=�^�MT͢�@ȣ�ʔ��l�p����M#���FE},
�-�� Y(9�L��Q��tg���ٌ�Gf�4�2t-�w���{����4��e��4D�v��'DI���t0�E@j�n��R��p\N�l�]|
�^)�%������f0���5��iذR���R3��肌�y�-��М�B#��(���G� �&�N�4��tƢ��%E�?�l����}��e��?k���.� �v!E;�ϊ\�j�2&��K�Tz���ZHv)�0V��$�&�x݋1� ml�I�ں'��E��vXA�X���g��2��S�Ȳs��L�)�'�]J�H8�����O��K�hX��'e]0�j��@�S��Y�m0j3p_3��0����x��)	2��K�������zI��y"kC��}3~�ڴiy���e��]�A�D�!+�ø�7�9�t�AM��YpI/���%Dy���Pnaf�Q�M����
MAȒQ�I8���/�f�tK)���n=*��I)vg�<4�D��f�W�*H�8v��lE�$�`Ds)�v�5B��$8마*��v�P�
�K�x7H�ٌ�'��z͜(#��+�+%Fߺ�^50RJޘ�1��%�nu�@]ȟ��“�����t��'QH\.������[�h�sְ�IX���cj�.���Ȯu�}�&[�ڵ��TiGT~޷C�]��ix	���)�Bc�Y+����`ɶ���6v�� �Kz~_6����5�H�H2�6��U�RiH�qӁ�fC�*����4:Sk�N�a�5Q�P&��C�M4�ep�L�U�W*W�
(��d�I�Ru0��	��<�X��6�b&��.�O�v#Y�5G%p��#�%��IL.��� �R�~Lr�5���:��
X��'��	�l9[E�I\
�6����)�'{
<k��H����ˌ
������2|/�A���광4�%�x��Nu��H��bo)�F�L%<,�
H�i��*��d.nkN6�S}Ym���d���,HT�q㮤,��t[�,A_����ɜ��Rp��b�ܤ2�Ks�"�+_k�6!du��و`J�H�n��臎�f�b�!��J'��_L�&�\m;,��X�Ě� dJ	�](���,�@��rz4�K8�C�M�NVA��J�k�ni{}�7��`���Y`e>�� ���B%�91R���j|
�4Q�)�ObY�ns�Į�Xy^�t[����,���Xf�
����V�����0�;YY��2v�Ukj�n�
��j:ܖդ���d�^T�SN��
!EI��O]�M!咊f�B��6Ŗ�v��, 'Xa9��2R�(��6d���
���m�n+](��Zk�M�|5MB}���6����V����؃(��Z
���il�EX�bO�/�!�!iI4"_9)��t��;W�_�t�m08�<y��p`��*�ź?X�<��#9ekgk<�J�����d�4��u%��e����2M5��C���)��:��Wu�A�-�û6��<���V��,�T˿8��Im���k�n
�m5n��s*�6�(s2=�%��!U�Oy��������«��$ݪQ��i�Sœ6���J��i�,1��Hx���+���l�n�a�����8#�^�'<�"�Jz��F��5�'���=�A��07�L��!�6�2�@�լ�k�1��պ]�m��H���:�	sW4�۾�5B6X�p!l����>b�x�n��P�t[��D=�!s�}�bFzk"��%���B�䡝2ݡ5�l)��["��LJ�x:�H(�?]m�G��"f�z�m�Y�Mҭ��e6-�-&kUYh�C��q+U	@cKS4"��6H����~_X�e���d�I�$f�E�l`������O��Ɛn)M�)ƙ<w���b[���9,R�/m��hR���x�~1�[�K���$q�Bvvym̒U>�-���U��Ny�pFY)�w��I�����
�y0���&�:�`����9qZ2�ѵ:��<H�U̠[u�_�8����T�MVYd�x��R�f83/YR�2=联)�
1�e����Z��@v��n���P��m�]*
�P�8�LY&�-��%ͻ�
J
Iun(�_�lH/5����<�@€�w�EЄ��0�O��y� �/�U
�l��R@�� e����7��G=�^�nh,��p���("įr^f�mןr}�B9pj(��D�JO	�5���vR0��7
��2�W�f�t[���_���i�P!��B�.
w�B�4�I".qf��s^x��Lt�顬�⺀�3�()3.U�0�n�"���l�"���Ӷf$��`+r�D���jJf)y����Hƨ�n}�{_��m" �9��v>	�n�$�Aö�%9n���v�F�~zH��.�bb�b_�
�Uw:ѻM�P�zWeV�D*
���^.���t[X��{����,l!.�i�[5G�wD{��K�IB�:ի��t[�E=j7�S�͌	���P:�P�mK$n��e	���2��nIH[C
��SNK`�y&�R#P���6s=XO���,ut/�k�X2q^n<��`��Z�n:�D'�.v�
�a8,��VYE�|.{|H�5w��B�I�c����,3�����0ʺ6�`�G5-ı�a�=�ցi�`e��C�w
�W+97	��]d�a%��ss@��P���Ȓ÷�^p�iQ�/.�S�<)���Ob&y�m�n�y�{�#�>����gR�-��/ǁ��D���P���mɒ�Q�<�sÍf�탮���5�	9�69D�w�V{��k`JB������9U%s&F*6����g6�v��T���A�X`k������c���u\�g�t9�*k��M.j3�j`= �*�f*y$�|;8�	H��$;��2K2���쥹2׌)	e�����4h��k� ���uk��iS,�-zMVk�X���6[5�A�ːO�<m���y�I�r��}�L�<O۵ �#���%��ͤA�E��I�(0�,���'w��bA�n�q

��
�7�j�0	4
!��i(g�"g�v]��ō= �49-s���J!JJ�ZD�_�R̎�M��ڮَ����n�dX��$KŦ��&.ݷmڧ�����X�*�ur*��J�q)���%�6�X��1r2�1���N�ݓ�`A�N>���r�;���m��Wu�Ȃ�#J�ʖ�l�h��-NӗX�����`��x��%�b�,W�W�ӣn�K]����f\N{� H�IpF:��J��@ѷ�.b��L���d ̮D��b�;��Y���m�>\l������-�O�x�[F	�p�e3��
��#�6�� F¿I{7��,K���L?��J9Y�$��㒄����D�4����9�&(�M��}�=��Tm�б'/kv��e+ �v	lo�i���J�ͨ�~��=sE(�3u�C����x�<H��'�Ht8�Īfbد�� u{:��'�V�(��%+�< �v0�*�-�Ƀ\c�KR|�$Ͻ��HMn�9�*�u,,�<~�4E>�����Ŗ;�s6pH�V{����b7H�I���C|�Y��2�@�'��{���4��v�;�c[�Yc�a.��O4�_Ӝ	���N[3a<�>�r� vM��GH��=�zdJ�,��]��Jī�nU0���j�^���<H���1�i>�4�P��,�<](J~�.5:ྴ/���t��y�!B��h��[�K%��z�ӷ���n8�jM\V�b��n7|^�X;��y���#�R���k��	it���Z��Zc�C��iD85�4��? o�T"?�fɽ�eg�hyiH����y�ᇤl����-/�1��ٞ;�i�;��hs�
I�:I:7r�bM��/w����X̭O��<�>��c�1��>�?��j��Y;}	}����w�&N&*6γ1��/��6ɑϷ,S&�T)K�.���n@
��vA���Ҝ�^�v�a���|$���_@F��
qV'���:��1�4<�
Z2�)S��>����&
�S*��v���켆)���*Eۗ}��[sE�n	j��b�E���!����J/��ļ��V�1����mK� ��3գ<d+h]i@##����(!���yb7|�g0�?}\��mE�j�gSy��괚�B�i|Zݗ�!
\'`��P
�cA7��Dr�`!�fo�B��D��ttƮ�v��y�1�L�\'��n�q	�D�MK��Lw��}Ȝ�t�X������W�.���=�*���t�팓O5�!o�*I>ς#�Ϯ��2�M��v`":$�~
��r-��K�O@��A�3Y���M����!��7B�z�ǐn7y�:Dn�ujM��:����ܱN2�fՊ8>K�b��ii��
-�
:�u� ��l�<��^�ݐ]�o{*`@.��K*�%!B�쑤�ѷ��� Ij>�z��[��R��\)/���$��2�6�x��dL
#eH�=SR���vQ��u_uH��VV�}"��w�Wk�Ԙ��j7��h�"���p�]E���c�l���~V�Cͪgٲ[����w�������-�G�^閳�����zmv?=�dw�1L�>X����<�#á�\d��u���I��w�uLeP�g�?i	%�U��<%�D1�l��k)N9,�&�1hiEL��x��
r�EA�n$�-s39$���I혋Ŝ����ޝ��H�MO�&�a2�$�:�z�������Z`�mg8�So�Ķf�`m��]�u!{�JZ��KȊ��VZ�������@x,7���I��:<�lBH�U�k6>{��%(��RX���/D�O��G/)`(��OW\�[$�·���t�ȼ<iٯ�C&�M=2�.%i<F�;V:�!�f�?�����?$��O��23��7QV���/g�%݊7])&Qyի�,��D�Fh~�b��L�~s��؃��(N�{�6c����잁�G�H*I0=��_U�Hk�#=�qb�������,�X����%�e��uH��Hԥ��	����Ww�����T�b�=HO^?�Z�-�/��C�͇g嘄A��TcO�<���1t-��8��̓�%�����q���C�햀m�z.���P�y�̹y�!�6CT�fs*s�Qv��]��0�S"�g�7�NBDR�C�=]��'���m
6���C��C`Q���TT"Ά���Q� M�h�;tj���s�&`��[D)H����vW\cTd��z:�u���Ԋ^�֜�0���3�{	}n���ʧ�Ȭ�8qQނδ�'�!�&ȁ5�S�	9�Ƀ�aa��T�QɄ�e�S�vOx��&�m��I����زӃ�qm��}x)��d:��&����¼N��n�Gx㼊���ӮH�*�~*�������seN�u
L�b3O3����»�ѳ93����>��"�D}����|.�T�t[=��#X�0A�6=�up�J�Q%D���c$Ez�Sms>�.ui�ۺ��豼f��+� )ۣ!=�I��< ���TG��@Ӟ���zD�����3�@%�KI@�*�P\�Q����f�}��.鶫G�O�<�.�����'�c��`Q�AW�4�m��_��|�����rx�ԟ���J�}k]�����e��gT��y�n�h��t�
˦s�<@��r��/��*��I:�ܣ�5D\����1c�^�k��2�L�b]?xwZ
���v��5���7��b=�3�76�]�L$��c��k�Eq�A�U��vI����/��R�M
��h�yImӦ�>�
ޯ{��n�Ē�bIH��i���$�[���z.���"1r�=D�y��BO.���8�-G�
$GY殘2�X�V���+�~$<�f���VG!�CE�`C�L�Y�f��x���=��W�9������9����%�W�Ȟ�sh�H�)&���U5�������ᘆsu
�9,$g	�u?
c��_�0Oe�{@�=���<3�*I���s�k`0�N�=y�	 c>���A]��kP���4���ԣ��e�9�"�)���5�~���&%k��0�4ž���7W�=�t�T�;��m&��s��[��Q�&�6™f'��
-�J���)u�"n����q���Z��,��*���Q6�{���4{r���=s*@���/~m�a+<�ÈQ�7T`�%Λ��d���������e1B��?�8B�%Zy��'
���i�GY$)�͕��k�W'
p7e�;\0bv�������Pt��j����Nc{�%7��Z
H����]��\U0���)�@D�š�u����a��X���Ǜ���4�S1��댱�:I#m��Ã+�c�ڙ]�[Ƭ+���3@D`��,��Ǟa��nd�~��t�o�-$��д����5c8,ݲ�<0��X�@��S��,�g�[u��n��-ߏk�X�n�aC6S흵|�Dl[%;�秇���R�״xi���,,[�6��y\��e��q٘&K��rHj�b�`��YY*Y���4�m���4�I�F����4u�ݣ@��UT�0��I'�|�(��)Kaލ������z茬a�B�a��=�s�
��"���c�A�$�����[O�/�.��S���C�49�|͸�y�)p�nj�1�9W��ã6Ӽ�p(�l�$�!�9OF��$�{� �Ys��G��<ݫJ���H��5<�
�\���ƌ=��Q<��ы?X����x��pF��[�ញ�HWf
�Jw���@G��l�>t���L)����P'H�Ų��2��n������@xD�D�q��7*�����XIIfB"۫�D݂�@��=�r����f(ȶ�v�w
���n�4��G�����7#�؆	O��`T�5���1�8��%H�<̞�k���U�Nt����8�,W��?��R����[A*��ATB/��9,Z��kC��[�]�*�];G����f���!�&����t�<<�Zr���o��Q%�f�<Y�W-i.�?l6���8�A�<̌�"l>��r=�0�h�g�Ip�ʚ_��-[�fy���mVl~�����aK&�x��v��ؙ�I�2�~�n�n������db~����Pw�W�y�	��B,g=��/M^��;3'F������:��Uȟj�?l+4�dݺbm�}
L�b()Zg�[eeY�\c�H��na&NGg�i�/��*��<ĉ|=]rz�;[>Q�5v�l��<xU�C�=�)�-�~p�1m��d��NI%�r�;<Iݣ��]����$/�~��Vr����Y^��}m�x��u�d�Ļ�DV:�ӽT����TB��At�Aٿ�&�F�����R��O�Vg�cR�����|��9�XC���5|�� �
�0<5��i<E�L��t3��%׌ik>��!1l����DR�$2��)�y��Ggk��^T����+�ԛmH�1��y��_��F1��19�E����~����z-$�-�@�i%��Ǻ�>�"��7� 7�aW8�p�u#�IJgo~}s�PKEePQ�A�8�"pip/_vendor/chardet/euctwprober.py�T]o�H|�W����/��ۋVZ�@_�FQ��`�a��kf����g6�-O��US]�t�}�C���hJ�Q4���gѿt���jS�e�Y��Z(�L�$�TJ�n(E,hKGZz��G~eeJ�dr�8P?e�RQ2BEQi�
/�v�iKcw?@Lsc��Բ�Ѻ�1����
WY㩭�NtK�ϟ����B�h��:Z�c��پ��ho���v��?�M��Ns�6VtGP����~k�X���
[7.喙���=Pm*J�&˙t{z�I��c�/L&�	U:C;�j϶pG��K��Rzb��̫��)�c��vL�Q����԰��Ѐ~���D�y���C�>��k�.K���f�o!�&�i�#2�h��ӌ���n�=����a�h�T9�+�j�y�|�-
�/�.�4yy@-�F��3ɢT���
�k�d����G�Q�Ҩ��� �i8[PH�p����8\�|����A@3-n̼d�������{!�۷���:Tm�+c�)Kl	�E��f�����l�ɜ��]z����e�`9Ϸ��O�.��C���F>�9���ۥ�q�)�������z���1"�>4�>��#�n�rk

�u�ֱ/�Y�̯�M*�e��!�������j�H�R��2q���3GhN{���0XF���D�sT;���<犟�W�d5�=ƭV��s��^`�n\�FN����Y�:�U~�7W�t�QuiW���Z$&� �˅�;?K��}��J4���_����q����E�bt��S�����(�c��}e5�୻���zS��Ux"��7��PKEePQE��c'�P!pip/_vendor/chardet/gb2312freq.py��moeUv���W,	]	$C��n+�
(:��@�
E�/�T�.+�Llӭʯ��yV"5�>��9k��9�s̹����ӧz�U���gO�z�|��ן�s�o��������_n�^ݖ��^_�����������?���ۛWW�w��������*���׏>{{�x�O~~���ۻ����ݏ��w����~|xu������C~�����_2p���~���������;G��G]�3����7����>*�<��o��<��-�y�Cy~�p}����s%�ݽ}����,�Ç��o�Rʟ��|ss�������%3|,�w�w�o�޾_�����w�ڏ�������ǿeb,��~)��ޖ���7s�l�c�z��w���Ow�o~|ǟ~y�:�a֏�?=��������CfZ�t���>���no^��_޼�~�p]������o;�y�~"勻��\��u�������O�O{?�e�Yx��s�?�2�w�6�q��'?��-�m����[�}���0�[̪�p]~y����ˌ���}���ey��w�_�<�䫗�1��N�՜��槟c��KVu���]&����g��O<��ٗ�^~��x��/^�/�~^��o�<��o�|�|���o�~��R^\_���l��m�n������ǫ�ۇ���r���������9�W�7��r����o����#�m��͏����e��Ml'�w��Q~;����O.�Z󦫷�v�#x��q�c�����|z���[��$�]Z��ǵ/��o_�/����W��A僋��O[�-��_��/���w��������+l���������׿�V.�黟ʛ���3�Q���cY>�O~�P�6޿p��/Ԟ�2�__8޿�ly!C��'�����<{}
t�j�x�s������}�Ç��?~���9��q�L��?�6�a�(�}](��#���>}��ρ��}��8B[�V5�v�6���?��˫7�MpM��=�����<��_~�ͳϞ|����^�|���o_>����?�|����|����_<�OYξ-��J��/�����O�����y���E�zY�q^�1�e�۸�g�?Dz�׾�k������-o���V�Yc�{��5kmY//2Bl���qYƞ������p�[���r9�m��g>��m�?c���d|~:3J?Fˀ9��rl��h�R9w޳���\�t�[�'��	����'�;�˚i_��e%c9//J��W��R�=�Z�кdeG�%ӹ�yce�KF�k�5��F��2��a߲���GVێ-�\3šy�޲W�2L�#{�1~=�Liσ���k^e�ٯl�h��2’�=����-�#����E��/g>�pF=��r(���nG���q�Yٺ槲2��Ζgfc�9��M��3̖}�-��ʡ�Y�7f��0 ,f�M�a唷�1�W֝�j,���WϏYN;3����M����|���&[�j���
,&�Y�<n,ً=���a�X��:����/�l��x&��l������a�##�^�Vw�J�!T�f�S:G���򑺳K������G]�$̹eb��v6)n���l��t3t]r2�)�x6/O�X�{�̛���0l�&����I1�JN���y|e�������u˶�3?���z^�Ge�pf�b�y\m8È���.a�'Kٜ\0��E��O�w~��a2֊?,1��9CL2��9�l�q��n��EbJxz�����A����
���&�)G���a�7P�>�O�Uue����|�>�i9�#/�O!Tz`d��u��پ873�mc
�9��.�?��a���<bK1*v�2�R�ȅ��bu�wƗ���&�����<�%�_�s 8�����WL��u��
]ȬX��dh��U����D�,>���Ẃ52a<���0F8<����1�ˉq�`)Kˀ�0�������T0r�8���wa_�iƭb����BW�q�i�3�K���mTQC�b��U٤�Z9�<�Y�a܃9�X�cݍ �yr׍+q�`��pՍNJE�xl��s����1���oY�r�x"OKv`�sF�x�O�X���8dN1����!ƾet�l�ٚ���ٚ���s�c�˶_��϶dGz3(Չ���[ya�`r\��]�k�=��ʮ�v�]�!|e)�.�T��3�/��g�@�Ι����+��6����6�GL�F���v���K�,攽ހ�Γ�G�d#��>"f����V�3#�ċ�� ;�b�&�HI���sB^�����(�c��9��@5�Io8��y�����5�3VZ�.����f��I�V�����]Y�	��+��9�v��@c2��U	��6���)0S��PB�Xʂ�IY��4ň���E��h H��zn�y��8���0?O���@�F0�H���x�I\��jL���Cd�< 3f��6�8�^��:/7pz@�B�0˓�B�i��XCղcؕ������Q���e&��*Þ�X1K����yp=��F(
6�ˀH��`ZM��RN�o&R��8���!�G����8����ڊ�Sd*2�����=�N�5�p��A��56c�-`�/��N���
d)�lX7����ı7��1b�a�\�}`�	ib�B'2P-cPA��77F�Vܶ��|'����5����I8X%�u��k]t�J�`�|,�F�S֔S�l8��V%"0C#�Y�.ee�'D{c�1�|��n�����:/�^v�]�l�Ä�V6$�BeQ��@�0R�:��'vh��l+8��y<��7���ra�f��d�P����G�.d�/*�&�c��!
�b��\7�+ 50��! a�`w�Ũ�rB	A��J��{�.�Sк7���؀&B�I��>0��e
G�1���1gB�H��v�G�J�ZW�
�5~/&C�hCv��X�v��W��r!r!{����b5����e�*t����6���eY��A-�`�92�|bl��B������W5֑o�"�M�N|�&N�_�B��`����>�����}#h|��R�s���p��.���p�&�4�&��L.���1�g;N��s�G8��`r�G�	��y�&�#.7��Iڪ0�O����ɡ��B2��vn���Aa�x���C�:�����`��}��Cd�
Y=y��O�;��]𐌻�������=0-��}�k��a��#]�+�N�φq0 �e9�-g� /"�B�B�d z'BC�*��� +u��+�����h7���5��@;�ʼn���#w����}���7d��tz�Uv4U��a�a���6�2��L���P���\r��qH��އ��P�PC�A�8�ʃI��i�wal.�E27���ؙR!Mr-%����������Ć+�n��o�7��/�{ؖդ9��Ɋ���#�Ģ
�V��bH<�~���Y�I'��*���	�v��g=�Nle#��}_[%֕��3%��8<`t�G�#`7>V�Eֹ�a;���H�
IA�	7�"�L�?dU����@H����D������rҚ{H4��f�V��.F$@t��6���JLD�*��&�0R!d�|�ugP�=�����Zb
]�	��ċ�4s&+&���(l��"yX^v�˝#׃��(?;n�,Ŧ%^>z��@#�qo2�E�G���I�XUp����M�J�04iF<e�
gZ�p�ڍX$�?�lz���th�h��ljL0 m����Ꞓ <@a�if53G�WG`kp��]V.x΅�k�jݴy��!��)/�Ҕ|'�;�ڦƋS�.�b)��(q�8���+b�6<�Xe���w��o��#�M��Iq��ݷ)̡�-�b�;�Z�b�����ph�ԅ��w9�R�H�=��F6���y�<b���!��Ud���
�D>G�~J�H���9tNl�Щ���u{�=�4H�XA��P�F��fb���ߞ�<�I�����M
_��T�_��	�ͭĢa� 5Ь+�9�~�;*WFh��XMWD���:�3�0�):Wȅi*��`�� F���*sP���f�I��R+�T�E�T�R�$/�7�Lowt���x#v�Y����v\
�R4O%�U�� �o��e#eQ�fC�W�L��k�]4�7F`9�U�Qc�bS���*�lh�(i��:e��J�E
�ONJ��a���;$9k�#.��߰�[E�`���P�*�!4�!j��B �E�H�����۔�`�"��ΑS�D��=o�p��S�OM#��@�����@�;%��pr޻z[���E� �����(��@�/�3d��6v<�=�:Mp�JC��n���B�T�)[j]���a[�QEw�x�4HO��x#��P@B�,�axF�CŃN6�xLG�_�5�h4uS�G����nԝ࿟��"�y���L©�E211� H!��C���U-I [Zd!�j=k�s*M�bY��排X0��	Ѥ+�f7
��Tso�F�
���&�R�0�J��@"h��:�1� N�1���-V"�[�[0���F)��@��#��w:���g1!�������FIh�f��@qPm�0�
��ũC�mN�,E��&M����2C̴�_�z��8= c�����%�
��Z��F�h�2���N<e��d�/��
�0g��r�@����4XI%�J\�X�)R�ZLiE;'�Z��A!�U�m�$�nJJ��XQ)@$t �q����"�7������Y�$�6e	!�8�B�e������ٵ�On��S텼��-���g�.`�CUdElT�j�7�s�Q���>`Q�I@�F͠@r 2A���L�f���2�Tt�84����8��ch�ɻK f�a�������g��z��No�zV�v��"�aA��U)�Թdg��/:��B�6�މ��o�qTY�bBf=V=%����3E�#�x��9��:�$|d����_V�n*��~�eYk2L��f�fy�g�i8*�MT�}-rB+�`�r�sJB�|u(���9#�J�0]kˆ<��(1����L��|�5SSqk�DB6Պ!�@G������j�����s	�y�3�m �E������4A.7
&�� @@z*�o�^4��z�,�:�E�5!T�8�;���V\��:u�BE�=��4+�����=�$Pρ�5`	l�Lb3r�9(a���U�� �o��{W��H�bl	�v�P<H�@��T}�H���[�A ��(dZ���4����M?M~��e}�/�?LQ�Н*��l��#��j,
�"���2C��K�l-��5F���޽[ɶGfX�}d���9́�!v�7S"���s���֎Cs�ȳ}�,�aH�B�T�kM���[N��v����1TO�5���@+�5�mUǶ���)p�d:�E+uЀT�d~Q�U��tm|�-�'�r(���`��2yW�D�����]G5�j!bW�+�b(���,����9�s�BT�g7��4g� ����m�|t*����j����eg=�*<mGЮ6�6���,���f[��>;cX�q(U�����U�e,����(\R&Y&����A��&���dR��!\7�S1����<�D�"��HW�N+�X�HUOi6S��I�(H6�T��Q:MҧAx�݂l!��p�j�2� {��U3��&�%�Ї���$ʈ��!z丛�<G�ų�Uc�x��6]���m[��#�n���^�|9���3�gdŪj�vl���e�
�5�j��v����QG��d��fndFO��v��mgbP"Q�M�.�J����!��Ҙ��D��D#@��n���A��b=ˠt�8�
_vK�ۉ���UJ$��f��Jam��	��@I&z��b6�{�h~��L��0
RdxXw��WJ�Ղ��؁J�!'��
��T0�N�����cQ���-c�w��fE�dN�&�����9����i��D���C�C��yVy-�sn
q���ό�L
�Uj�7Aޔ<~Ζ��lE�M�v3�e�������@J�6�\�� cS��l�0l��ZQ8�z�]����ā5��7�/��h�Q�j�dɪ`��T��-��MP-���'D�v�&D�؄f]Ϛ�P9mHV
2N�I�bXL$g|T1�IM`��(�( !M4�uLyL]�0�ҙV0O���ʁI:=Q6G��N�l�B��تwZ�%=�?(1T2���Cs0R�6��Ik}˚�r�ըe���܀dR�n�_ڌQ6��l����ʛ�ap��;�N�=Q�wX�����' � )��6��Q��چb�TV���H/[5�V�k�r��j
���jV��פ/$o�%��hq��
1��؋
t�RC�=9��H���S4.�!�>+>��n����FS����SϦ,C�h47��B�� *TeQ^b6q�Vojt��L:ۂ��A�c���b�̢ʭ�z�aO�iE�h3ˢS
2t�I'�@1{�v�4qa�HX�Y�`��
>ԉ\�b%?u���@�#�ǻJ�"b�b"R?��O{E(h���
�6јu�$��O�GF4Nk�{�fM33��/+4}����r�W�@Oᨭ-�6�4���xV�	�&��,��B!T��I0L��p
�r(���4��4��iC�	��V�:�����(�얨lq�J�v.��eivn�vk��o�3{صH�N�
�-J=����x���o�2ٕ���z4�PJ�z����1Xx�Ϩ�ۯ�
���{��[Ag�(vP�8X�m�R�i���V5d%���$�,� �}y�,FC��lU�L�i�6��	�8������I
A��؉J�J|&y�6�|#dƽ0$=������&S�-�63�**!����j��P�V!l�=w�:v�[�?�B����� �6����j�9/��:9ao�{��"u7���)���F���?/��
�LX��P�e��95K�
7;����9U�w�����K궢�A�/�dd���5�X]U
�N/6�Նml�!����>����Vj—�E�����1Z��`�O�C��,ձٶY�e�0�#���,Ԧ\���V73V�t�_5������6��C��>#�Ŝp73�j���X�%�D�PP@��͞�GH��Z����M�;�ޏ�R`����wZ�F��eKnh�rQΙ��k<�d�T���	�v�W;1��܃�͘2{^
s �:9��m��^m� ]��z"Ѿ*��0���j�f���J)�s�픬��6_���Wr*�!ld�
怉�6�����ֈ�R��0{���x`6Cec���x�L��_̶?�@d�m6���i!,����۔�P�޿P,�m��;�ζ[� ��C/
�9�Z��($��|:��]�n%�WBS��Z�X"��r�}r`��-�[W��"�"�tL��P�a�X��}b�0{�0պ˻	�f�jr�!��2X��"�eW�s��H^��bxf��[�DGxj�}ѤT�M�>��^i�0�ẑ6G�0��,'���Ŵ�����AW+&_�^Aa��vf+���+���^�����Jz;;
����D	8�0Q�Jh\�1��m��BCş��.Y"�@�叶�߫�C�$�>�C�
iI���+^��q̶E:o�H@���!%&
���(��C�N����<	J\�Q�Tg�^�S����,<dWHD���W)�H[��6���'�<��L�=��F��fݼ8h��*y�E�M̳�Pb�0dQ3�4��^��-�\����ے3�)0��rD]x��0�%^d��:pWP��\T����eȾ�C�Vk�8%�zڥ�R&��>^��s�t�S���:�le�+��L,eC�L!�v7�!����Q��H�M�vM
�cZ��d1�Y�E�&��vbdm�ա�K��63��GhB`�&0��6��j�Fvґb�*|��h�n��y��V��鴐J�a�VҳԧV�\�<K�&iH�>D6��yk`3׃�[�"��
�c�l����̹Z��-�X��2�6\[F�ؙ�z�����!��b_t�-6�j;���v�U���1�d+��B��*�o*���r�����e5Eo�-^DD����.=*>�RU]6�d�&XST��8���K��C����5Bz���(��f����_�%��;-e���(/�ɤp�mE1m,^Q�F!��#H�ky�4��.s=�i�	���w�]����&�k��RH����kU�J��-$̷��Tx�E#/�z��T���ބ��z
���`>e���^+$���I��g�B���=}��܅%��{qevnB3v۳�(p͂%�ξ,)��a�y��NM����5Hȟ��U��cCM�����ӫ^ǰ;@#@z�P�:��YC�xY��r��?��fU�y��d^��mK!$gRV��U��#۬�;ȣ8�!�	�PAx^��$6��J�s�j$ټ�eYF%V���p��a��4��‡��!�Ԩ��X�q�&g�2��q7ɡ$Yߋ0L�z���*ݼ3��
l�����2ݥ,
�^GS,�}Q�;&��g�F��V`�b������V�I�i7��b޾��˵a�^U�l�#�����R�!���,�ʝ�.�sۼ�b_��*�,�U��#j`��,���s.�,v�pA����$�� Hq[����]k�Z5Ŕ�fH	�vL���겆
4y����j���8ꂒߪ]
�ʨ7cx�WU�lLd�^7����S�ʁ���kCV�7���j;�҈J�� ��}��o��!
��M�����C�^�W`����'�X��4�T.�[)�vsI�gc��[����<�������~j_�ޮ�����'�R���m�n�/��U�E�E����w�/��Q��,��
S�!z����T�+@q�N��[G�B⡰�6�a��$ ���,�z�(<@Z;�y5x�����e!��xe{��ћ�^.Sw�Q�F��>qX��
�i.�~��l��ǖ-�|8��NM�\Um���5�t,IMf��Tݯ� �Y���fEt�f<�'��0U*i�ӡ)ŗ�W�<����:`�����%�l;�`4��X�|C��gn,�{{�2��UD��ujS�(/Ƙd.�1;��Pjڼ�z���΢�]��s삱
������oX���:mٶ�r�=�vNZ�����jI����g�JIh�@b�7��e/PnkæyH�}�^S6��զ/6��J�D �d`�ԩV��J`�5�W�ɘ1�V��X,�
�<
�SjC�ݼ�^�u^_�[;N�����Qj>�C��zQ
�$y��b�%�����T��Y��\�f�y0Aw�}��*�T�"��JJm�4��R�<�٦�з��nJ�(�� �ǴWRK�b�A��I�
�V,`��6Pkit��h�M�f��D�k��Ws�a�1
<�w�.X����/����0���h�ڥ�7N�K��`Fv���CʼV�w��O���7��0�����(�-�A.�T��Cy�P�.�a�<4���9{(g��2hwhd�虰&e׈����U�����pv<t������b~Ƀ56��U�V�xhm�ש��*���O8�"��EgK�i�q�d�C�F�~y
�1��ѻץ����z���V��W[��g���Ҙ3�����o�8�#�3U�Ľ�e9�jE7���Np���n�B�=ur�1�r�I	�/6t(��3�͋�j��#OU*�Y��� ���
k;��6���/������f���6B�CI~^��c/�Q�9{��X�Q����"G����
��G�PKEePQ~���6�#pip/_vendor/chardet/gb2312prober.py�T]o;}�W����ސ�Rۨ�]6���%T�	��Y�굑�M���=�3MIu/O03�̙a����c��8�Qw8I����F�����k�����L�Qi~J�Dd�2ĢƱt������'Vf˖LA����]&��PYVZf�K�~ڭ�� ����xfYx�iU��|J������S+��ΧOAq�<�X)��ZG3vl�8�w��\U�ؖ����H�4�jmeI�
=yC��o�>�k�\Ya��Ra�ə�?C�զ�Lh��K������1��䲨C��9�	�=��=|/h�J�5[t3�VJfe��1	G�s��S� $=�����;b�|x���C�n���c�����A?��
�k��Ia���.Zp�4'�w�x�/ D��X#Z1U��J���Z�>��,���{<����j�4��ߞI�[%A���о�p�z��+qw0����`>�)�'3�i��d1�g4]̦����G����L>Y\��4p2g/�r��1^�*��xb�9c��"��ȶ�_3TF�w�r6�dA�6=[����1]������gQ�>tP$�����e�2ƶ�k���؛�N��]�M�h�"�ևz�xD��FaMIQ��6�:�[kV���Q���֞dS��]���u�z�<V��Fj>’]&
��>s���wa�������L�{T;ܢ�>���˗�h9����F��s��^c�t�lGA˥��Y.[�Uq����p�Z/�ڴ+�N��s1#���B�Wj_�_ڱ����_,y���}��b����S���.�(�u��}e5]��z�B	���Mx�t|�PKEePQ
)Ӳ�6#pip/_vendor/chardet/hebrewprober.py�[�s۸���?X�J��k�k��Uq�Ds�챝f2y3��$��#H+�_�gw�h'w�y=ӞM����.��������x�.Ƨg��3�������ڃ�u�0�H�I�Su��F%V]�I�T�Y�h
�7�B֔*6��ʼP��<�q��	��5�&�W�P�L������]l�?��K<�΋2�3������j�a��ua@m��E�z�G����K��\>T�4U7�֪cM�hba�4��"�V�g�^1k��xP�I:/����Re��7�"Ϝ�PP�L]lHW��e�Y�c?�M^�Hg�0qb�<�.���?��/�8�m�Q����.M��^e�&ԅ��T�3�) �u5M��/��d�(mՊ��E��sb��1��s�פҟ�I��&c�z1<�9�}��tI��x+�x�7*�5
�sة�F�X%�]@��!�Τ�FU�̪�
X�>���_}�S��'�qts3��}�	k�i����R�\�	C�Bg��������{��_��>������:��Q#u=���~�ݨ�7�W�gCx�1^Ť�.%�*���2�&��:I���	�`0��B?�92��XiD�j�l��ٜ�ŖF�?�d����u��w�};��ƾ}8}4쫗'X���&���d��i�}�&�%-�a�񋓓���'J}�œ�~����w�����Y�/��e�U�O!=�G!t������n��*8�[@o�l~[����9qnlv���J�醔�ϳ�?�!�3�Wzn��OS����Z-LJY��"��:��V�ʹ0k�K��ev�tR�.���[�}Bt��!gT�
|G�n�U�+b��C�S���^
~����?�#�+��ν���$����x��\��$j�h��+��:,�oZ���[��Y~��W��~�3�����CYɛIr胊rd���=�Է�	e�r�#s�fؕ��x2���|:�9&�c�*��؜%����M�*<T|.BP�)d���x<8���sJ�6_�Ll�D��c��H��^�
R�_&�ؕ���p��љD���?����8D<�uYAPho�03�_�WC��2�d���h��(�S('�h�ʋ^�H��F(OD��THW�3|i�:Yʃ���,2Ef�>�T����x�~A�k\�I��å�e�K�3p#���3YGNX-�Ԕ�Y$k�j(�Q�����_�>�UP�%Y�V1�3c��^5�$Ηx7�
R�6Rd�Ǽt�O���-�O�
�i_bt�ZBJ+2J5�ʹ'/Pߩ4XJ�lzC%��"�$�4k��Vo�o�n���y�,�C���j���1�>r�B�-UZά���% �na��&�Q�f5o�('U0��%jS=�����Ha�a+A���FlD�y��@0���T#٭q�%�BU�Š�?��^䩑מ��5�Qxum��u�|��h���o��p8T���>��S�$��B�2�ܝesb�c��Q�伀�\�X�6W��΋hs���i�]�~��v�l�>���9�r��y��3��UH�K��N�	��oykI	®R�q��hf]@8��/�ŵ��(#1��~D���-ju��~wA��8��R'ŒN�9�Z�
�RFP��u�Z����=/��XS�B�k�#e6�9F"#�G;��6���zHk�[�5H�l�8�QԖ�Zq�r����;�+@�/2Q�إz�P�h%=je��)���8�F�����cNp4!s���ȥkV�I+I�W��}�gUP�q�	�&Pe��(��jR�t/� a��%�rp������ C�}�v!S�K�����x��b�h��C8-�A��`43��S�B$�ru�%�inc:��@��Gpőw�p��/\)��"��B� &/���aj���k�7ؚgԾ�	mΚ�U��7��
:�����V+( @���U�����`C���;�@�V����P �%#]ғ%d�ڗ��B��f�r�56g�#�D<��?�LiVԁG��&mR��4{����8l�S�Q���B-Z�,8�i��>���N#�d�V	�r>CH�w� �o�y���w��m�S
6R�x�C"�R���Q�IΑCi��>�(H�b�@-�x�$�f�݌"T=Cs��W#�� 7e�E�N\wl��>;%�S�qQ�"�T����|[�R�J_*-?M2A����W�,����A=G��%�	�����փ���x܊�p�]� z���%��u�8Cg�k�9(a�*
�cT�(�R#�NR�f����6�RIjN��zE��< �@d��l��{�����;����Q�d��.�oOY�m��P����D5��kmo�$�gDUO
��G5�-$�	�5w��*Ilv�p�<��<e�.�����I1�g΃A�`1����VB�9�bՊl����+~���*���xT�VH�%�2����ҩ�)��T�х�T���S��cR(-&�(L(c�[�&[��T+_>��r�3���r�}!H쿩y47�w����J˭��/�h�Hj�45�n��ӵ�P�Q��ɭ`��:PK�����h*�mFM�Ť�B�f����,�z[�+m2ޑ���O��'E�o����F߅��&��`5���G�|X�d�U]�h2m��\,���R���Qcy��Db*���%l�����rȔΠbح�0��Ն4�c���Q�$_z�^�!6�SWYh$A��UZ��ɰ>��,�� �E*yP3�&@�U����B�>2��+����^��ն�ѫ=B9�T�'�PiM���'b����'���_F��:�j4?�\�\�O���˳Ky�K�&X:�0���p�:;�^�ɳ•�ៃ�w�#�e�6x��=��K �%Z0�2=�
Zk\$�
DC�ݹ|09�ѧ��kGɑ��&�6O�?���%�H҅����O�E�������ۻ�䔄~�m�C��22͂�}��˫�g!�H�'��Ʒ ��77g�'�Kz�4���z7>�]֊��������e[�����̸���dX�8jS��g��S<޻�t/*|�&(O��z���Ua��L
R�yf�g�%��5��g� �M	�k�Ƀm�}K�߭�fey�6��#�I
H��:���/�I9���oX[�7
��bP�K&�]"(�z��R@M���,�A�L
@=w.MS��m�Cu���,�5M���:knhC�=l���s�9�Z�Uߣ%�Ң�V��uZ���C!冭Ċ�7Qp��<�>3ͺ~H�
�"�9��v�'Xt}����K��,ϞdM\Pugu�x���<�c
��y��c=�y@Fc��aj�E^��P��n�󑟽dVh�,�a�Y�/��`���?6K��
]���}����ܵ����7"�Lo�2�,���5�蘹k����Y����T�qԵ�E�x0���N8�7f��|�@M
Dhl���nz�w��갯�D���=���H5a,�E+E�E��s�H�pwf��|w�� �k�%RS��YR�la�ӷy��ʵA�l]jY��
�IO!t��(O�Z�]?)n�L�5�̅H����q��]�q53&v�4ݔ���
�V�h�����
.�\�Z��`���F�C�_P���S�b@��}׸咳<MevI^,
�&z0q(�ɑIHЗ��'c��%�_h���]{���T�b�m��R�������ڤZб02���������Ih�k�:^�&wo���r��ŁC"����4˾�TY���~������@��d�4Rt?�:��:iK���Q7V����h�st�BA�Xgڽ�ڄ�Z��w�0�8�IF[�>ˣ�a
�|���u�(��;PG
����#nE�_A���[,�xQT	�C�\T��&�)��w��'.ԕ��J���S.��L�g���r�\6�@��>'��p��q�]�x?]и�#�UX鞆˨ ���P�Έ}��T?B3U�/u��f�4Ծ�u0MZȻW�y�QK��i����nSx�H�9�/ˊ��֓x���>�I7C��rt�J��Lʊ�����׭��Pl�P�^���hk��i�vXc��B��C挻��
܊~\��8�a�4`]fTtvO��{~�g�W��f#)��o�۶ �޿�N������|��A�C�W����l��7���1rT�����h��3ݍw�'��Ĭv��<�:!~�ͤP��~�xE,0w_>N^���3T�J�=I�}�_��ν�	��
�wK�K�����3t��~�hRk�qB\�'r1�����z��V�]�?8z��ޓ��T�BE|��	�z� �}�1�wR��j�j�:��5�d/H���NW.wfs��l��+d�Yv'�I&�u�4�b�S�j��VW|{vwvz7���)	��Ԙ�
��iL�= :P�~���+w��S�~v��c�hU�R1�y&��ޗ$M탺�4l5�M�d��7wX�j��pT����2��cj�y��_���;awz�����%���|��̠�9.!��j4�oEý�A�p�h�Ă9j�3�+�l=
�T����q���M�������X�rS�
��˂q���Z�͔n���?hc�Xo��~Cs���b��ou�|~��C���a�|�F��G�
t�ҟ���}��&x"�����J+y��vƔ�����7�te����1��,`�u��=-oi���C�R�/�O�����i�.�ܒ&��PKEePQ�9a0�dpip/_vendor/chardet/jisfreq.py��_�Ǒ��S$ ,`�-MED�]c�d�C�,iI
��"[VcZݜ�O?�;Y\/`
���T�˛YU�'#N���O>��������/���y���o���?��'���?_�on�rswu[��{]n˟��*?�����7WO������Sy�����c�w7O7������w�P�*O�2f�����7W��ao����û�}ȁ�w���7�WO�oˏ4�?^�ꁱ�}�K��T~���֚9į������䷏����_���'����������y���7�����_�w7�y���|V����}�����w���T���p��Y���<���ߕ��˛���p���q��T����C�����O����|���Ǐs��o�/__?杖?\�]?��|���ۛ7��7�w���걼�ǟ�>S_q#��)_����ߕ�w���������j爗%�7WO���;:~�7����j<|��N�ߟ�m��Ӱ?���9`>��V�������9B���ˋ���˳o�\���˗Ͼy����os��_s��H7��K�-�TWwO��s�?=��?g�g_�����?s�_�x���W��W߾,��w�^�~��_?{Y����w߾z�y)���?N1��k������ɷ�OW7�������7x���|���\�7�7��r�[�݇��5������7��}BWn~*w�O��o7��D�?�n��Lп���4�]��m.�����O9�W������'~��g�p��3��J��U~�W��G���E���ʧ���r�#�ǟ�����ro>&F�ܾO�p�ϗ�}Nrn���_޽lO�o~���������]�]�$�����M������ջ������a_}���4�����ms�A&�1����C�Ϲ_�Y�g���r|>Ʊj~��j�aG~��?~��G����W#'��G��Z5L����5���`�d���8X������i~o�yÚ����I�Ǿw�#n);����;㷳�_~��m���.��]�2����yq�����?���g_���^�|���_|��/��r��`����ꁹN,�۷2^�C��#<����?�z�g�}�s����?|���ۗ��2��7���2
����bӳi43��W�t��vYb�e�]��^���e�G���2�e�����`�9�_�Ȟ��qi����e;�w3/3�����5/����O�f����������n+����\����ȫ�ui��#�>s�Ui&Ri�N�z�[�E~�K;�J�d���f�T�|�A�9i���ys����47m���ۡ9�;�ya�9n�~�T�F�4�2WL��ڎ\�X<��Ѹ�ȯ����!בS�3m�	5��k�-���8�;��S󑼯%�y��_���|�|�N3��|Қ�ȟ�z���ƭNP���5y��sM�kv�k�ܯ�H�bu���ʆ]�\�\�\�ȢǢG.h��1����7���t�A3i��4��31R5�݌nF7���=n�9�����tw�'�������	�Aa6�pz=�Apø=�͂�AϠg�3�����\�ңңң��d��s�F�F�\�\2�7�7�7�7�7�7�7.�����ƲN�^��+׍��
=;=;=;====���iBa�Qc�uv��9�y�8�c^����K�y3�rX
ĵ�
6��[�
�J�sc�1�"��׸^/���-�cX9�	ؕ7XV.�׃-�ٮ��9�l�������o<d��3.�&��W+�@^�
��
���_�����e��V��2f�o~��Y�#m���F��3خ\���h�-j��(�h�]�m���/�2 9�`��}y[�w��3M��@5�3[�d�9pLз]�9/���0���Fc�ܹ�K�`����u�˥4����=e\�qӗ\`��k
n�#��-�4n`���B\�v�8�r����#�8?.���MqG���}�[-r�2�j�l'ü��Ot�i'�n5�����
g�=#�[�7�սk�4����3b�����/
+��r���I����5�1��Y�[���i�q'��!{:6Ա��64���4����$���
����.1R�+hܙ��iY��r������]V
�L������	bp�y> w��g�`��j�czӺ1F�e�G�'l�ĺ53�3�+�I�\0���ǀ�,L"ןн16Bv�s_��_2���<h����7��<�.a���T������b��*r\�}����ѿb��9�K�J�Q�5��>��`m����}ڻa��l��i���CM^����xF�_8N���<�̅��;��Gt<��ݷ���3:�QD��0�l�	B�5ˆ�Y�l:P��&/�t�=b���;���=:�%�l�/�%�+�M<�P���1�"��0�~���FHn!k��e�LmL(���v
V�QY���z�8k�o��8`�a��h8`���Y�&f�~���:��y���k6���
�8`�c���'n�q������c�c�uk�hq�@fCO��Cװ�
z�
=5�8
(u#h���4���K�$09��	&�,��1���@��ט�ƜgC@��[���-�e���.q����1�c���<x��>d<����.\L-�d��(P�@1�b���0�8q֓��zVz����	0`$�H��#F�`Բ���׭'/i��l�	V�`$�H��#F���7�|��gC��׭7�
��]�WEr��f�4�R��u6��Ax�S����۞ux�b������Y�V��k�b��(PĨe�#��73
��$H���'�6i�(V�X�"\0�F�iͶ;#yI~�'��@ƚ
=�d�f���'P�<M�A*P�@�����%���@��
$+��@����5=f5z�
+P�@���b$/���HV I��
=	*P�@��
a���(V�X��#yI~�'��@��
$+����
+P�@��
+P�@��Փ�xI�HB���'��@�b�*P����٪p�
F*�`���:�u��X�`B�
=�H#�T0R�H#P��H#
�40�N�>����7�f�Lz�T��� �M�L~���Fi`���z&/��+
�4�V#��l�	Fi`���F�.������6���z��Vf���Fi`���F X���40�Hk{�f�@O��J�l50�H#
��dõ�H#�l�FZ��6�%
�4��J�l50�H#
�40�H#����40��b�KXi`� *z��F`����40�H#
��:���\7xI+�t�ұ'���5�pC�jH@M�jJS|Nx���eA]w���K��:�0v0�H#��eõ�H#�t0�H��n^�J+�t�I#�t0�H#X�l�F:�`���,�/�`���V:����F�����t0�H#|����SX�V:X�`�cO:�`���F:�`���F:�`���~�^�J+%
q.z�ip�[�м=7"�&R�H#��3Z�V:X�`2�q���4����IC02���qaF�n�m�����#�02��#�02��#�02���x�ゕVXؓF`d��FA=��H02��#��=.�d��VX����#�02��#�02��#�{\x�+��2�'��
�#z��F`d��F`d���M^��	VXؓF`d��손�`C
"� Bi��F�:�
^��
=���02��#�L02��#hD�4�N3h���d��	V&X�ؓ	F&�`d��	F&�`!.z��	F��%��!gCO�2�'�iQ�	F&�`d��	F&�`d��	F��%f�	V&X�`ebO&!�Ά�`d��	F&�`d��	F&�����K&XAB̆�ؓ	F&�`d��l��`d��	F&�����K&XA�h(�������'�`d��	F&�`d��	F�<�
^2��+�L��#�L02��#���H'u����^7��,����+{���#�,0���#�,0���#����9�d��VXY�T�l�	F�K4���o0��ob������y�9�d��VXYؓF��'Y`d��FY`d��F��%��VXY`eaOY`d��l�	FY`d��FY����KXY`e���=ARΆ�`d��FY`d��FY`d�s��%�,����ž,0���#�,0���#�)��������떼$?�8M�T�F�iͤ�gb��eC�����y�e8��=��FO�������tz:=�k9=�N��G�c��p<�
z=��AϠg�3�Y�Y�Y�V�G�G�G�G���%��x�[�����������������ٸV�G�G�G�G���%iΎ�ӳӳӳӳ�s�s�s�s�sp�A�A�A�A�A��K,��w�s�s�s�s�s�s�s�s�sq�E�E�E�E�E�u��b�==�
2dG��hZ9�#gu�h���E�d�:�tG��dѺ��$��N"��Hs�™�
O-;�DK�g���7�%:��N� =���-�䋊��E��V��=	_���a!60p�� Hv�d <9zT��w���/
n�1>N�Z�
���	�1��%�3/��q�Ϣ��2$���kF��q��x�L���ʌH.�+I�B�ә'"3c�
!l!�4��Q4n���8*j���kA`3�Q�*��èP��.s�@qse��y�7g�h��%�2\f��4,w@i�H���
2Up�p݂�X��#8R���nk�qp^F2�@������*���t$14N\�bN,�XQGXsCE�Ӹ�K��Ca6��Tv�_�V�胎Dlh��=
��Ki�B$W0�7T�r'7���N��}Ͱ���0\�*t�H&w'�|��y9�y�97�Eё���W#zv�`��
1�c]�]^�+�����ۼ�ΐ�n�q��:�4�y�G�A��@e��Š.��։��\���t�ߚ�q#[	�&9�Fn�*t
�=�,�=ȯ�z8đq;yBnWv��pF��4B�NF�э�P��KC�+�+	z�nN����p2Ď55��B�$�
u��F�fՕp;����U����N"���dyG�q�}�'��ZT�C٦�o���tj"�d��l���&EӕN�!�
���%��h�J	0nԐ7�)���A�Iw%R���}�qr��Jh4�2m+Ǽ�v��BP��.-�\a=�1:xa�h��%�[pj
-	arXF�2e��TDh3�;v�1��l��[�����V���̑�Y-Ju �8�W�࢐�q%�fF��q�'c�Y2�5��_7�-Vw����-���7�C
����½�-7Ʌ+��l?��opb�s���~�y� �E�-'͘�C���n�f�|��0a�79`�I��vj�7	�l�!�/R!��r�8�@!١q��8@4ج.�!��Yg'd
D,�5\̑�k�2>��=�9�K��"�|	I-c�
q����u␐Qc�VV�F�nx����q��X���l!U�s!)DhN�H�:BA�42�F�l��"�5�~���N�K U�����;pY��Z��NAv����Q�S7��!��8��c\�K���QM��X�1Q�/��X�~	��Q��1T���{�&�%Ms��͑�m�-�7����1R�N���+I�BJ��A> �]��ޝucVq-�\bQ=�›6V�� =$�2e�� 8;u(F֯ Ji\x	��!,uA�Ŋv��d~��MzW��Up!k�<C�j�pl�qr�u&���J�H㞹v"����µn(���jr$h����r=*u��"P4%'kH%��ʡ�˂P�\�yp�m�	�����i��%F��d��o��Y]�m��������?Cd#�5�9U$�S�ԗ��=�@RA�3�e!�`��X�"�ZM�aAz65c1���MFqa��\��ҹ#�bмY!#ub��f���L���	SD�ָ�K��FaX%��Cn���
�RQ�����xjW7J)h9�rb*��l;���P`
�N���p4zG��)ʃ@��P���?ULh~s%ӿ1GNR�D��v����
�gD�3R-���fE�SH~B@���!��*���&�/5������|*6��c{\�^I��"U��� �P���EVA2�'�)HF��]a��wS)}�ڳ�
�vRќ�X'Z��������)���i��*�{\�^�E���5���y:J�U��V�}�라^WE� �y�s~����{� �3B1sA�7d��
!��"*K9�#Q���q�o�
T�(�M�é�0�Q�TH�N���x�-2����`�q�{
$C�6�Ò�6�W��ы��+`	�(@�I�dm봄�w��~�87��+�D�(D�F�©\s�Mm�h\bUÔj��©{
voQD'�5�:C�Zj���&�]1e,	ʲ�෇���9n�N�z���<�4�5
���,,��;2�B�g%T�}ͷ�p�^Z�)LB/����
I¼�P`�Y7�£ �R��7�MTƸ�K<T^��*����]����,��@-�8�ݍ�B'\D�֕]u���g�T�x�h/�
�1��$ <�
�v]R@ق�XMT�q��Pl��PM��5��R�O'>P6�h	��bR�E�9���56�T��
Y�{�"�V��Ň�h�AJ�AS�|)�G7yIED2<�Q)� ��&8n�1�޷���>)�$�T����I�:�E�&/qY,RF���o�cP�0�2[:��HK�Zd*��0�Nz�}�I~ƒU��������@���07�2�8�I%����P��8QS�1� ��Yv[���]9��a����Z��ܦt+L�D�/	���c�+V��¤3�h
�UH��7�!���8��u�8���%I.���d��_(�ł�FP�P��+�(<��7w�+OO22Pp\�E:�l��\6)�z
Y �~?�!�R�j�ϋ�7���]���\fPS�X(]	Y�R��R�z3&ԡ:en���1u�ξp�ؕ�HLlWL�
�{nF*�PxOm'|'�rCt%���W�SD0�M!ψg
�22:FeJ�+�|ˍ<F�����Q��^8|�3�RE��l0�*�eH|o�Z;‹k[K�%]�SEV��7yI(�#��g�47H�<���D��
����%^����ĨE*��8�K���4����dY� ��qa��)���䱽ߨ{uʐ
?5���B��}�8kh�d=�t�jGr&�k��o�-2��EK�H.*�?�H�tLI���EA/��?�&$S�TH�k܅�j�ߛ�eɐ@/��҄��-"8�$�Q�?�
��m��x��U� ���D�Bx�-�J���n�S�u�2�g>v�Խ��~�	���M,Y'���i]��JGX2��*�d1�.#J��u�N�z�N�Tf@V�J��)�R�D�K�c�u��k�ص��hKT�-��`�I*s�i@�(Z3Uk�}�L����>�o��Q�S�65/#�R�l��T�>$ɚ�o݈-�"4*J�yS��զ��L��u�̱z�c�C'�8faK�Ղ� 2y�c�KJ���:u�%���D ���䧸���]���
��l1�g�e�N<P�jT�Uŧ�KȌ"��S��W�*�,��sj2�[G�^P�"#�$�V��!7q,����`���g�M/�vh���՘�;�C�%֗D�X���6���eڡ�Bdج��
�Ռ���P��s']tBąh�G����`	b�Ç�9��d͵%�3�^}	b!�B���SY�%�EE���PIvzi�lDg)!i'����=�<�蒉1rG؇��-D�M:-_(H�8�셸���Խ:"@ �����X���b�ЄA4�Ϣ�?�;��K�����ړWS�:u&��t(�Up�-:�%�e[_�����Ɔ8.��ΨѸ�K�)`R �ў��%j"���J�t�M�YA�!��p�S��!^�#B�� �P)Zp���/��^���V��~H2��'��uK^�9X��e� ��
A)bP�hJ/Q��>����#T`V�����:u�&��CiL�r2�r�DE&P�8�xG�H~ٔAj�<��AݫK�"�*�D$4��S�aԭ8�ڍ�y%�mPDo�����9a���T���g�`l<�T(n�8�
G	{�����\�S�Z�N.33���)=�����퇓a	�:���ez顃��Xd.5n�ێE�%����J�v���l���[�[B�R��n��3~��5�B�M��R�c�޾J�)a��B)���V)�3�7;N݈��P�?��\Q��"���:�Y�[@5톩���q,u�$#�SZ~�e'�k�8Q>a�P̡CbD:C)E9o�8D��>��Խ��H�er~�0�����f��A�eHYX��e*#�S�f����/u�&��0WN��-�$�Z�FxU㸔�HQ<q�v�*�u�Nݫ
�V�D0�Q9�H�6)�6d�n���u;�W6E���{ݨ{-���Di��Q�|��&Zv���E0&��D?<����r�^ue&�_N�Y����Y2�R4��w�;���#�<d�qlP��]��M��x?@
�J�P~���T�qb����0�L�ԟ��%{\��ʡ����0'Z��Dž@֎���@�ӳ����Ub\�bF����rL��!J� �
H�M�!��X�_�8ꕶsz �Ve,�RR"��?]	��|�Sq�gv�/!��6ȶ8JVF�}N�tU�h�u�1T���&�����ѡ6�q�K���̥��1���h��U��Fj"��Dz.%���1M�m?!�S�Sj����I8H���UOEA�{huzw��@���<e�)Ѹ�v1L6̖�C���P��z9j�Rn�����N8��!d�%���6�a
�F���Bkhr$����)1/�)��N�CՖd\��H��o�#�hy0�29rP;�ni���E��G$+sQ%t�)*���UU�}ХȄ(*�m�*]x��5��:����m!-����Y�Ç���=	���p��!QL��T�ž_�^M�7tGCp�"jά�NW`�M�q1~�A�nÕy����ti�hR CJ��v�=��>�g [���H_��<�kv\�)�ă�����epń���ܢd���������
Niz{~�{��m�� Q^5�C+C,�N]x���r}�}@6�. sH�y���q!J�������A3q��b�0�.h��]*Z���&/�����Z��ʸ�,����Isܨk[���%�T�9N���ͫy
q��	iJ�NZq�Z1Q��V6U�FAᮑ��f�w>; �ϸ{*�/R���]��R�$�7%U�{�gL�)S�
�R_��
��ѕ2��T����*�K]G
����~_�ꝴ�w=mP�d+]��x"!Y`�;㆐���-��@G4��$�R}	&�vԽ��g�Qt%��LW�Ȫ� $�“�*u�H!�ߋ�Ke�_)��}�h��0��:�-��vU{��C�V�dM����E�3¿R�ɔ~WO.�*g��d��Y�%&��P�Z�oF��Q3Tq^~l)^6�2@��W�(�*�WR��^�yTP�j�4X(�Q�^j�:8�s���l+��"=rmR�����R��4�	�����ȯ)�����S��&"eI���K�{��W�$PCzX#B'k
�\�!����*�i���ǹ��{-ʿq�֖H�"v�
�C� ���PufUG�_�N8�`���iש{u%)Lp�*K�黢*a��B0�rR ��:�b$4(�[w��{�*�H���k����D�T�Ķ�ўի@�
�B��w�u�5�X�Q/��Օ�I�e���,DG��<\��w�WǮ�<���c&nz�ЊC\��$	S���Nj5�J����'�:�[���ߨ{����%
rDP�oc�/���t��P�62GW��n�$(M�cDžAݫ�+(*U�n�����tL�%檜���j"���Y�����*��S�{5��2d�1`*Q`���n��V��L�����{դI�u��
v'T�*�[�^2�t��B�����'oz1O�|�H��I���U���~���8�S��7�v\l�.�W�%^�zONSrO%WlWJ��<��F�#�#(��g݀�Q`B�)�V,���Ћ�8h���Խ�R�̋��;.޺"���~�:H���V��q�o򒘛�j�سrm�/�w�D,�PE=j2`z�T���+��	o����%���F��*�t��&B�~R=t:����$6mu�*<�1u��iC�D�)�+���%x�4�WB����$LL�r���3�P�뒌��B=tQ�-
ʻK��$�C�49�
�Me�J讝սV����	�SQ��bN�)|H HV�Z���җs�7�^
%6��Q"Uvuxu eVn�վ�j�}��F� 
�!ۮ7
�^�Tq%
z�A���;���Ô��He��Mf�����Lqn�v=LP�j��c&�ȕ*T��WՁT�R͠D��*�~�M�<Ƀ�^P�Z��TR&�zc��؊)�����*������h�+�Ʈ7
սJQ�X����%8����Hq$���P���k�I���_��/Qx}H)��0xf抶�g	ݜ*������'s�;ϩ��yY1����Y���wT�e,���~?��P�\D^����oԽ�}�%AȦ��k�c�hB��[�В��C7���,䐾S�y�������nꠙ�i�7Me���
T`*Ѥ0FeZ�����RZ=nu)�-�{a`�.Վ�w�UЖ$P�uAݫ���ߔwکP�t�
b1>M�"�3b�@����Eo��x���ګ�M5�z����Z�.���F�%�
���������;qD�H\�?����A�Ӹr}Dm:�<z�UqJ� �P��5�0Cb㊗l��$ǯT6;���2���%�Xئ���JRN{F�+�,����`�Y�0WѶ�HH�T"iˠ�T����+�������|�)z����EG�B~Ȥߩ�U�DX�.A�J9G�T��j0��z��P%����� J��t�Mdy)�ʥJ��=.��1\O�F@b���MW��28�C`)��v�9L�x��u����u�<d�U�!��R{�<�@L�N��;U�)2c��Φ�����-�U�C��W�����]j$6����IUAǵT�<6ߩԽ��Ҡ���ȗ
/Hܻ��)���ZWfV�"������T#El��R�j��1UWu��׈�Ego\ڗ��Cȇ�LQ_����D��w�+KMpeeT��*ZY���/U��At������I���3OFi_�_&H:�������D�|���u�Q��C"�j�.��m��3��o�I)��x*���%w�6ymj&�W
gʣ��P�<OVMy������^_)p"V]���s��*ݞ�mSU��5���{e����޳���(FBT���|)6語"����z��~�Y5՗�lJ~�h0����l��T�^�VKF
��(W�ܘI�����
���`ȱJ"���6��6J�AT�(�,4Ԛ
e�b���*u�����1ya�%ur-�*A�vݪ�m���.E�~����%Z���K������&S6d���
���0�KQ��i�|��*u��`�hU}����K�T�|l�W����k��9�%���q�%��qBM�#�J��
�^x��:�Q���9#%#u�j��W��K_��U;KE�q���>>��,�D�W�_;ɶ����J�H�h��0FR���I<*=+��U�ī��`)(��ګ{\�^M���Qbrl�	�^�K��z��JSav�
F�8��H�b*��p�$���վ�'�BI�٩�ӵ�$X��qM�������8�^��2�RW,�k�
��*=�!��v�\�uA���M*�S@~��%��@����E7T�o�@7����ĭ8�*��*����}������^q�����PKEePQy%jN�Lpip/_vendor/chardet/jpcntx.py�\mS�H��ί�8��J/{󲳱��1�p8:D��ָ�XIm���[oOe����Lč�
�R�de>�dVJ�ٳ����g������ձ����ObK�g;����mu[��Z5�RT�x�o�^��ݦ��Eߴb��ʺs��`]O몯T����r�ܗ�h���S�?+�n^ܗlت�;���oZ�E
,.����eїq�hFOU�z��G5ժ�G{B~���j����p���m'.ˮl?��������f�����}���h?��j}�Vwb_(	{�7��_5�[�Rպ�i��Qkmٖ��e���N<61/jі����+E�mZ��YT�G}hS/�r��}��u�ዳ7�U�)Iŋ�.[����ͺ��ί�yYw�(:q��u+�ԉ��	"N5���w���y=�Dz���H��F����n�k��5�u�=%�X+k��y0�Z�BT�v�t�>��B��M)6]�ܬ#5�j+~>�~y��Z��?^^�]��N�U�Vg���H�ݽ��B�U�E�?*����/�^��?��:�~��?9�>;��'��P\^^��yux).�\^�_qU�P�V攒���jȻFirQ�E�����*�vJ��B����2��D�\��l�n�[�^Յ�����n�H<��ŽB�Ⱥj�o�@??�D.U����V&�R�O���d�4m$~h�^7}}��Ɖ��Lc)ě+ud�?q|��3I����������-�B$��Uъ��צ��j5��Z�M�����(�(i�b��R��-�[壵�ժ7�e�=*���ۦ}��>9R#j�-��bwg7��+����%c��r/��M�L}�����K�IͷT}����Ԝ�r�	�܌�����$�����HƎdNY��}Y�l�L�[��[�����
�e��ۮ#7��ɍƠ/h
�C����2�[�[;�N��51�I�v�ܼ�Q��k��
J����im�9�i�^9�t�t�����c1�Gr7Cq!�Y�J�����1FI���Pb���5I�a�^�t��런��"M�ٟ����v�/�Fa���c��-a�<Oz��7�4���q��!�+s,�^�߭��_쐘1B'��#z���7��i`Pr&��@��'";^�{�$~Q��1sHHc e5�9t�yX/�v�h���N�0����R'N:��3N�0j#�FShPs�7���
*��jGI���iA5���"��<hr�$"��C6I��&^'�>�8�K��`RL�O~27���U�,��)�����4J�$Ӓ�S�����T���?�G�2}�L�	?aB�U'���K�-�:I�i��s�s�y��4"��~����#S��Im��C04'u�L+��Dz�2�8+q���>�CK䄏t@ɸFIG��G`�L"��H<� .XC��$�(	�^�U�E0�QQ�g5�y�?�fm�0�(Y�'�4�]=s�ӅM�NqT}ۆ��;�=�4JY�$Bd�<A@�t�%Q#��-D��\��Q�I�<�����!�R�Lے��c+bmB��%��̉�Y�>Ǿ%Pme��s�S
�z��Ɉ�B(���#�s��y]�������)P�=�� >�ز!��_�&�^�E29�Q;�tG�6��iG���)�<�'�{��@��I����­]�����w�({B���)%%$���C,�Foȯ3�q��)l���ǿ�},6�'�A#];�2�Q���P(dLo1Me��`��Ror&�0�{��14�n�y/̂��3Ǔ��|z��x8��!��y%�	+�#$u�Ҙ��:g�PN�����"m�R�9��ydJ���\�anDT��Kz���fJ�Ga�
�
_|�E#�xiX��<�{%>M J? f��E���R����dU���5�xt�8�x'��q,�@$.}F��I�O�a�L����	t�C����C�MD~8��O���t��td����)�5�����(e��8���!�����cKF��I���s(�$2\�"R�tp��v�=t8Τ�7�N�ӯ�*@�"����k|�ǍK����#��T��XHy�3�-9$ʆ���C�VFc�����i
�\O)bSn
��Q)����A3��.�:�@���I����2��J��q��Ұ�3�`x~�K�+�ḋIPs��A�	�
$���~h/�y-s"��A�N��J[��1�`T8�	!��Q�
ó�ؑ~��xF&�T2̣,"��>��4��fQ8�<~����q�w´]`�Lԟ�&����c,.(���;"��`xy��J�����1
�B=��<��1">Sh��i�e�<�E�G�P���0!r)ڋ��8����$a�=�FXzdP:��8
�[/�3?�d���<�Q�g�`h��{^�ljX�mt�)� �Ԅ�y2��ќ�@��y�(�㓲�A�,ϗHi�|J�_z����/�)��G�s
^��%r��
9*��މ���J��%sbcW��
"t286L�X�T�1����z�2�™��@�L4EW�@��3&�$����&˹��a)�\
��{��˒��&P�j
�r����'���n�m�)3~�iH��)�S&����8��"chz*��@�p"|�`�Fa`���M��ș���G�⌄��I��e$=0xb7�o��`\P����}���w9:f�������NG���j��6	���*Sx��_��KR�(Y9�zQ�f���5�͔�g4�\���ti�2q�*(�'z��,�L��I�W��)
M�M9�Yo��O���׸z�<*�dL'�&�TdHdD�6!��Q�w�@dU��GM�H�3p&�*VEBR��q�28A"���(zC{6A&(�@~�ܱ�IZ���χ�b��{&��k�B�4�74���o(�~�㈜/��c'����4NT󈞐���=y�A�ɖ2�DS ��l
	P��ɗ�
%��lH��$BAH�	���3�i���^�-AU�-|�_b��{T5���S.�h[�GT��*����L*t�+�w�{&�lP��w=�i�8�˃�7pa!�K�6$S[����}O<��bVk@)0�*�h�I\�2M�P`^v'b왰�;�5{�,֞��@w��T��kI���$�aÈ,a�8k��3�i>
�s[t��W��AL#�5Jfrx12�7å���E�E�]i��z���F�|4�����M0��8B}��](Og�OF-X�����p(q����q�;��j�j�xt�,#ƌ=[d�rɩ�B
�q��q[&�����s�ta���+{����=��+% |�R^���z¯�$]p��Fh��q�uBR
����X�v`T�AG��F�e�J�9;����צ.���i�k�q�v��	qx���3)���ny��q��z��~���\�ŠsΓ��
s�W�k�d��C?�p�<Y��@|GOt¨�믉����]�̤���r��N	
�b��Q���6(q�� �;$�v*@�O�����K�%����OyL<��q��ӂNWM�Υ�D�х��@�ԐT�Q�+gO�%�>��%F�?�̐F�%dD�;��yx-4�Q�Pƣញ�Sx��Ġ���&p!ؘ�#,�
g\b�9��6����|]t����/�+�sn�u�~�n������{��������������[�9����z�����Ⱦ4����߼x9�<~5�~yy|���suVƱ9����ι��g���T���َ9�(�b6�ꪟ�v�r�t����o�b=k˵�t����:1늻�u9}�.˅c�}��g�y�Y���n����&M����l�P�&��g��=Z�=��5�B<�=�'C}�g�!F1o6ʬm�G+��V	kw4DU�� ���Oh�]�^��=1@��Z
�q�؛�盶�w�l�K�$f��;5�fR�f�mU
-�J∍�P
m��ꇺy+���O�~�>�����v�ϴl�I��K-�~�Qr޷�Ǫ�tF\&���>`�\�z�ʤZ��vSF��^�P��h� �FQ/�%�zc��^�,k���H��$�,��z"��Y׷�~�ufT� �,C��a��-�M[�0�ɔ
n�ɔ��X�~X�\Df�nJ�G�)J��0O5�+��;�37fw N4��$$��5�����FòW�}0��L�� �bm���^b6�^����GIe�*��@��K�|�4�yV��֯�40�~��h�P�]$�1~g4J��O�w�>S�E�N�v�:wŇR�m�K/*������Ѭ⾪o�(���\k�$�����F^u�m>��l�M�49/?
{Ox�o���]T���mƙ"#�l��-{�y�����J��H���ձ�}���R��Ƕyɓ�QB%���S44-�{�'V����=���w���-�c��*�dC�����(O�D�9��d���M[���"ɻ��w�:x��z?��m�0��o�ʺ�ܮf��/�A���65M�3lh�V���j�p82���_6��;j**��{�z+6��C�~�,u�?�=o�)'Ӧ)r�h���e�{�ù�`c`s��0ԑ��0>�M�/#ee��^�xz5�I��n�'�Íb�݉1##�ށ�H,c5����.�4���zyzr=S}e��OE�j���{<	6���e�n�?3i�L��RT���	r1=��p�(�_��˪u>�V�y8~�؍�Z����o�ߜ�?��zO�?9�ɐ�w�(�����O?k��<��&M�z�L0��"�a�1[������+J
�cٞrYNҩ4�^��-�BI���U��G���
��x�X�b�Δc�I��o�~��r���{��c��p�'ǟ��r��
}��g�gE�RS��i56�g���<��
ϝPKEePQ�h�� '2)pip/_vendor/chardet/langbulgarianmodel.py�Z]O�H}��(Mk�ݒ�q���л43hi@@k�O�$Xc��t�����)�-�а�>�I\U��s���͛�����Sqr|pxzy(>���C�}�W�Z���]�F�8�Zą���+N���4�Ge��y�s����q�1$����$[�\d���щ���,��R3�q�x̗Y^=@�8��z|���q�Xi욊rҵ|���R�;x/�l6����;b?I��-ą.t�M/jO�����|W��È���wq'wy� > ,E�����>K���$�ɣ��X�͵Ev[~���1[�y��\/�V"J������"�}��U��;���Ca8���8���_t�sxs��I�9�O�N-�B,i���L��5q�A}��G�c̓�o:/0"Ԏ4��}�X��Jh.I�=@?��ȍ�N/�Ӆ��J�=��(��ߑV�F�U�oW�
X+~;����˕�?�*~ۿ��?���k�4f�ZS��D
.�ʣ�|p(�|xq�+$�?�_}%�G�W�������B���/'��������Z���>��o��!�]FqRԮExL�>��湎�Q"B�,��$K�*!b	�(�[�f�/��1r�׉.���H���/����!���Q|�GI���%-���@I|�a ��r���qx��-����x�W�U���}�Gs$OQ'ªXEI�(�.�A��@�P�P������0��:�����\�i5����z�-W�\Eu�V��7�"�}��E%��D�J��	u�\�Xy�$z�jAIO��U�R��D�*�{�J5��V�]l)i���rT0T�hБ�p/]=��_'#RT��Aߢ$^x�	 ����o����Q�w!��j�oR#IM��&5��(�{XMX������g���I�wqK<�L%��'X;³�Ԍ��%LO1E"#_��`���S���A4�5�	,M �$X�����
�g��u�jB�5P-ve�fBh`���=#�b���}upV��!4�PCV��W�(p��H�
�X0���{�{V���)p�ހˁBI,'�RI,�X���:�u
��)�Su����W
"
"
"
"!h'�!�B��!�x�'և�JM5X*�T`��WL����w�>x�#� �J���R�%��HS#|a���
��	!�(H���&��9��JG�0%)�P��$߁Np��
����)�H-H
,	RJ;E7�+�Jp&�P�`�
������	
�
+N@�r�>A�����~L�#�l7uFjn��m�lv�?��w�v�i�ImdC�1]��b�L�2�U�K�[��Vj���+M�.�;����R�&N7j:QՕfu?Xw�]�7E�$!U��+��BTg]��Jl��˛��͍橹!�ys[�Ns�?��)knuW�	A&�|��8D��+��u��_0~�8D���s���,�);����N0�S��5f�(�;jVK���6��`'�7-�$J�j��-?|�RG����4�j�[V��@�i�vG��>\�^��e�Lw�.�^|��LxA�%���}�jM��%5�~��m.�h��G0̼Z�I Uѫ�@"P[��䁱\�.;��55ā|)�A�>�+j��y�Ǥ��ڔ>gF5�l[r��_1��H�u"����ײ��u����~2�&��[p�����lU}�n��\s/}�s��@:�~0�Q{jP�kj�t��kւ�4l,K6�T�v�Uc;��[����s����#A�T�Q�d�}y6�W�F�+C=�A�
 P��_2f��:�\��Nl:!Ȧݾ��+o�څv�W2����~�0;�]��f'�t����׊�6]�vۍ���g�A�6�Tc�G����#>~��un���0��4��d���_�L���a� 1;�_�v͞�|{�t�w�u�fױ���7;��D��f�S�9�[���
���L��ڳ^K��:��`�)�}�3_1{�(p\�lm���c?�t��<y!�,��ʷ�~�')fʳv9Y�"��]km~�,Z�l���O1k��
Έ��p`O��d�:����mlX���vKm��r�$5(��M�5�Oھ�'4y`{�9����	���A��Dw���I2���r�[��֩��H�"�f�2�����ڀ��v�� p�r��@��o�����Sn��P����<�]�n�<
AoG��Ȩ��v[�?=~�Rl��#xP[m���Xu���bc�rD��"C@�L�U��-W�k���Ƭ
ٸ�V��Y���f}���f��6��͵'\����(t�|�˨�8]<���-��'`)�C���u`l{o׭FYw$["�*��a��Ife���!��6���ٝ�/[6ۙ؊�� ���!O�du/��'�-���g��F�[��"p;P���}�M�5����v��ɰ5��o����3��8�ݟ�A����R��
y�˗o�U?+^��Awt�%�}A7�}�m���&�����V&��EH�V��'9��>xgj�L�U��A��i���?v��JC�<�<�[+�Q����3�m�/�I|N��O_��o�CU�
��e_&��`��Lw�{��ޛ7M��̻	���xK��^��uFox]?D˷{b�>�-�M���2���X��ji����Qr�̊�^������`g6��2�U�k������~���9�EI�}����u=hL�t|y�a:�>����\Ew4���Q����y��^i{�'�����`��T�PKEePQ��V�F(pip/_vendor/chardet/langcyrillicmodel.py�\mO�:��_a]�j+���yi�(zQyPU���L��C2�������$����0e�.� rI�������0�Ɔ��}����wv��vه��Ol�솷��obv�'�I��N6�YR���?�l��.M&Q��l2K�d�lzj�~��	F��g�<�Yv�J�N��e1�污6����<˫(f'Y^�O�8*�)���4���r�5��T7%{���xN�M�=��S�-�i\��xZ{���e�\���św�a�0ʿ��dv�'��-��%+3vr_�di�?B5K.�(���]�q̊��޳��M����4)j�Dɢt��,��l�\�S�]:�;du緅��ǣ�� .`)��qoN�.g���I�1�
6���FGj�9ka{�W�}���i��q^���M�fk4��~�d?�9��o`�=�!�����tʒ�R{���
����]�쮈��f>4@�}�?���9�>�ʾl��n�}YDw��ZSr;�^�QZ��p(8�=�#�?��%�Ϗv�����)�f'ۧ�;��O���ӓ��M���X����
r�+����i\Fɬ�]���0p6e7�i��	�"��~�β��Ct@߳䊥Y�y�}��B�ί�O6}
E�Rp��{�T�Ͳ,�ه�(I�pc����}>CϢ�{�#IeÃ�O�����Lz}]DŽ�xF�v�фpt��	�>�.g�;��^Lp���.�qq�ٿ�kO������<g��Ը��&��H�$5�\[�&��[�~o��h�!�m싐�	4�!dh�r������B1,İ�
0l��`� \hMX[Æ2�L��CfeC�FIMu>D5���?�����b�K�
1�%#�sX5�����f�ؚ!�Ò1��C|KƘy�c89��s4��Ps�
�Z>�Ԍ��r�qqqqqqq1@�������������1�H�K�K��$�H�t�!�@u��T����j�߂�đ|��K$_"�ɗH�D�%�/�|��+,��K�X�F\�H��[0������G�`5�Ì�9C� *5���L�(%�T�\�04Ċ!&1�� �oRU
��P�1�N0���1���a
��E�x��VCM@b4�f�8b��@6��5~�4�
�[�RsŽ7��#I��BH/����Td�ЪD��-������-�)��u]>T���wP��r�54;=:q�Y�h�⧱�>�,⩇hO�]��$%b#�#�#8�	V�7�Ȓ��$
_��_^���z�9��џ����F�������d^Hf�$�W�/@s?�G�Pq���R�d�?�—M�������*�Q��R�պ6H�ԵE,G�ELG%6���Q��Qɐ�TT�
Ux&W(��j���VE�]ꨊu�+
�qHU��h.qQ�W�<�/�=0�>�0k�����M��	�d��a�1
Q�5�6Q�6�E�p
�>q�́�H�#֪x����┰��������4���!~^��_~��˓��_`�,�6�!�]J�
j��Y�X��.N'q��@�U�%�!�{���`���/��2�f��t?�qۼU��M�x�4����{l��M�9Ɵ�E�Qz]�K��`���o�4�p�p���0upR)���沲��,��C�|ţ��e�bd��X�#�(t�2��u[ V���V�@<%��:#�7�������+f���9�4���+0��D��G��b�mz��q(��^tԙ���Uc7������W��~
HGO��
G��p .�M�EӣjA4֬h��(��Yt4�Z��JH\1�jTyWg��?����QG��\�\���g���ύ,��i�׸Xx3g�O�{��I�Bٵdk�lЯ��y�j�պItb`Vd��@Z�mt�UgtX�ǁ^��jN0��>�F���%T^Dc�ӂ��G�L��Uƃ��4�x0,x��Nl���]���
kȂlW�0XO#Q�ua��ک�P����F㺐hs���u�_Ń��}�?�2�T�P�����S1X�SՑ��@�o�b�S�O,O��z��Y+ջB5��z:'*�m
u�U<�`
�*$�5�}��@�g�]X�v3�ΐQ}A�R�Uu,PT�:5u��7�~ˉ[�s���:_��t�trߴ�zz׶(4jDꝩY�����#`�@u��di��[l(��piZ�
KL�dO�̄'���4"���Ɓ�M<x6a��5C��a�����V�Gb�i��›��Z\���D��q�ʂ��l�����*���[�G�����wS��_�M�uAn�y�O,&�Hc�:���780����E�7Hy�;�����0�`c�";
�L�)���PW?��R��.znԾ�ۉ>:<��]��+ĭ�zwAƌN��'ZV��j_2�d�f�^��,t�q�1�N���ޝ�s�)
$�13c��
�fe����t}v_����u��:�aU2��5p`3�;�.'���^ͧ���ȫ�qq-tWkn]���]�L�eO��"u�ӳt7�&'u#b�@��6ۨ'�q���LX7�}5B�@��J�
m���s#�?���~�r�逹{2��'�������@�]W��,�kc�˕�QϴxW�-O9�p�^6�e$+��}�&��}�=z�pdAXsv�[h����Wlzi-�FW�AV����-���`q.������%2����B��P�O$�Ƴ�=��۞�I�ઋ~@+~��޳�}��	����;|���qw�_)x�y��d��o$��c�U�Z�ޱo��W@^���)}�]e��	��*��~�L���<+���E��@�o���-�J�[�/��^����e�ًfE�+󊸼H��7~��R����^UF��ƄW��?�R�
��M��߅�>�a�4�Q�%��}P���h������?;~;�����[K~�
�������/oG��R�}�98[�?��Q~���\�����PKEePQ���)j	�1%pip/_vendor/chardet/langgreekmodel.py�Zmo�8��_1�b�P�"e�v���f�n�i$)�~
�I�*�O�������"�u-���H&9��<3҆^��w��O������ޝ��I=s_8/��^�Yޅq�A�f�!�GE>?<��p�IJ�(qNs��qj��8�CH�.��(Y���[�;01�T��<X

6L��e�L�IZ��S�bA7���*H%�r
U�9�:xMl6��s��G]ȹ]�L�_Ţ�� ��4�Y��W��=�}�/tFwi�@o�'t���TE�M�k��m*e�m����:Y�<�)�0+�ADNA��-I!��,�۵�Z��#��E����?�H'"���^�"�7竛(�C�$��8d��}ٽb�HrYBG	�vߒ1.ui��;��V!��X�
ri?�����a�"D#�%w:)P�.(��{p���G��Ze�v�@�\�t|����+�?�L��/.�O�>��\0�QįD
�H���4��5��Ë�? ����곴�������.h��/��>��_�Nj����K!j�%�]$7��!��a���Fx3-�>�*��Q`�,�O�a��w��Q�����$w�1
�;ȾVt����"��;.�&�!���Qx�(IR��%Y.�~؇����0�cD/��G���oYT^8���^�����Ȃ<Y��lDњ�Ȥ�$�!od��4�ŷ�@��;�ۅ�Wi\t�{��n��j���*(S��n oDA*8{L�E!���J�I�j��Η�3���H�9'@�'����<���H��%��^9��ݮ�:��@����&a�����4	�%w�k�0~i
M��<m��L�)����.�cx�Np�`�c>ƙ�+�yMf�b�bhWN�� ���=4��Y3���@���lP��vѤF��B
�}�f�6��.�+�w�5�@|ܕ
��)�Jgd�0�Γv�#a&�|:̬��ͼ�se22�
:�o4A?���W#�	�'�ظ�`������ Lg�jA�#).sG~�R�M#�I*F2Jh����#R>�ɜ�p�.�o,�&@�O��3h���3�g%7X�1�0́,sCN%�UNÝ˩hLBZZO���>*`�!iЙ�&��h\j���g��M$�T>i(���׎��=?�ς�_�P9�.H���i���7��E�y	_����L�}%��`��+�o���1��l�çc�Ʊ
G��3�b8�E執����Nj8w�30�F�_��8"9	��TY)=�y�0H<\�u���5�^�x��q�
�k�|+ݍJ����S�F��7J��h���
]x��z�]�����K�`���D�������l�%j=Pkb=5]Qx���D�3�r�3��+�X������A;S���X�+�(�:=���gDk<K�Ң�<W�nG�ί�H���Պ��J�٬Bu��5�,p��������7Ƹ�ë6DEz6�O���M5Q�g%���w�>+���c�^�y��:�5�+���s����Bw&*6��'ZP�^����$���Y^H
�͚�מ��ԫ��]�uu����<��"��pmlcE��^�z���3���e�{qm
k�sm�散��^��F�_���i5��8�5z�H?�7򆉺����bV\C�Ҙ��󼢢Pz��tՃz���N�p�5f����O�uc:��-P�����b��XS��LT�Q�j�=mNcA�]���+a�5�*j���i���ɩI�;Է8�z-Q�f�B=��_���Pހ�0����B�}���nDA��f�@�$k�z8���aX˂�L��0>�k(}׬��Cv�8:�z�R��0-��u-$�Q����Kk�DuJW��ÈjU٤�f+^��0������^^e��~��yn�=���BW=�g�#�����>�.'C��d��M���5t1W�
=�-��f�{����Z�[��.���A����{.���[�$�Lt+��fјkP���p���&��e����:j�	�2�k�;�`Sd�t;t�:vgV����	�ʃM޷��A�����qy�� v�h���a�pп�t�:�&�{�B{����VYtG��C}�Ɓ���kY`ov������@6gA�ww�y-���ɦ���/#��5O���+�[s�9ݎ:���W�ޒ��n<1�0*��l��]}�
�ʛ43�Iw�eA_*���_y��^;ի�Ż	�{	�t�^�^�z�G}���R`)�5^ȗЕ��7��<��2��2�B���u�=�z;��|���E�嵈��+�ב�s�b�Qe­��D~�_���Ndz7�_��:W��{Y��u��8��ֶ�%����0m�<fo�}��7PKEePQ�f��	Q,&pip/_vendor/chardet/langhebrewmodel.py�Z[O�H~��8��Zr3�rZ�U�C7Zn
 �O�I
����i:;���߱�|�
�a)UlW�:�;�*#�P�Gǃ�g�t~v2�����ɿ�����n�]���;�EnD�\�s��w�0���	#�D�j!�Az`d�|7vA�E�T^0U!�װ����}	|��c�i��� ���h*'Vz�'<�̝P��t��1�|$iYm��%?���ѐi#�H�?�$�~�0�F��ǣ݅��k�{
��DS��8��y��	�������&6Yѳ��3�჊�t������:�m�*EQ��B��4f4v|
�čR��cL�?�#��%���s��؆M��%�\���U���U׳�c�;V~�ȉh�c�sn�Sr�=��a�|&�b�esp`��Ȥ-8�З����#���#@�Ƀk�l�A�	rM'�	�g87`E_��h�Ǚg�h�����-�/��}8�_�~�Z�
�����2�\0�V���s�����V����n�3�ӳ���
�^
�O������yH�w�뫛���Tfb6f���&~˗�D
9����{#�&��Tp�X!�&� J��|��S�/���L�#�Al�k�"v��K�_4>0�-@�?<���O�G�>�� 4�8�b&��c�%��>	�Dw7i����
K��e�}��h�� g���@�E3���4	�_P��/�
�Y�~�	�8�ծ��x�ɰ}D��|��3Ϝ4D�K�*1*l���d�<"��c|��?	^�O@��R8#���%��2���s�<x�ȸ?��#D�pt{5�~G�k���
̘��V�=<bm���3�ll�-��Hf#��z3;EC��I=a�!�]�W;D�s�k
!�y�kzP��*ղ:��nӸvMaIt�趰ݲqm7�i/д!�,�Z,���3�A#,H�1-�;�����K�t��Ӂ$�3� k1;\��$+�ŵ
6�F4��!$bJH��CR��b��A?D�)!I�zz(lH�Fb�P��-V�6z�db�33��3X� �MI�Ĥ�x$�c��!�1��� 394
��'��5ǢĤma!���y�m�hl�
� X_�ع<	"lH�b3���:PB��B�t��yz�� �`&�V	�����y�G��L�N�P0�د`�[��X�
+�#b$@�'�3�j�aC,Ml �̠�+�H���B�"����u�h0>re�������[F���)��#0�~���d����z݃�e��y�F������
������:���<�'�Ulk
L[����mp<܏��_GW_�I��L�����t��#B���d�H����Ȥ�E�˫��cJ�^�&�H9gk���>R|��]D`'������l�B��YW�[�A�����[�B&Y��4�r�+���HY��0e��*��� ���
4Iz�Hd[X:�R�R�D�)��z��	�o���H��ff��
�Hh���^��h��a-k�H��K�kbb�@�lV��*�&�l�rM\�v��-r!�H۴�q �j�{#�vD}6����u� ��� S�!��2�"��	�ē�����׭���*�����*��f�S�'� � ('Q-Y�W���{a�N��r�U�t.��
r��β	���^Z=åo�XW�+���VV!l
E~�T��ɠ)���A9�}��0�^�����Y�/w��"F��>+W�Q��,�<{K��M!�Tk��/%�Y�"��2�7#�ҫ����|�E+4jl�����Zis��}�׿�}3y���B���I�����PQ����X%�ڊ/e�Vg�v��fti>
=vFP_�2��l����X�Vq�(�y4蘌��+���Q��T�6��I��t�V-b��Z���J�1tn;�@�M����30?��y{$Z�3H�b5�*�{!ȏ�UW�^���|Z_%��TP0�ۚQ��坺,�6����r�7]K{Z4�W/i�?=�)�6XO�*"*�4�Ĕׁ,���7.����g/��:l���
�Y&a�RAP�Öv�W=�v�[�F*�/[�=�Z��z��t
�����T�^ޙ�i�?y��$�����^�}Sk@P)����٠��5�l�@���zP@��6(f��ɮ��]��
�X�)�[Mn���AA����F+q�n^(�AQz�r�ui���Gڐ����;S�����J.�;����@,��`�,�Nqdq�|�
՚�]vl�U���6�U�"���ᚊ��T��lڛ7ڝߤ����'��sbzǟOܻ>��M=��5���O�� ��o�Fq0
‰
G/�t����A���E߄�}y������CBϧ���F� r���Qȟ���:�u�����Rӑ�[͑��X� 9u�H��H�#�yQ���U�D�"�N
�{��{���_PKEePQ�U��
01)pip/_vendor/chardet/langhungarianmodel.py�Z]o�:}ׯ��-�撔?S�C�����I��(�(6�W����Ի����(��8�^�.�5TK�px�̙��+�?�p���NO�ή�����_i���]?H:��8�:�f��>g��$���"��Q��4Mb��4��^����qc���L���)�����g�,��\Zn�,-p�ϳ|u�t���i.�R��v���]*ʕ��K=����-��d^�=:H�T�]�B��嬊�0K�<�] �7��}�!���E����#�# ,���bY>di?�J��<ʗ���\J*���	���2[�4J)����܃���t�[�c�c6����"�!����c�9�x��Ne��Q�2G4��$�b�i<�i!)*h����c�B�ܯ�}O2ƸZ����!��j��!�o�R�G6�j�[�^R�l�z林��t����dE����[$=x�-}=��t��ξ�׃�˃��o�a�1��U���9$8#D�Gi�p8�|ty�	3>���\S�O�ώ������������%]|��8�:�#��RS����P|�����2���
��[`2���D��2��(B�̗/�a����x1����;J��GOy�@}��‹�o���h�a�$H���wp}�dYޣYQ*������'�r�;�����[6�W��`�*�,��C�GS�����(Q�,i��BH�t��dV���C��8���]�r�����>��[�}3_��rU]�n\�����)�g��b�*y��jH��<��ut����Rq�i��GX:U���y��%����������x�7�C���M��C�ʍ�mw�wVhH�{�g�a�
��?�9�B|+�p�{߰a�����7��@#��c��C|���`�V�0p�1��P���sRc�F́s���P+Cų
	8&
q=T��$�G��2����������v��`7�ݨ#�`8���#�a8���c��p�1�ư�n�	��	'0��p�	'0� ,�|�ɤ'Á0�d�ϠR6#58�1�1Ɓk�!T� Q�0�a̡Ep!@��	E� �4� VL��2�W�(Ԙ"�!	9@4�J(��<��ЅPb�4T��-� <Q4Vi�d0*�
�j�����X]���R!l@<��@@�j�%�`���F9%�P��IB]�J��A��6��&��n"���ɟ�"���.�JQuU5;�&�-��j��&a�MT�ۺ�j�nү�ɠ�&
���Ihu�(�:�����,#_7鿸�`��S�ު�wNVb?Yȿ-d:��>D�~��8�~j��=6����،s&���`OE��s�Q{�����I_
���$lym����4��4J�+��˱^��ß|7�玨���y�Q��M�ֵq����`�?�8V��AZ�n�
��{�6w�kJY�֋ |&n�� �w77U�D�Au�E�^��Z|z��R�� \��:���Ef�X�,�~mϛ����VY�&�����`�۫<����V?w�Dg�E��	˚Zhw��׬��W�F%�5᫏g�q��&�jv7N�Zv����<�D��J�j?�,&�v���y��"]lҟ�'��D٭S�̪�sυ-�|�T���@w��[���JUuv����,���3��Ү�+o^e���mⶻ�V"�pi���Ju�Zߜk\�߬>��s��cVe֓I���Z�r�6/~2ukA4��F���D�°�]�сa����s���v�W�a��	{f��]蠺a���t�aM������D��h�\���d��dA?�ګ�o�
tN4#[!�3���m����n�/�MW^��h�1�69gV�^���qÚ�i4ڍ�P?\�g]�Q�6���.��ց�����"�^�,v��t~Ssa��YkD#0��]!0��:0����d�=���;�;}%e�}[�ʬIƍv�����ֈv��FzU�����b!�Ȭ�����֕���&Z��c�d��@�M�M�n~�:0��ˁ��.#6'�h�4:�W3�CX�Y�u�v#?5n=�o���
�5�6H�a;,WD�,��ޮF�'�Q�+�kuK���~zlTi8��N������Z�u-�ؼoʂ�\����PgAG���ٍ��,?ߕ�u������:ݞh��s`K+0~M�Ob�L5ImB��7U ��ܖ�� t8Ѐ����Ɇ��{|<ػ�v-��,����W�;�XSj���Κ]n�x:�7����J���nr�j�M�l�-�Y�8=�p�[��F���?�g#� W��]B]L]�ݲ�zЭ��j4);NaMt�v;����*ks��Jc[��:��jd�U��@�Ba]yt�Z��ۚ�٨��#�W�[BF؁�rw?�"pQ9Yp�n��wF���������݇�w��g����%���̈́�&��ۊ{��Rq��n��gB���GЄ�N��wcw��V_��9��z-{ߟE}��6|��z-�nT]-n����s�����9������_0|�y�6f���I[ޖ��A�fg�~�~7��k���M��d�ͬ��h�z�6�	�S���ߙzs�<��i� V��rO��f��zy�f��;��ޤ���XY�!�F���}�D���ar�/dO�,dy�F��9�:7&��/��K.�{5�����3���D{6�ͯ��W����x�p>G��PKEePQ"�?�
,$pip/_vendor/chardet/langthaimodel.py�Zmo�H�ίh��4��x�Ʊ��C&��F�7%��SD�N����N���)��j�'s���~�z���"ûw��ħ�ϧ������X|:�<���0���N�>iq�Ǐq%�(�i�<�W�$���eO�2��4�uZ�)�<3�4��3��t�-t.�Q���]�h���8K<�,� X\ey�>�uTꙸ_U�UE9�Z���;G�BN&��;| �D\��B\�B����(K�<�_�̝b�-B�G���*N�x.> ,E���U������*���(_k�֢����Q����F��,.j� �Q:�5�1���5-��!ԥ������q� �u�sXs��O�)&��S�ZD�XP[�d�:! 7
q�A|��G�c��o:/�"�@m�D_��;QI���M��H����R`-��8��>�{�@ ����Z,��L|H�X�����_n���W������׏���Ւ�!8�*��r�p~|}�;f~:=;��J�ONo/�on���8W�׷�G_���՗�˛�7Z���>�[� r��ə.�8)jӿ½&3�}�p�TLj(a�,V��a������b	�(��f�/��1bѷ�]H����Ӂ/�$E�	\p��'�D�$Y���SV�4�s%e�A����
Z6���m�T�y����e�%b����Sԁ�,�Q���,�(��
�Y����!$��q����2O���@��=��,��\Fu�V�[���"�}��Y5Q�+y�5��!K��{�Q�.�IY9RbD�z���!���j�cz,"ġ;�|w@���uH�����}�ݞތT@ݷ�e��~�w���s�{/<�BL�Ib$�	��9I�"1����,&���}��`�s�3�3�
q��Y�bB��ߧ�}�q�SVb��'�Ѽ��I�\�S%�J��H����p#���
}1V81\�=�KGѾ/}TR��(��]UbF�'&#�#4�1А1��„�a8�`37c���
vb���p#`�*D
�P(Im���+�W���<&����&*LT4C(	1)��cB(�  &V\Q��)�p� 'L@�v(b���ƾ'�h �(�����a�;�@�v"S�"�H ���҄FIH�1B�N��҉>Ih�n�#\G!��=�I�(҆s�6p B�F܀��!x�P�jH(�@��Z� B�ĉ ���p�I 9�Ɛ@�`DdQd&���c�U�B0B[��+�iV��Ki�uUbR
J����R�.u:��L����8Gjݓ��M�`�l?�x�������|*���Bݩ~D����G�`B�-R�Y�>�H)�!��9���#h�l��]���Y5�����Ts���
�S^B6Ska���vj��h�Ui�U{�l�$�ÌT���A�h얍��ս�b����ͯ����$��I�!U����?��~��ѩe+���F�rΙ�Lg��>�°u���Rc�,��Ea�o#��6qӚ`�u#Q1re#F5�M�g�W�Ԯ�e;u����u&ޥcq�-�<��ld�!�����g8�� 	7��Ɓ�m���?���H�N�2��_��3K�������	�ص9*l5����'��u=+�{ϕk���L�zF
l>�fEِ�ݬN��j�n��MY��D#��>���c������{�-��`�I�
%h�
J
.�,�V�pmhS�+���../d��|-�l̽c�#O��]�6e�n�:��g�d�p{m� ��
�n����D�M�<G�H:X�H(7+���:+�ި|�7[��cݶ�� }������kX�-��鰥��l��[�]4/�oHT�F�2p�F�����H�^�*l&2��(�)奇c��5}��̃ǫ��宍A���;��J�s�A�<�ke^1�}��#�q�^Iǰ`�ƍak��˦]�v��h�0x�[�7�ٵ`E��՚4q`��u��k}�>u�F�}�����ǥ����g��>+��By��u�h+R�B�%�M5���tk��k����])FY��yނ��+l5�J�DD����m�i����W!�;���Ǧl�ףl,zfi�f�/�c���Y{yF��Gv�X��}��f��ݯ��\��v^+s^��o��r-�v†8�u�I��5��.��։�ߊ^���f&��	�h�I���*ۉ[!0+���j�/�6��i�\��[N��r����pkO������Ş-z�"���v�X�֗���ڬV��6>Wl��J;�%շ,�x%�=�=��JfkU=�����:��ۻ���~���C���þ����q�����һ���{�bO�/�P�q$�ݍ��Xi�\k�ݪ�F�ˁi���+��ژ�dO��ޮ�-���J��;��ʳ�L�8d'�f���>���kk�e>`�/���S�X�]_���\�^P��~Ҟ��/l�u�L����M�o��cpSѧ��+�W���R�J�/Y/�B^+�%$�DŽ#���~e�+��C���6�8��e{�c�c?��Z���m^�}�d����u�.�
�<�#o��	��!���=	Ev�w�B��y��j�_Nԛ8x-�/xa�׾�����5eѧ	泄{B��O����.�������~˧���oF�;`d��?h0�ءU��4J�Y�7w�'�&�>��F����N����]��R�r%��
�B�wi4���>�/Ug���:������PKEePQ�2�d�
^+'pip/_vendor/chardet/langturkishmodel.py�Z�n�H��)
�C��a7-Yr��cg�ql�v0�ɠ��M�&�J�Y�k�{�}o��_Slv5řӆ�E6����������m�f�<NhY��L�b��=~wzNg�G��������7�^�ͣ��<~��(��l�(.�}�G�$�i<��,�Y��Ԧ�]�L=M�2��_�g�d�SvOe�Nȟ���E���YZ�6_dyu�t����Y��R��nUi�.�Z�b��Kzu��t:��^�]:L�Ҳ]�B��|��Q��y|������!z��2N�v�Tft�*�����_<�����Fŧ��;���2��t���AȹJj��k��Q����JQ�ݗ_��ZeK�E)�jk[�ZIQ:�9�1�	�_�e:����R�O���:Sܢw*U9\�\�%����JEQA=V<ZXO�!׵!t�A}�7�b<�kVy���¬Vk�	�x��~�~�'���+J�����z:�8��>"P��B8��;E�B�/ K���z���?��WW��7�@a�S{�)~Z��s�Wy��+�~Ō÷�g�7��'�7����trqE�tyxusz����.?\]^\�]+e �`���@|�O���2��b�G����ɜ��
a�����X}W�,}������)�J���1��v�-6�>2d���H@(J?%�5���P}�dY��۬(��C�
���A��p�����_��@/<(���:��f�Q�@�bM�e���dE�L�AR_�MM�R}-+
{ЀP�Ⱥ��T���j8<�b�t���tV.�5E+Ս�;U�
̾d���((@FO�}G�$����n��DxgЖ�n��b7�E����^y����E�Чpߧ=���8G�c���ǁOB�������ho������B��zJ�ۃ��x��	R��$0�p
\KX$�s(�X@`e½�=�{( 	SƸ!&��(al��j��1	|�?�9���s�s�sg�S�8!W�rcȍ!7�
��C��1�A0�5V�B�����T`�D0��&Y0� �����@?��-�0a����Q��GS�7h
ADA8CLu��&#2��@x�W;!�R�%�x�J47����r
E����j�\La�E��O�dB�GbUDD-::�p��M��*nF�+q�`�	���q�hW�"�"J�i��7�a	�-��5�q=��D��Cɾ&�����Ծ���X����:���Cԟ��3��o�����p��3`�v��#S)����Jl؂`m�z�h
;6Y`fxf�!�ڢ��ǂ���X%{�I�[��tQ�uLd�wm�Z���I�ٶ�|ŀa�,�������
}�ʂ����	omNE-$+�e�y����d�v����=�)k;^5��m7�}�v	'
6ұ`�Ҭ2:7<���uЂ.'m�mu�m�;��N6[`�<`�����=�n�ul�Q�����bЉ��yn�Yͤ�l��R�b���2�``�hꁩ��q[��y{����`j���MU�τM��<9h�����&&��b��a�9z�F^�9��[/��a�`+��1�$��@����Fk��ʢ�4Q���{"�=L�M��zeѸ�I�ra�N�g��]�:��g��o�$��ڙ�Z<�a�5'�����30�<���h��X)���`ˍ�
o�+ҷ�ުl+����7�`{$�y��ߦ�D��n=������f��I���-�&N�eo����>O�aj�L�;��FC�?,����Ovg���kd��������0�v�7��N=���=�tb�-p��~Ō9��s��\�^�2@���9���-ࢁ��B�7aom�]��-��(d��*�~,���v[廳�Ӷŷ5��H�0%D6�$�ț�&�.<�yű��F��/d0��􅜉��ƅ~Ͼ#
A���[���b{�zw��=�a�v��w��s#���I[��.m���b�Y������7�yλ��l�ik���¦�P,QeK��n%��v)�r���sE��b��nj�p��:kA��:d�h۹sZ�7C{خ���N��>6 ژ��6;A]������X�/������,3;�:dv&^V��-0�u6r�Ec\�X�F‰��B��R����g�T�V0��5��Fٱ�������}���o�z1�6��p�M�7L����!6�lm���(�
�����D^,�@٩a��p��䲑7�<G�mY [��n��?`�Ԇ���1
����o�1���E^�Q��j<q��F]�k�<�s��n>z&�$����,���3>�gx٭H�d"�1d��s�:�q`�[�6\hE���^�t^
�:���ˈ&Z�ݐ�h�3�v�}w}��h�?���tVTݷ!�3�#��Y�]u�G�ϼ��mO��v,p�W٬�1qۣm��n���s(��e�[-��g�u7Q��%��
��7m�<��]م���m�r�����i]�M�W�l6�$�c�3Q��~܅�DA?��G�[�ګ�T�:��2��K����2���/�n�������'_OZ蟸�U:S�Q��WLj��,W�x%��������~	
�`w��iPI}Rjq������D��ʵ�|�|cb���4zR���bg2Mw�?Uϓ��x������PKEePQ����#pip/_vendor/chardet/latin1prober.py�Xmo�H��_1*_HK(�$$͝t����VQTY�Y`���K"��ߌ�y
 �س��3okvR*�@��ۇ^�����{��7�-i%�X��x�`�	£����〿1�7we�L�b�<T�j��n�G���|�d��Ө�g*��%C�b�
��*.��R��
�@�X�I�*6��udq�ʕdk�F����q�ZMG{ի��}�nC2��&q$���/+��^|C	��+_a������P�0X��"
{�Ư�ZY�Q��aJ}�"]���N%c��zG��a-V�H6�ȁ�R���B"~!&|�&�*�`��br�I��C��
|g�H?X���Cp�{,�!,I��T�䈝8�@�Q��q\'n*?J�^�S��bc����,�����|,�L�ս)�#�"�s,ޠA��^�B6]�����;�a�G��?���p�ꏞ�QK��X��_,}��1*�j���������V��뎞�{�;�wlLk-����10�ݩbqKSL�ܗ�,�S4��I�$.��8�',o����o��1�Up�C��j�`ŋ�<����U�wɱw�=w��V�VpWx�
\���>��F�ɧh��h�P��c�����.�FM�(9�N��ėOIӦ7M5y�,�x��z���L
"a�Ȃ6}�@+<��
�M��a��h������+M?�xS(E�f�6Ѭ��$Q��lu���9��%W�|�)�۸���Å���O"�V=����o��n������7���|��	��Y��F}K½%%Ȱ��D����ԁ�PG� )*�5|af�rʅ��j�V�5����<��~>�N|��|u⫟�W'���|
�k��� �F�;��ᮈ�*�;����<wM|�{���wM|���]wC|7)߇�G|7�ٸ&�5����I|�B|�~���Z�q��w��/�b)�E��G|�1_N�q����_�bt��]D����"����E|�����>��M|�_���c�b^�3�'��K�#>#�2� ����!�����=���t_��B��u�'��K�#�N�gef@��L�3?䳶�4��4���3�
��f��O:>�iu����2��:�!�B#UH����7��~��Z�]A~�ˎ^�j�/�D~D.�*ǿ��L�q�["�5ѣ��z�-j�5녿%��Tv���Է��ϣ�E?-*�w .H|V,o�q�#�x���8:N9d�4��'\�TX.��@�R��2.T$U[/9X�E���p�����M��>
�çBۙ��`۽�i�>�~�g(�3��U��/�Qs�֙g��	��vP2��|������ݥ���
f+wv�ħ<S�&�Z�U���T�aF�O��A;49,�ј��g�34
j͝�Rn�>i�=F?{�7�)�b�Rx.��g�N�v}��dƱ/&�9�ێ��>���+�Kվ5r;;���Wm�F�����7|�)j��n���v�#H�o$��ϰ�<L���N�`�9����f"�Z���񤄭�Z�w#�(�ŪD��$���j-[d~Ȏ���P>7~���N[��֏�����
����'�^G�_L%A[��B��&�A�v�l��T��H�_B7�2XJ.$W몶ׇ��gt����\A�PKEePQ6uM�U
&pip/_vendor/chardet/mbcharsetprober.py�V�o�F��_1��:P9
���T%T���Sd{�3�h�Ε��ր
ؤ�V��ݙ7��WW���c
{��Ow�I�o�`{U�"w�4�b)�SO�L"�'�CıOs)^Y'�	V�N�PȆ�40m�C)���=�r�6�IEd*�a?f���q�^�R�J&x����T��y��7�b�!�C��bm��2T�5����ҼE�8&��&�p������F�E
~���'DO��FS/�X�'B�����֬��,f�-~�X�{�����Z�h��4M�T�αXh_o��f�DE�;���V���4�"�%��2�Mi��U(��=Je,W�z���i�	��K��i�.b�y$�	���ƞ%�B߁Md�O�
�YMn��ml�8��V�m�؄T���=���
$��5��j	
�!	���P1| �~GO҂)M8J�&`K_���d�Rw�L_�����7�E}p����z�����"q<���#<�w���}����?��`�P��]��森Cӹ3��-T�� ��J�\��k%19����g�7A�qH+��Q�1j!�h��]5��\f|�RzC""��rߵ@�gK�JQ�]o6��|�-F	fp�ЃX)ݤ;�k�ԅo���i����g8��P|���V�4&��_8�`�����p�f��
Y�h����r93�6d�+!9{��jA�'�mil����	X��
����>d�]r��C�y����z�q�D�˥��;V����IRl�z5n��{����}nh�o�ӃZz>V���%���	yɺ�փJƳ��k�I헂�ƾ4�w��9)�9Os)��y^��\�TiWB}��_hE�4�\�}�z�_�&��ͱ2C�^��R�k��}�6�����s�o���. a�)��1�zn�8�� ���?+����.�*^'(�)������3qN����j�DUB^���_��~�W�lI����,�����:5���j7I4���U8^)�����%���|;9���3@]Т:�`2�{C��?s�ފ�I�_B� �-�͇�x+l�v�`�������Y��T=�y��6s��8N����R�<��u>��:/?Ӄ�H���Ǻ|��J�//�I���~��>�f�
�Ke<�*]�<|��;[X�m������Y�?w9�'�ۛ������2�?�1ٷ[�X�lR-�(��,���y�x���ڿPKEePQ���r�&pip/_vendor/chardet/mbcsgroupprober.py�U]��8}�W\i^@��Vjw�H��2%��h�B&q�cG�3����1*u#!%��{|�9�����P0Oi2�x@��,�A�����h��43b-�蔓��	)-�x��"�l���Q�O�6�ڪ�J8�W�¥ι!���A
��;���#��J$�	�,>M����j��'�3�SZ�;�류�\y��6��A���v7�-�II��Z���慧�I�����m�oD��y�Pȵ[zG�Б��n��oJ���>����)��F�,�B�&�I��Ag)V���K����̽b�{*uA	Sdx*�)�爩�6���Td�*�~V����M4��ш+n�SX��HP<	W�����ݜ��F�C#4Ԡ�yrO\ ��{�:���M@u�|���/l��$<4����&MI������{�V�
˳B6�,=���f�9��O�؋��t�t,�A���6�Ę�0�J4��A|CE�?���O���x>�1
g�(�E�q���"
Q8�-8�Qb/�-��$�@��P'�	i��?�^�eJ��as�q�Rb�6y��<�Z�w��$�=���Ɩ{5{{��]������&}��Գ�1ʇ"�Pjm����y�C��n��~���-bD~��`��o��Z-38I�Å�6��s�W��� s7�p�9�.�T�.��O��)l�/��+���Z��:�*j��K�gs�#�����_�/F��Vb����#r��{�Zl�x�j�dw{?�ϴ�_ˉ��6lF˥���\�-�Y�X����8�_�Z��?���Z� o��k��h�	��'�[�!,}���9�Yo4+�����3�.S��(;�t�:3�2u���щ�i��s�9��PKEePQi����cpip/_vendor/chardet/mbcssm.py�\]s��}��Ќ��_�'>�>$�ӓ�ۙN�2�	������w���-;_>m��Z,!	���HT��;�99c����٨��Gߘb�j���7��ε�Y.;�9!���븮U��kfCZ���z�9�{~���x����<`�3��u�!�v�9�9������/�1���n܊��Mq��CY���n�������LȂܽ�\�
ž!��|*kr�{Q�L��?�)��Z�_��q��iJ��g�����CӸ�$���h�Y�9�Y�����ٖ�>uB�=4D�,o�/?��?uf�4��PQ��aچ_�.ـ�PR��{<��\�'�cy���9�Bv'�›UK������c��[�#����<!�5�Fz�$���ފD��l�	�(�p6��Y'�`U�)s�8�h{�2��>@7b��!�������'�?�/�����~0��|�}����'srn�\2�Z�-��ix�'0O'����'�hĎχ�]�'G���!��^���u�F��M,�j�e� �[Zr�#�qCY�pzC(�;e7�=��lsz���[lu]߻���U�~dΌy~Tc�}z_��B.��[�No�k�m�N����`�cgY���ءFb����
��5���]� E��g�K"�Je���ν9�e8k��9����:Q�|x�]�����#�����EnjZ��R��O�
�j�����=�����;����m
�L��!r7�׳��j~C�]5.�
5�)�M5�)�M�oԲ����U��R�ۂ�V�ۂ�V�;��Q�;��Q�ߥ���]��J~����|����T�{��S�{��K���G��[�ߤp��fJ|"�5"�5�|[ͷ�V�?U�?U��s5�>W�g�?��z�lV����r��CJ�?�k���F~*��cm�o�T�uM�*�t2]���7--��%�����IU!H��m^
�gW �8�0��/���[�^���`����]+�"k��w�Tcjq�3?ɞ3�����}BQ�ln�1�ٍ\���9S��Y�b�w��u���B�.z�^�obyT�#)y��#5N_�qj�ۂ U.%�FYjؕ�������&{�c��%,�K
8u�T���:�����$	�"H-J	�̇��4��J|$��&$	K�)zB�0���YʋB�)=�z�A
H)��#�y�$�P���S|r�e�MCn�rӒ���t�+7����A�~��ŗ?��Ő)�q�_/O-�iS�Ȣנ�E���GI�zũ�z��h>SZ��2y�SWN\w>)�ȹ韷/�$�g�=R�j�_��ҩ:��^e�D�P~m�4Bm�6�0g�h��^Y����a�&R�"��Q�	�)�/����
l�^d")��J")<�D8VB�q�$efp+��8VB�(VB�8VB�(V�6�j>��P8���8��P8���8��P8���8��P��J0f$��8VB�q���Q��MX=+�� ��P8���8��P8��������b%$�b%z-���JH�J(�J�h;+��
�ȟf�\6I��H�"!��C����H�n��\;=�5e4d��|�ѓ^B��Ԓ����zqXm�Z����f����f��յ�6Kq-c:%�Azu��TU�i
V��0���XR�!��OS(;G�±C q�(;G�±C q�(���đC�p�H9��C���<�C �aO��05;
�!���X�"�����x�yڇ'[<Oy��"��KLIJ5�ݜ��|���Q�8��u�E�RP��SyS(>��
�m�R��r��[P��b��tOB`(>������P|,0$��±���o����(��<��4��X`��x���P��đ���f��7y\_��M�ClZO�0���SUO�_n.@�;Et����n��7��C�g�{V�:�-�r��h�U��@+�_tS7ΫK{���f`���12�@R�������֢ie�6�F�R�۲�7��X��L3V*�����e�p�j~���?��QO�P󱗡p�eHy
�^�đ��p�eHy
�^�đ��p�eHy
�^&��L2"<���ݟ������<�m>���b���A&g��SY�53J.g&} �Sec_�?�l{��xE����F�؈�	���v`7�\�5Ģ��X�t8���8�X��<n�0K_"_,}���� [�F<Y�=�,t<[�Ր�yȧ�Y��3瞽`�g��0�s5�F�=�x�ӽ�:by�w
|��W`����%,A�聻n�����5�׋�<.o$*
��ח�F=�v��@�����`���c׷rY�Y)���?I��ot�̢��'�Je��R���֝��_�I��6�Y0����±�#qd���O�zp];�\��x,�7|��ß��P��х�-gw�5��硤ھYb�9���;����xX�K�x�����{�Օ��;��(>[�w�����r&��/���5�x��á��d��E���.�9��j9N��~�'+�D8�DFy�%J_d�»[���G��vدT�����RA~��z��z���^���W�6�8�^���W�e��R|��$���±��8�^
��K�H{)k/�#�p��$�W��8VAG*H�XI� �c$q���U��_icK�c�^��07��-���nTw�˹�[K�?E�J�[�s�ޔ
Bdc#�ܨL�B��˰�)GшL717W�<n:�X�'�
��Եfu�5�u��PԮ`%��n�ɉ�y��<Kޤ�5Z�~9>֌�aY�AboV��*�Y�7���
�~q�Cv��f�����0�s�G<�[�Yo@Ԯ!{R�̦�qU��t3lz�l
n�Qm����u���lt��(�%'1P8	�G����ER�L���,����˧���S�;-�Hř0?�Ԓ̧|���2?���#A��_�x�_�����'&z
�+��‘�0��2�߼�05����jF[\���
1x<.@�H���ʪao"~z	nd�0��m삚ۼ굒T�Q����L�=|�j��^u�v�^�M�)��^����5y�>��Z����j�Zk�~ӥ7%�ֵ���J���O?���Z]��ykuL��u�ћ����Zw�[�kj�q۵��k枷�ij�I���!{����V�Z��S���t���L�zt��]��yMLm�s�z���Um]���Y�65{u󫚫��_������oW7���M�(c�+c4��={�c����滿+�PKEePQu��&pip/_vendor/chardet/sbcharsetprober.py�X�o�J���b�����R�MOm/OG���G��^sg{�U��z��>���ƆKuwHI�����gf>;ۋ��ݘ��>���?6�7�N'd/*4Y1|�}ۣ�pqI��_��l����;��$�e!sB��z%��y�!v�^�'6, ����4�,���aXZ�#�;vȅ/�5؈@�a� ^wf�̥�N[,e��f��V!�:��j4�0Q*^����H�J1ɂW�Ƒt�|!������G;x�!��_�{��!����p%|-1^��c{B�}�� @��y`;��"`��X�[x��v""�)`.��@*$�w?��k���N-E��xUX!�2��?�����?��w����%#[�F����;��8q���k����Wg��c�Z�fzZb�@�T�C�?ҽQ��pzG����R���}mv���D�[��E�-"π�����`:�v���h�F���d�
�"��%��x�U`�����9�<@�}��u'O���o��t7Q���Ѥۙ��#NG�ج#���+0�@�C��ɵ�h�{2�	�p�sie�2��a�*�lT�f�S9���B��7��Eh�6��g!��rȯ��p�]5!d�/R0��_��'D`Ѝ��}lC��j6�M��+�>d�o�H>��"@��n�b��=�c,�Y8ԋ� �#}F�vPi��R;��0���+R�#b��z��y|%�[�Tϖ�Ɛ���.d�cj�o R��~�Lk��I��S�xc�����=k�02���-���'"�B�޺�_��li]TVw�;��Ig:��7�_��X߼o�k\U���dY4gY5ɼ���y*M� s��lO��o���|�>KT�k'`1H����O�<�a�n���w���MMU�[F>Cţ0�T��	66�����^�͑�4���9e���bGr�+�IJI5�
9\�ё� 0��v$��	-�ZL!w�/��Aw�e�D(B�Srg�U#����qz;�-"+�z�t�~2ǩ����8xP��B/��;�S���<Lύ��B�֗,���76g�Pq9<�l�����E��qˠ��&muk�^A��s�7b���J��nzBc����GJ>��/Jճf�
}F_��s5�Z����C����_����)U�k�T��)��#��9
����_>��6C�cޱ<"��Yށ�R�U܃(�};�k�j�����g��C��.�彩�<���&=<���Җ*+6�9�b�M�!d�@�炾���jF�
�хM��?���Eh�����"�-�%j����0�1��`�-�;�]����x�	�TŽ�d|p������
�>;������:~z��N{b
F��(�n��M��1EQ�����,s�04�c�
"�G �|�m��I�A2���!�����u�jvKf��3@���#I�0�Q~p�xeU�+�fo5����3���x��U��S���3@Qf/˅��+�d>��8%-'	=_Z�S �_1�����3s�)s�-XK,���?�W��'$��$�6ʍjq�r���/�.������!*��ZpU��E�b��:{�R�bU��+�C���yP��ѨUٹp����EV����Y1�%sH�[���;��}3���E���:�Ψߚ�3�����~Kp,<�}����S5V3cQ�،Vr�Ǚv��r���e�hY���yw�ICq�~���`o֪q���md��9$5A?��`ڿ����f�	Q�yT�WH̙'�x�,18��q������Sqk�V��;Y5��սWo�O��t>����h��8
퇺�R>>����,4a��G���Z��H)+�%o��5f��l��y�w�`�*W���_Vg���$���>��c	�70\�Q���/_��*�PKEePQ��O���
&pip/_vendor/chardet/sbcsgroupprober.py�Wmo�8��_@�9`E���~
-Z�D@U�Z!�8`���v�r���I(�;K���<���v���4�/���mC�7l��3�w�;�,)[0A8��O�i�����m�Ҩ�Dij���zF*���)����f�tC�\S2�C��j�G�E�U(�G�B�ZK 1��J䞢�P�Q�x�Q�k�VK�V	j�J)r�hpck�aL5U�'���0��C���K�Q�'�F�/[�=����Qd�R��2�?¥���x��	”r6WDE6�����=�H����L'�c��!�W�gAdE��1^��j�wI~L�G5�/TP�ۏ�9g�{̣BS �V���Tv�#n�t$����Po���G	Ԝ�n�����B��?�{m�%t:��R;����}�>0�.�8�	1�-��)��!/#��[w�:�N�1x���x�Lޟ�K�Z,p��Vkΐ�RD�G�~{�zED���u'��Nw2h�.t�ch��1�t[�^c��x4t���]�m2��)W3�CB�I��X^�r�dC��ũ�`����jȥX��"d��'`iʰU{��Ȳ�o��s�P��K�"����p)U�Rk�o �R�V+��o�*��Eɹ���]�('=[J�뵒sL��Z5.5/V3�5)D�SP��eb�i324Ef@�����Ǭ�LQ��ߘ����V��[e~J�����b�0��~D�'^V�%Mw�z|xH�^�?J!,�����|����m/:��C� �q�Qo�t�jV���g[��[�u�˰U���p�Y�f�uj�	��M�t��6c���_c͡}b����=L�>����$�$���lj��6[�AsO�o[W�0�1��f���<H�v�o��Ub+�T�ۣ�I���~e����vx�|t?Wrf�J��\	;���Ѻ!���v2�7�0;w7mY���y�<�n�?��X�#	T��5��������k�-�����V��.�%�����;�(��J<GΑ�Ő�Ό�/]��>�=:en���p���+9|f���#s�5�|�ٱ��x��/�s�C�}�e��{�a:���D��?�wƭ����,n�T���	-�F��:�oC�_�uĐO|9��]�
�}�/b�%�PKEePQ֑g2 �!pip/_vendor/chardet/sjisprober.py�Vo�H��O1jt*�R�tm�� 	=~	UQY�^`�f���Oomc0�T:�R��̛yofǾ��~�?�p�폝>�'ݿ��E��5���+.���2d�5m�E~K���j{ׁ�óǞY$�L�\�������[�f��K��Sm�J~��R��@1߰���4��,�v�TkC�n�����J�u��f�Wӌi��Y�2�Ja_�F��n|��h䫯4��J�
]*4d$Mwf-E��D|�|��*-c���|Ca7��1� �B�Sxa��oR!~#C��YS,BбU�6z��xNC�Q)�3��L�E�y��f�k�Z�^J��B�����OԽ!�qns?3�a��V{�-Cl�TT��������Q�n�}d�R��iH\$�kh�?��0F�`k���&�K���d�Rg�H�;�Yg�>�J��K��fq���١p����":���}���
�q�q�n2�M;3wН;3��gӉ�o9��%�bV��K��FBɐ�G:����j�����0��"Wd���FR��)�!�$!M��)���t(E���դ��p���-p~Ǘ����TM���X�Q�W���e��U�h�r����%rQ�-��Pk�־��l�\�?�g/�(����ũ��49�b�]�Xi�Q�����&'�=�'���sgg:p>
�^��6�il�4�m �����9��7e?�y�I�?�<��qg3�f_'DN+M~�j� �N0R�j-����0nK�<�=�yu͢ef������R��V��(\q�����
%���B��z����񬾧�Y�C��>�RX��\���J��/r��/L)��.ϘM�'�
;N����8�[<�b��s�o>�[_��7�K��Ľ�Eo��K�vKq�tq�1QϽJn����t�p@Z�rI�r�/��q���t��`�[��l2;L��!��D
�"^���	��
��+�)&x]��8{�<�9}R
%ٛY�L�&�Fu5�
��O\o�?�X��끕E�%�uuF���w����
�%���w�ފ�aHN����A��^v�N�CZns]�B��R�/�'$�����|��m�Ǿ�w�O�=�O��J����:*�^e1��X��
U�-��J�2Skx��d�zz���HP*��I]�oC����R����T�b�|�nR���`|��x}ի�_I�1!����7�_�_��1�46�'R,y�D��gZ��0��ݹ��>~{�����|���[š�Kᨊ��ɞ��(n�1�#"yt����8�U���˵4��PKEePQu�G=p
�0(pip/_vendor/chardet/universaldetector.py�Zms���_1������������$���v��0�e���J�.�o��3�����n�W'v�{fz��~���7?�}���i��o�����_���}6�sv���l���΄d��o�umv�{H�8s;�<dr'����K$t=
���{�K0�B�h�x({��j��<�ء�=�����f�~��;�C>a㕒�>����
S�CV==`�F�	Fr��.�!Z�n��=�蝜�^�q��U��0viw�Z��@,X�a�!}v�
羧(����]��t�JC���RW�;X�v��L���+�V~��c��燦Bf{�����DLW�*�&�/m+�B&J>�ݲ.�v�=`��h�
����̖lI��<Se�ҏ�:>�+��e\`����ֲ��l���ʪvH��q/���^1�$��Q�N'LxJ���? }���1g���ȭAhه�����>��77ǽ�Ƿ��Q`�%����]���p�lߜ���I��;�H��t�v��:W7�]�����7��߶p��'*&e����x
�����•z�q�t'ln�s���Uf�B��'���{3�_�d
}�Ĕy~Xc���<�NR��+��^5Ad{w.�����Bt����N|��1x�f�Qo6����f��ڽ�G��ދ/�.�I�r�ƒ�<����S�9K�&ז[�gN�D�K8'��Ơ�Hj���:%g�!ko�Ȏ`4�Qѽ�"���d�9_��\=Guo>qmOMΪ�W�;�S�6@[$K9�9�.X�[:����̘�A���r�&�%?q�{���b��~�\�
�iN1���9�\����{0$��z�(�p����Yd�xG���#.L�F^�giK'��0�@x�"�zW [�iX���i}��L�/���fKU�+���)��Oal4Z#��h1
{�+��R˲�a�lyy������@a!!xl�Y���)��AU�x��^ژc"��s�L���<�0<���%�D��� �d�R�t�L���3(�HcM9�T�����
;*;�/y�I�P����:W\v{������M������
��P����'��Y{�>���-�_,�˫�ʧ�_�4ꟿv:_*z�v�t#u�s���_��� ����=N�O��n�jHl��� ��"�_���O�f�U>o�?�z���U�T?C�������������zÏ%��]oJ�v1�Tbx���yX��M[΄O�pH�=V%w�5��l8U���a���E����5�
c�H�|���4D��I�i�'xc;��!±m�CI�k&&�ji��*0��U"C4�:�X���:z6|}xP�wn���4�6x$H�I����$�Ke�ᆸO �'a]rc۹��m*��Jo�b:��?"t�;%V3Ր�+��=w�<D�ˆG�Y��-	�18M�%��3D��N���r�F���{%�r9��*��]�j��rL��h`ە[,�4\>IM���B���O��-v9�T���nt��l�J�*!�$*�<��%���#����l0ԁ}G��;������ĕ��$I�K8G"2���~�]~�r$�/c��xJ~K�Ga~4"�d�Ipw本B�m7���`�Q*��r�"Q
�HFl�*��q�2�s!]��T�'�)Q�H��Q�����%ɂ���h�
B�u�6��5%'�#�O��`��'S�E�D=���S��E��lE��A^XzTb���Bz��	�� ���쿉oѶF����$�.�����!���o��Q�%������|-!���d���c�!ǹ�)W�(�0���\*1�G�
�ͱ���8�K-�Lqe��g�@�P�V�+�D���
�zp��N��MX��8��� `�7%]�Y�vr�N:���ߤS��n�����0�'���M�N��W*�
��ݰ���[Ë�Ι�g���}`�]��:m�h�?����*�.�so"lϨ����N�8�m\����(\A�Ѧ*���F���������_YC����:(dR��`�×�����:��z���뺒^'(-i�hMu�f-�Ƣlm��Z͗�߫%���Rޑ��y���ʯ���d[2��W�F������3$����r9F��)[�$��ւt*9N�ׄ�S��*�yĠ�,�HvB����=��=�eX*%��bj#n�x��D�w.�ꜛ������)O�'̅|C~d��zŒH����$S���?��n�_��g��(!�.N��ry�S���M�|]�l�^b��ͣ/%{Ч.�,`�Z�*�)�D�uNR$U9��u\W�0.g.<���ӵ�THrs��C����h��>a.����V�L6�Q7/ŕ19�l2�)��*x�0��qW!����SS�n��80����T`jM��|���\�Ά����s�m\K�/OC�gO9ß���S��ٓ&"�=�˞�CҪ��U�-\�2�l�.������1��}�B�Rx��Җ��.]I�r?	WP�v�䣀-p֢N����e5�t��u&9�˧���t%�#M���;��m����r��U(1��p�7/��sKNF���bL�t����yz��M��P�Q! �[pak'�)C[�t]��_�d%6EGO�MG�`_?��/yUp�vpk�
�ۯ.]�Y����ͮcܛe/��ߪ����x����nZ����t���9�HO1}.�)I�<u'v��ٖa�3����ڭԣs�rCWM�v9�ݖ.|?��[r
�DA��_k.8��fm6�;�TH�̵��tN-��[�N`-���_I��F���jl��(~�G�l���3߫�l��G.z��EI?p��������K��H,nW-wKcM�8�U+��{j�w$�}g|j�!J�T[�h����EO]�<
�7[�bKG�=_�<�x�X8�X�?�Q{$$W˭%'DV5�2ԡy��+�JD�H�C��U=���Dذ�LR���d{��nz�ہ�AӒ7 �我g�٬	�6)m����9B��yŸ��׬ǀ��Y3y�����4壘-El�wAE9���n���7��7'jtCt����M����ɤ�@���a`'��r�1�N�MV���|-�B��c�%���r��fś�؃�U]_�c[��|R��5b�[��4�r��%?9��u��M6��H��k��Y�:��=�r$����ܭ��2�L�}r{n�y���[z�k�5)(�����"Z�}.�sߝT���W}�6|2
�'$�K�b��09���=��>��8Ɏ���Y[��E�?H��,��r{V`x�[
��H����e�\�
z�+71z�'Z�N
}�vvjƐ#�PKEePQ���=E�
!pip/_vendor/chardet/utf8prober.py�V[o�F~�W��H��N�KS��IP�F��Q�,c�a��.�]'����pD=��������!���x��'L'C��mx���?����%kW���L��L��8�,�V��j�B'�F�#|G.7�@�`�pP��F��ɔe�`qd��^�F��a.Ue�FXnK��T�*�6[J�6�v�wwKg�-p^��C������F�en�j��=Yf�z�9�+�2�Rh�H�o�Z��~j
gK�mѥT!���� a��9đ�	�=5�@$���"|&�nS.*�PmPez��ggSԤ�Q��j����S����Ma��C�ƅ�cI�ew����4Y����Ռ]�
ڑ)��47�C���ij��ζ�PiL��k�=�A�T��,r�iλ�@��u����+|x�	^(�:M^�_�IJ
gDLU�H�-	'���
_1x�L'�k�~<	�a�z0���&��t�|��]߶|�]��f�k��)Qf�:����U�4^My��i�12�(���lh�\�UY/A
}���������L�X�����V��)(o�F�|�R�s)U��6E�l@��M�߻���,|�|��팾�\�Z��X�:R�F�%UO�+>�!}4��X��i������7�m�2��L`�����F�ta�*�5��d�X�l�Ʒ�?g�Ȟ��y�ui�d�"��9ױCZ4/�{�<B��*	����M�5������](�}|�J�����>����P~
��a�ˮܑT~#B��3�q��2|�������cM�*����l�J�U	E�� �&W.r�^�^|�#�ʣէ�C�)bR�u�`�d}(���8^;�U<����PEG]���|��ѧ܄>6v۲=���m�e��۰7g�	bI��o
+�K>	|����cw��I���ѧ�	v���H�+�”K�Q�;�#ܜ�4��G�Z�)��E���x�%�T#E�1B*���z�p���g��t��Z{����e>�p�����
�kuwwRt�1���M�5�������:�рע�V��}���~���E�q�PKEePQGǐ׹�pip/_vendor/chardet/version.pyM�=KAD��$w��F���(��.���;�����w9N0����֚/1�-0�G�V�VhF���V�"|�4C=�̥JNH-�\�'���j��#�E�$Tֶ�e���J��~��f�Θ#5���D	����~���0G���n֦�]�{�[w��<��?��lͿ����wnw0�PKEePQ��2#pip/_vendor/chardet/cli/__init__.py�PKEePQ�&����
%pip/_vendor/chardet/cli/chardetect.py�VMo�6��WL,$�6��E�m�l��6=,��BK�MD"��k��!%�N�`u�%r�8�f�g?��֜/�:j�έ��f�Y�Oid�`�����
���e#��nm��
��qdn-��J8Q:QEB���je��x�5"ˢ�y嚛`V��cҋFC_�n��`+U��vqy��
?�J�jY�.��|Ȁ�R�Ɨ�"�>֠������j�
!K�I��wP݂u
�<A�)��w�E�%�/�nz'��=GX����I���+�����N� 1�J�긱b��;;��Ɏ��6�6nWั\'mY�[s\r���)zG��	��|��'>QU��L[_*䂮�F*a�x+�����O�F�_��#���jX�+�����K���r@�h�7%�FZG���PO��[�dp�P����E��,�q�N�K>R>hg�^��P��o���F��Ҩ�9�
k�ˣ�{�_���~�FLB�����!hνc���L��t�j!�g�g`ט��W��2b�Ѻ#V,��\��{CMl�d�7�4;譨�d
�`�����ش��Bi�{J�mB��l�C�FؾqG��k4�`Q��8��?V	���a�x|u�s��s��J�*���o��(�ۃ�P���S��O/����)f�����\��7?����h�[|��'|D�
뎼J��k�T	J�&��Yx�k�8#a]ےN�"B��sA��T�55�*�^T�
E�|znZ<Gi%�m'JYKQ
�?��K�Pu��9��SN	��2���i��*�}�/�;4�p�GQ������
����Qb�����I&7�,��|�w|�׋c:
g�W�WU1�����O��Z4]�N~l��W{M���!�7�cZ��)��'�J�XaY8��7�|����
�$�Y�)�Y�<��
�a�������L�l�׵0wo��X�_���e8����y�.��f�Z�6�z��@M�����#��4���&զ	擘jdͤ����X'�� �}ս���^)�����X��6��1�F)�0��^	o��͗O��e��3�t8C�
W�?H�Q4y�mN��̀�to�-�Q��'l�r����'����fs�C��ea��
\<�OԸ�y�#�C&������_QāU��i�?PKEePQ�$г� pip/_vendor/colorama/__init__.pyM��j�@D{}�B
7�aKiSD��mLR�����n��ʶ�>� �0�y��r����hg��C�@�M�j^�|��� pK1Q���z��l�ā\vR�qdc<n���L$�/�K��� �z���.�ċ�&:�T�����R��D�mMn�bQ^F�!��2ﯤ�%zϰZ�'W��_PKEePQ>�_��	pip/_vendor/colorama/ansi.py�VQs�8~���Ls��m��������\��x{���'����[��p�i�@��v����Y~l�(�!�T%��{*T
�s�~���c��O�NIY\B�H2���l�5K�kٶm�&�6�w)�
pT�$��rB��
)$�b���q�#i&L�-�4�]k	pK����k��=��r��fbs�W�Z7�B-jJ�|L6 �W��b[��f[�`Z���iŰ6Մ*u}��W�[��%@�'Z�7"�(0�mo�*A���Q��g�����6~�1�5*B	���A�)�%����2?��o6J��^p�|݀V��D��j�0d��0lIH�e\_WD%@���(`�b�_H�H��y��OX�
��v�y�3N��bөb�ڃN�7R�#8Q�ș�N�4ы����+d�TbvN����Lu�Zg�p�"H���닭	ϔ���B��Z�e���F}�C���6�t]F�c�틽�bO�̑F�ݮ7p'd&.;���Eh�van\1����i�ꨢ��/����k�~�
�����+��d��r�����0�������L@�8 ��h�%�tl@�����J\�-�`Vz�L���/s<gR��w�l5<���<��1���~�
�MY�2XՁw�A��*|��A[S&�f����y&�3Tzr�>���<��T�ŌO'w�+sVa��T�U6�[欎�^ge��9�R�ʳ�o*@�U�x[欎�oj^��Ox�k�����^��&/xM^��5y���^p�&3�N�\������i2��49�u�,�:uO,�!���BK-O�[��l�xN�H��A8��?$�e�g������=x�C�-S�K�(�m�2X��ֿPKEePQ#�lsi�(#pip/_vendor/colorama/ansitowin32.py�Z�s۸��z�AT*ɯNN5�,�b'�}c;㦶�S��3E�0�z����x��C�.�g2�c���b���.�d���$yL��䜦2bkr�p4 ��g�?�h&�€ł��`�\^�'W�2#6�	�	O%I��ka/��ٙ�|I4!1OGp�#O
�Ni�n�:���Ǩ��X�ti5��n{x1�O�UE��Њ��4�z�K�ЗLȝ��9$W<�gF����\���;�
I3��� �B��)���&	K=��3dW�u:��/�D(Q�,X*�~�3���0��#Jd
!Jh�bI����Ɍ��F���R��s&��� *��y��OIg���y���a$pg�"6��M��g���K�1�B�8�It͞��0��{�E3TnN{$���U��%��s�Y<e�`f	��\�w0r��=���[0q��%\򙃓{	�c"�lC��<�Uк��[����
�!��…��9�8x�0縘2��11R^yX#��1̛�M�~޽��:�� ���Ĉ�,!��r��X��_���Z��B�D��/|�E|5�r�2?��;8����_�����bݟr&b�7��O_�85}�JX.2��^�W��dI�a`L�T���u�Y�,|�kw5���
�`U�T
諓���q��y�v4<z�`VSh�e�T
�v�\]��ÊE�{��O_�磛�������hs��oa��ʈD�����-�s�_Is����w,��w��N�Ҭ�,��˂��.�s�~��sI����&�$MyZ2��H#Q��Q�4�gb��: `3.�Dq���w&jN�h���ME��,rw�KTsŸX&[‚����%E�=�F����ul2��� ���PU�fz�`��](�P1m{*e � C�LJ��P���@�lGH�Xr[��β8@6!T'Q�h�?�7�uʐ~h�����������?>N���=��G�=uA���%H9P�d�#rk< x?���v�:��3�QN����_�!��.��ܡ*�k!��1_.!:.��V�!.���sM3`	&���.�]��y1O�ɵZ�zݪU��`�v�\T�vn=Y�,�TaD�fB�$pz��E�Y3���BCf�r`���%ˡ��ҽ���M�I+�_9_��)��Z��H<�W:�AX-I'�ǜ{�k!1��$X��.�3X"�,P-,� (���U�"�-�TH&TgF����1`*���p-KT�Y��xl0��z��;��@
�<�p@��Pv�J���s�./
��7�2Q�?:�E߈��p����~�ns�8R�b>Oܪ����Y��Y�6y�a�r��p�2���r}��Ej���#}ey��2�a3Eb%߬N�w�����p�k��Z���a�0#j3�r��~XV�s�X*�U��(�+�m-�F�w�SWʊ�[�I#��[H�P���/J�s�Jp�L�:�X:���E�
(\@u�[ƌM��#32C���2ѻ���گ
N,o:�A�U�;��z�J�Bd��x��FI�4a�E)�W��Mwh�B��*�}.ZU��b�
�$��|K��,�p���P�;�4
��—���E�!h�u��&1��b�`%s�
��9��"T,7{W)8���L*�kH	9��g��֖�������]^�`�5>ŝ~�ע{zs���Q���!�V����-W�7�G��Z�{1��dpz9rf�,����m�7�����M���dr�Y[�n�:������߷{�e��I���ч���h3�h���߶iߟ_ܵ8��>y�j�m���*)��?�H��b�7� IZ��H*aZ��Ėh:{Z�Ȗx�Mo��dK,�X�pFfKD̴V8�Ke�[��rk��Nw��&�_榊�fnR�Un�h�q�үqS�����%n�9����v��*�ܤ0*�Th�&�]�z7q���27i�6�M�Ԕ6o'_37ՓhK�njJ�-њ��1��īsSC�m���M�ɷ%b��RqK�njH�F�ߪ
.n���~m�ZnM[���]@���ڳbsFl����f�t��Qheb���Ƽ)o o���+�x�[o�&_��^g��o��u�w�ۼ-~3 ���u���yt�9������σP�|��˙3=�ߣ�Z� 8�ޖ�U�m�=��K�ړT��,�p�CԪ�A�
��j�8�F{��	�*i�_�T�7@��s�e3�pBR�'嘤)��b<GR���kLI�>�Z��G$OG@��H
j�j<����!�)����k�'��CG,־Փ��)r��]Y���_l�r��1�?m���JAц�L�x����Tz�U�um��]�M��O=�U�i��E^�p
�`k�G(�n$0=;���e�D̃5�%]��y��?��PdJT�'�����Tj�#�Q�#0���o`��Qy�]n���#�zm���fW�-{a�� �|���e�.T�	�&�x�����D�hUk�~�.�"�3�9��@�h�)���\�zJ����TmX�xPXO�@%W�o�3Ѕ�q��9��&?���e�g���ok��Zۊ��
� eyV�[���-cjC|j"
c�?�\�����p���}B��2�M�fI��V���]�赲���ETB{R2$�I��4�dJY�#��;嫸G�p�s
��n�a.i��~���3;`��~��Ω�S7c��}�A{�������+':�9�Á�bT����4vr�����ט�JU�c���n�xj`�r��mGSen7�IG�D�����[U�-?�����w�@���shLC�$B�a��	c���4�8����?���I�b�F��|V��?�P=�5��,8]��%8Y;�PKEePQoEr�{"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�PKEePQ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�@�]�`�PKEePQ�(���&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��?PKEePQz�S7]Epip/_vendor/distlib/__init__.py�Q�N�0��+,��j��c�IՆ��Ze��ڤr]����n��/����&7H]flB��C�H�`�����-}�Og�l�a�>A�?M-2)�3`|@x=�Y�]�?��]k3�F0	�@K?�d�-;�
B��r�#B�^�6�*�#��,�����}�}�;Px�T�#���W*I��i�$���4�fc��R7
<��K�_S�;�_�
d��R��tNsr�E�N��,_�M���/�u�"r�j�E�C�N�7���U�7�C>8�V�9z�k��o�0u�����5
+��RB���
�;�Ry����T�F~dq7(�����
��H�β�����PKEePQ���+6+��pip/_vendor/distlib/compat.py�}�z�6��=�Ԟb9%ڲ�s�veڑ厦�c�Ivu�"Y#Y��r�'߷����O���V���o���������9�p_<<q�d�͑h�����޾8.W�*��mDp<O>=�>�eE�����*�f�dqZ�i"�R4��x�nn�B����>�R�l�$j2�
>���`�����)��M��˴h�y��oN�O^���ͻFDE"��^^�>������s���-�r)��E۴U:��l�*+h~]�yۤs���'/k��Jէz]��5�hO������wq�j�)�rRUeu$ľXU��2:E	�M+���L�,��Z ��0�yV,���W���p��9Т�9=SH��<}�7�UZ�P�Q��OSzܤ�z��"F�`�$�����F�X�g�e�}>�n���
�'��_j��qY,��WQU#k�#|_�n�p~�w�A���m��k�V9uR��)~j����eVЇz�g�|L�-`yv�@�J�B�[�K[64�9}��P�OVQs[D˔I�S-�@�)N�A�(��[%SA� 1'{'I<nPO�4d���r6QÓ��ф�
|�ô�G����x�[��ڪ���{&s�O\�<єy��҂����U
�}�9��/.^��AZP���:�����װ4�T�|�}Y%��l�ou{�&Y�ƍ�q�+
c2G�ӊɁ���;�f�c�K�&�n�xvm��n�W����ڴ%�?t�����o�"�#�_�q�9�K֬A&x!U�=h�U����r֤US��^�,Ն��v�u�u��,(�\U��YJ\I��ap[֍!��Ѩ{6�/�V����O����W�88�R�
�S16ۄL����(�02�I�fV���4���9�*
�r�%���'�~7����Q�BS�-�_x�&2��Zy�-���vNœ��Dt����@�-�?+wQ����G�hrz�}�VZl��ާ�{�|Xy�:	-l��Z��Jް���T�=�o�\������:�.��p3��,s���o՗��T���K��5ۦh2̖Ҝt��g3]]��6(����LKg�o�W�;z�3���<$M���$47j�mZ���Ԋ��L��/���eʞ���_Hb�1@�GMʤ�y�(�A{�叆!@���7��9kͤ`��8-�w�{��8��zvh��o�(7�1��q������'��
���§��ç��F�8z�fi������Q�����y�=�!�I4�N/�L_��H
��He��3�ܽ��I�
ơ���Y��S�te�̸�S������
Uw�\m��-3�5�Ҧ����8�k�Y�?����G"z[f	p��`*��U�Vo!^�k@s��H�e���}��B�)��
�&�"�Ԅx&�z��&���:���4q���<��"Z�0��7(�9{�`[�{�����@�FuY�Tķ% �|�2�A=	�)��
��Xt�
w����H��'0����>X�pmW���0#C,&��PW��$��(��W�D�fz���̑�|m�A�,�ah��� \*����|�\�<�Q
WDhv~"�
i
��	j�E�����Y|kĨ^B|UQ��
}�
Q��u��ZV,<�e����&y����A�]1��6-�wt#-x(�YS��b�2C��X�8��H�&O���%��A��R��˿�W��.�
,CqX��Ys������<�?v'���OC��ob�����H�.��$8�`��S��`��2�*h9Gy�7����h1
�\�U(OL�שK�3���J�B�\z�S��7�����!����#ͫ�1tAy%l��(I����Qw*���>�)@�
K�tV�����G; ��L$�����ƨ��?����!M���=
O�������^�����61��o�1;So[���*[�q�7�!6|(�m�b.#A
0t�x`��z���q8/㻴	o��l���D3�P
�,.�'�~N9B���ɵ9J�cQ�Q�)����B&‚��cT����8��tTwM�2>	XI����*���3�A�E[�Zwh^���&�\�p����?F��t�:��D���Ȃ������a�BJR"�H�o�r|�b~������o����ޜ�>y>�DPz��SV�Z��tP�1hȟAg>˛��:0t��.]O�[$./��$؂
Xy����CK���n��{�f�3���U�\E�j_���,�5��x��'�
r�����9�D��� $�E9�9�
+7Ȣ4��?g��k?i��?���q��� �U�"Q"yT=,;p�ڃ��š�m6��F��GO��(����Rd�ZM��?�s;ҋ��o%��2���t�Ԋ[���7~ �.lC��c��z�ɤ�����?���0�k��0�
,!`OU��A@'7��<��
�4�z���i�d���ޭM�s
��o�g�!&H�H�����]�
J��6��3q��Xg��@k��ɲ͛��E]���ј2�^�����������G�M��i��p>O����*R�e�\�mT��H�C��͌���=ɧ21��� ^�c�eV���_���|�R�o�]�����"�p>�����H�zv�D����a9�&\�)����
�E`�T�V*��("�2L��F�����B�	�{i��B�"e�bﶆ�����fUY��!^�	a��QA�W�{
@P���4�<qDOS���1�9v #I
��#"�J)�)XL����Y�d�(��PBp?1�p���M�����6@�&���$��`dxh/
~4�G��`��xS@"��ﲺ�����H��l�SQ`��E(V�r
Ҟ�+%a�F擦e��"/�;�ە|$�"<+#a�@��u'�7��#�a�%��$��¶U���|�Ji3��-p�]�+ʅ���V�Df=ahˁ�2��>�z�{�d4�q���
�D?��=���	�6=w�ި3���9)	Q����"�"@@۠�A�<�ϊ�OF>o�Gw�Dw(��5����]"K� �}�L�aV��=�v=�#$���HSd_��r!��1L���G���h��X��z�T@f����;�]1f$���i�eu?����\D������oi�-��6k��p�Y*�������M98hpW���=�*Qk^�Fr���j��&��JB)Nk�Տr�ڒ���-d9Gv��z��������M2�$����Kɴ���yv�jIC��� h�K�E
K@�.�;�3��-漁�u)~�ЄlCI*l�A��&F�)ƺ5����f�gZ�/��h59��թ�`��)���Q��e�� J@X"EƋ��GG��w�Q< ���ߎ����I�kk�'5daF��������^ֵ�;Cy�-��\���3�!��{\^��l��eWTG�+���Je_�Q5M�C,5�cR���ǓawUA�Y@w��cw�q���C�k`72�����l���
�� %=���'�^��b*��a�%,W�[��\I�	�)0@(c2�	m)��ƀ0���8�3���?�*X!���l0�C6�"n�룃!�$[n�])�l��lv�@;�{�E2�S[*krs��VF�oǯ֯�cR�]E�W���ٲ������h�������ڐ:_��v��0���H���A�Xv]s�Ї�a�BT�ꆉ�c��ߙ��F��Jl).�� ���u!���eC����J�
F�&<��v���M6�|�� �S�y�p5t�=����_|q��F]�����b%����TvC�g��65'�@���ޒ`���=����(缐�T��] ��q�
�P��L,)-hV��k�q������۱:��"��6�b�?b��_����?1<��ls��@����yTܠ^
�Ϟ���\L�Ċ��kJ;<i�"�K��H����d
�\�V_X���6V8>F@Wq�(n������@����y�p�ɴ��s2�v=�j�~
�_M�Fv"�E*n��
�
�L��mO�b=��	�x��G�c�$�t�x0�B��ّ���OLB�B�H���KB��UB:)��.-��i�5Ir�0�`s�S�u����o�o.^|Ω�ve��J�t�$K�U�쥏�ˣ�Տ���������Ȑ�9,�9JQN��*�A�m?�t��o$t��S��_�qhg@�h�c��l�D�*�/�tFl	�M�(\>�ұ��h�1�q0�rN�q&F��F�h��t�	��
���B��#R��8hV����/�o�!)�M��΁
��h��sE����`��<sS��3���.�ߏƪ�G��猔�lM}[�y�o�{�܅|�H9�u�Vq�9~!NQ�i�
�'X/�[�Dq��q�*�3�G�Q��5Ɔ�]	 �L;CQSVFV�T�	�i���2z�-�%���X��&�� �D��Z���M�gu�Dk���R:xD�c�[*����Ӵ��\(��0k	�噶kx���
�^�c]�#��h,�*�*]<~��S���S���T�J��tT�tB��t�
h$�����",�Q���!c��0�NP�E[u��&�m�X/�	WfO��d�#�%uvC5vj�Ϥ3f�:�2�>��a���#��tu�)j���M��S��T2��)���6�^�y��@b̉���&��Kg�P�Y��|B���j^7�*p�Po��'W����˙����e/n4`\��v��Ȋd��8�k�}�\j�Z��Dg�$�e�)-MŎ>���Q�=���\�)=��ja�<;?>=%�+8eU���UNJ
�~�b9��)�w�� �>�����-k�8R��^f5M���/��$�]���=����n}�Oկ㐫�x4Ր�)T��.��Ί�Øu�O�:>0�� ˾��h-"q��z���%�œ\;d*�r���e�7�f��r'�:���f`O���,���f�@�7N��$���mL��]Q�w����{�G��#���#�ב3lt�DĿ]�([tJ�[JG,��?i�9T%���"܍11ǚ�����ӥ<�>��f��{��!�6��{(��>��Ʉ��_-l�!G3�h�><�0�pL�	`Ì^T�SZ(���/�ٛ�=��
���Mp�)��l�i	���r�D0�M=�}�������f[�va ϰ>����ɏ��p_�����x��r��?�?|)�9Z���H�8ty<�Bk�>�bw#P�ɜ�K���	�ө������@��D��n����m܍̰�
�FY�m���Dַ�A�Vz
Z�:b��qyA��-�-��ޝ�?q.p��ru�}P��C���0t��c[{�?D!1�K)����=1XRvQ��c��x�B����<�\
`�W��쬪y�����z����ih߶����a�%�fJY�	7������غU�i�W�(ڏ�!��{}�L�
֢ ���	�V�m�h �-�mFN�8TF��Ď#���X��L'�&�
��8��%�e�i��^�i�'���L�o��!�hGޢ�ɫF�>�������ap�s#n�JT�]�Ò[�Y-�Sp=�sF��Y��Co%���JE�~3V�o�L�tWB�Uci@-�\��d��
L�,3Ģ/��x�����*�΀v�f齑����/��^��K��gu8�b��,x���:�b���F�E��<p"��,�F�!�x ���+���՘6����e�LJ�<E�4_C���X��DN�|�R����ʚ�Vd�9A��yʶ����&t�1����x�fܢo$Cߦ�B��N�Z�ר�ɵ��k����QC��~�9�j��gF"�5�2�̏���*��M@�A�_����k�/��>Z�� 6iTS�"�G&4}PM��\�����'=�����B7A�+I…]r}%>h+�&�Ƹ����b��z,��l<��a�I"�A
{)j�~�ZN����%�ƭnW\9�^�j�3����2:��ŢPMԩ��[������>�F����2���u@9U�4�âq~�8��	Vi�����6�o�
�@.ar���7�V��
Gv��j�z�0�z�b(aٴ���z�O��'׻�8��W�y��1���|�
�����_':N�I+��wFʠ��'
��V&���� ���0fy����j|��֠�j_*=\y�H&��z�0n��B����í�\�}��L�;�<!{	��cg��@x�-j�.Vt#�M�$�:Y !a^z'��@Ew�&�	?�����m�Kg��e����2��?G�M9��VX�j�[',�IaL��� �����.�tWM�3ə��_�ɚb��|����",请�o���F�$i��;M`�S�h뾽��L}e�RX)ϸ���-�k�[_�yخ9�}�8�E����5=�����C!`�ƻ
_���mjn�F�� Ye�
�xm!�>�Z�t�P;7mbYkR��M��N��%���@�p�'�)6^E*��Z<�Hb�-�Ȅ��O���*��դ?�V���{������G��D�w���[��J�|�d��&eM�{E@��›���qߦsl0�Ux$��������?�4h?���5�]���B�+8nѹ�no��ld��1�q���Ww�f����F�
lx��i7#e�?�7C��C/���m���D���$�I�Od�ұg�i���3������0܉
A:�W�8<.���}�Vi���}��O���b��/�R�����آj)����S���ϧS�yEm�Z��x��+�J�1<Kg��6kX_gE\V+̷��"�h�=�V2�丹��&�NWR�Xۚ.&PI�\���f]#UoPI�wYz?��J��S�SƏ[�2n�c�A���7=�B~fR���*<|����@`�N(��3�Y�M1]���F92=�r��^���I�ڌק*��Z�'b����I�CNo�^�mv�*�98*��dxs
�ށ�fw]���*�i��#x>w�79��)ױw�2�)y򬸫9����uN5\xA	%��tʑ��5��H�A�<sQ�+��}m���y�6�~�o��.�4��\�A
�Y�M�(�)���ˉ	��7�EENoS͚�R��Б�*�sY��^�|7/O~������ϫps��;�lɔII�Ƥ�8�n��:G�:���i>���Gu�`w�(�r	?%�}*	���Ak-QQPu�5b�9�&o!W��	��!���ڨ�b;ħ�����x�ݡ�D�uU�v�j�j2�;���Wn3���$�PG@��B��#�].��T�hϯ��8��;Z�<}g��1֔�E5�Qr�h�l��O�l*�����KQ&���lm�UsʗCb
M8gQ˟h�q��
o�T�l��[��p���d�����{}k��ě�$��A�I�Z�<��)�ˣZI
���Ǘ�W]��ZŶ�9�Y>z��ɶ~�CH,9/�(��^�w`�1h֯�\�?���<�GnQ��ϩ�N���`�浔�̽ȑ�N+
�(�B�U;2�,�*�����Dm��]iI�l1�T0V�>��͔?�;��8�
�e��F�+��{��$�K�P·L&�K�Y~��C[�19��*�U���n$jw��/�rz|x�ΰBs^�ɦYm�L�/�i���޳}|�k�
Ӕ��8���^{(�=�lӹ?�����~��g�E	a�׭`��dCvyԟ���#͝���w�ֽ�%Rm���kSR�3,k�;k@h��B�w�m'�.�H��-0t��̼�_��b_�9}q�\���̰�����۝/�L�Z1'�dNJ:y�-ܖ(�G"���*]'���6���K��=��ą����.C�y�Ⱦ��݂��&���Fx��L�o`=gOf�Bn�C���;�4�����f��&%_X���!+����E�͘b��{Q��Ҁb�g��T�E�%,�2�&�ho޳r��F�5s ��:8�e��+o�T
�Qݤ������=��n�q�lG��Dq��P�-�����t��q����0�$����\�i{�ly�L�l�7D�b7�X�TH4z�7��
O���+xC/��=�H��2K/Cq��t+%�Թ�)]0e��ɝ�����i݃vKI��Y}��:h���gd�N�$=�R��469Xں��P����$<†������Q����B�c�d;���l��{�T��	Vy�{��p��H��	$\Q5�$I��:y:sNW!�ӏB�K������bfF��}_|�e��J�ݧ��@��r��|$zD�u�Q+������iұb6��B�$��n�ǧ�/_�L����ΰ̸�g{97.��cb�U��m�FUK���^�ֻ�y�)�+���P��5�
��U��f�R� Lo���B��@���Q�Z�2��H&�N�`�n��S��B���r�\��~;U1Bw������M�UY��ޗvu�,	�ۿ��y�E�V�y-���/O!o�h������[�&ʁ�?�Ɲ��y���!��F3Cޯ�b�N���Ł�V�S�]�K�	������njr�2�����v=bO����f��䭢�����Cs�}t�e�I3I�bA<�����xdd�Ș���] �|�yU�a��V�K�y�=��1�6�}Z�L�]����5��A��3/�LmH�G<pe̽/$I�99yo���R�4�*��r,�9G��L\^v���K;l1�-H֠�n���;�����X
�5g�zR�[
J�Ø��O�՝�*i�ߎu��($P#�[�jV�^�s���R��'�|�b<>{���_B[V�XS����.��#[��H�X1���w�E���M��ˆ':��#<�M��<�f��Q��w��/ZŒ5��
�Y��6���q�\EUVc��"��z��^B�5^@ܸ��d����wy%��NA�96��%۹�(r2��G&o���u�i�^�~U��.�t#��=�R��wʎQ�����{2�8�^F�,
�hF��R��JN���eWTV��V*��d�n.���*q��3�}8o��1ShX��n�ť��f0Y��1�j@��EI�$)�좴�����S��R_0�)�	��l�,�Rpv���ˋ��'�ݗ_F�_῏��_=��|���j.cP�M�K�A��2�L՝�CIƻ��/�	|񉺌A�_�H<��1�J��u�%����J �Ბ��ծ�2I��tr8}�e����{�kz�%�l.��ERXX�Gu2�)	�I��y�~x�\���Z[:�8��-&5�
���jY%�V�X�M\0��k�"�&�Znb���C���U�]4�G��9�ۗ��NIM]�C��G���,�ݑDq[�����e7��=��Y�1���:��y�+��F��[L[.O���O�R�~�����wp����C���&"���K3��p4�t�(ޑ�t�
T���;��^\T��lNhx�]	�.R���SϦ����7X�57�]���w��!� ���Ԑ�4�ק^�#�v��b������rg�w3=|�p��ª���'���CsWy#�Z�
ʛ6+M��~�֦Z���ث�앛%�f��xn����l�/΃(�gw���5J��~���9
w^<�]7\����i�sNA�<V��\ta.�~���u�˾jU9>{����ճ����/�K��
����:��ݗs^}29z��Z_�'�3O]~��� 0�8��O&���lx�C�ӗ�O~�ui�����ϧL>��CB:W����og��|����ڍmNjj�{��j&��O�2��;�
���p����d��/�C��,�LT0��ϋw��(,]���p�c�{��PK��ca���ߦ����{ͭu�/��%S��wt�@&d�Ff��X�U�����5��|7�8t*(�7�٣i{��Yu7"g4%��Ҧ���c��+)��{�e����l��`
+u���2�W�{;�Xl��v��G�nO�6��M�u��h���C�\)����^S,?5S`�t��_��^5o����}�*xj
wq�KSEq�/K��(���(���F.�u ����^�em�8�E�2.��|sH�P��C�},*b*u��KY�Ed����N=c9|0����)(]h�T#`�Ǖ��H���%�&�Jl�	Z�h �����W���L	n�1o��#�J�$3L� �L�
/l�@�
m��rY���2�[qێ�H�蹅��ݞ}hy�]6��Lh�y��tQ�����!�PTEov(Z<�,�~���G�k�S)6O�&�JW���Jmf�n댐�H�.G_l�����l�[!�<KI��$+��"|:Y��ʼn�㿃ֵ�K�M��^���{���M���2tԎw?�04��]��s�ў�Ó�e��][kc���Ag���]�r�#'W��--9b�����o5P٩Be�'�������t��&\1�����
�J��?�^#�?�WO�����'E~�$�8p�Ao�r���ʉ����hX�%��J��ۊqҖc�<����͒h�a,m�0_M�����W��Z�y-5���蓟%%�i��yK@<�)aR�uS.7Ž�CTn&5��=x��^4�c��"�����טq�H��q�־��_1{d-VLT�xl�@
^;�c[��1�*}o޽���3��~V��\b��P��q#JU��]rp7�HƁ�կxm%�b�`*��NׅS���p���`�S�WT|y��"�lb�4Y�5��
t��U8�v+Ȍ�$ī|���fH�Y��PKEePQ�@c��/s�pip/_vendor/distlib/database.py�}ksɑ�w����h����oi�3�X�N�xf���@��a��� 	���_>�h���ώ[�="�UYUYY��������Q6oe}u�m�������g�zۖW�}6z6ξ���/��?�>\���n��}���Vd�6�zQ�eSO��{!��/���~6���ٳ7�?�{���?�y��v�=z{�6���d�j]���{O�m��f��ߴb6�6M�g���	�YU��-���@>�,:��W���w�[݋��*/�/�Ewm}���+@�����+��E�~��_�5�%';Us|^v8��\�qA��]�i碓-��
�����F>�m���+�Ϻ�5�g�}_w�5�*�Vgm۴��J��C�z�^�&٫���O?�ξ}���髳I�ÿ����������w��3�0��o���#����V��)[��I6/`�ٺm֢�����J̀Ffr���[Q,f�aw�쮅�7_����;x.Z��|؎f����rN����-/7��$����zh!�C{�<�&�Ϯ�^��f����-PP�愄&Z����)��K�m4cT�`�g?�}���{�bh���x$W=�����y����hK���U5=x��j�����8}���]����ٳ7��������繿7����=;{�IC��~���y���}3;���qJS,�0��yUt]6{�2j.�~|Lc!+�O���SQ�*�k�^�����.�la�@�[�%�.��lԉj)������(�����H�\L��+��n���6kj�-�60���i8�;�B��_�ϸ���W����}�O���+Q�Cky�
��Z�p��X����ﲒ���2{�c�Sp�;�d`��bA�Ў%��Xd���8k�3�c�+ŊZ���p�Kj�ȯ�ϵYձC���s��#,���]�mXk���u���?��@ʢ^Џc}|
���wb
��+��άY�D�$�����F�v]ΉjA�������1��'���'s^m@�����������iL���#̓A"1V⪘o3BJ��EF�f�7
��)��2��#2���o:XC��s-Q�n���4{�����b^.K�H�C�9dqla��~h70n]vweU�$hn�u ka�m-�����q��s'���+T�hӥ���x��[��%R+�2��L-'-p݉�h`};�2�?Q�a{,�7��ˊ8Od6�[�3�h�ryTQt��@�s��m��EF��tQ(�춨6�I�ϟZ14��R�F�D'�aǞ��;HG,�}������@R0ԸD0���[xږ�Z�*��bs[�������$���<�~Y-��)`v�<#w"�0i���hu>+*TM��_�y|N���,��=��^��l$�WS~�\\�E���M�o`g[��wcD0(`Xِ����o�_��`�J'���ٲ���QߖmS��=��
?A�imr>�I!�,�)�z�S�i�g�~D�����L�(�1@�p�8ܑ�y�r����i��RQ�b�� ($dA�ک^�;)ruߢ`�>!x��|4�g�N
�E�L�Z��W4�T��5�q|0j�x�I�Uh����#����Oʾ���[��]��m��8�(i�����MY�N�a�mV6�<�pFI�EYL�����%0��h�X����h$�MPQ_�xFӢ���j4���_v#0�|#�h�'���'9�:y1l/O�rs5��є=������k�F�P#�/����$�H�̖��?@��OHP]D�bT^"�x���b��!g��|��o�6R�{�e��z[��5�����Wd�X7�M�v�6
��5V���G@`�q]楔X�,}F�Nc�D��A �'��G��I��T��ւ;�*E�����=��dQ�V�\l ���Js!��/�B8�M�zJ���D@��߈j�\7M�8+<�0�E�h^urC����	z�
�e�Ì�E�tG	L�d@�&G��MJ�#�͋5�bVZN��n����(�����5�V��bn��{h<�ƬF‰೅�, -xj|t�
'-[�%N��H��D0���M���������c�b�q���Y5:h�U/�v�n��V.��12�"��KhP��@c^�7+іs=�	�U�֥?����o�Bο#�}l}�KTxb(������T����߸1p��6�bk9t[A0�z����pG$)t��..�CȂ��5/D��5�顏I�)�lTw��K�%�[
���g�8�Z%�<#��Ido��4��+}��a�8�~��*��[he�m��m��rA��n�`!,���%d�\�Y+���(׆��-#����5z�[ ��}R%n���Ɏ9����o2)U 9��	E�T�m(����xb+�K)2'�m�k|_~�D�;1(I�����tO���헚�j�q�ƨli}@G�rS�e�j���Z/�V�90���g[7٪i+[�:�ˊ�5p	�P��k�����tI�8��x<t�?L�A�0
�Q�F�'WyBޒ(���;a���B݄܈mv“�S��{p�>���ig�+�{�hŧ���7%��3ס0`�EƤ�����y8��;�����3�%]Ƥ�-�_o�1)�la��	�Lt��	H]Ոi8N�����%���竌KAw!��_7��_w�Au��kh(��ϑ��p����@��Rθ����hj�nHJp�d9't[j�v$�"`� �
O4�f�W
�z{���˯�����9�H��̯ɳ�8:��1�o�v���g_�L�ϣ�I���t�<{��\[ɵ���L
l���/��Q^�@�<���mO�	���ӍL�_>7
5@���m�5����J�mq[�'���/���
���Ϣ]�����V04�N��4�N��l(�	�Hs?W��w�A���j��B����g�ra��G�� ����X�xW�%D׎�С�:�T(
M�IXmy�a��>�1��T�m0"
�>_#�IB���i:� z��ǖA�����'	!�\o]��&�<q��t�EO��u�K5%���)P9ݬ����	
�,�=��&Ʃ��3B\$�h�0-���c������/p�!.�G�=�12� ��`(Eۗ�MU�x ���P�pG:Q��k}�~g�5 KMH�l5��$d
%��R�ck{8#m'��o>��K���( #j�U��BI�)�4�H�8y�X�{���rK�w�mf��h�P*��B2n8&(�ȅd�����ˬ{Eg%��+����6]�b�.���	|%��;"b�'^�K?$����fα�j����K�/��/FH�z�ձc���
`C�-��q�����`�K��Z0�#�YG�;%0��<��X��<�f����h6���4� _��*��Q���1�`���2�@�Jv��j�ٻkڅ�K�W�7ŕ��-j�=O�IT�]-c�*�S��H�����%}^��0#�qP�[I]^�$�9P';�Ks�m��<�� ՟ni`��SǫH-��B����3��y:�U��+Qd�ݖ]c9�ҫ��|C��U͜m�fN���?=�}[t����K��˖��0��Э�_��۱$�r�7@thO��ɹ3��V5�b�i�.�4�&�qL+=�7��IN
W2�JEʑJ�.D�?���K�
��M(v���3y��Q�zLH�3�;t�sH?�kU’+4ցu�f��td����U��̝*��r�Q'�=���rR>o�.�d>q(v�Z��釗	J����ƕ��k`��e�����?R�}$��ĺו�[�
�։&X�P�7���T�0
�ERVD���]�_�c/��J�P�#�4C[�B�j�F?r���d��
�e��`$�_L�D�_{���Ʌy�-�ZX�	S
���$cNubq���T`��V�$m��Z
Ч��2����i�:��7=�?�8��9=(&�����M���:��Վ�e���[�#�
)�xJ�k	(-7(_U7&UC
�xƪ���Ld�)r�Qk`H!�2���Ä��%S���AW��(�Tv�n�O�1.Mgǐ�q�c=|
�;j�k�3O�b�Q��5<25��Q���<����b\����D��y����L>Z5�VbM���X$]��m�H�1�-�7���w����OZ@��S9HdcGj9�Ï�?�)��8�5�D{)<H�-�j+b��N�s'�*����x`)=Q�I�8��]ʫ�|�z���c~��u�z{ђ�,˿���IY���dʥ���ڀVު��A<�4�BQ�UF���6�ey�Lv����������2Nw�e���L�GO�?
iH	����栬J�lS[ͱ��dͷ#�I��j�5��fN��%�[m�����3���B�/}�	X���l�&��Z��Z�nq���Y��ʵE?y4ʛ�!��f��7͈Q�Hbͮ%�:Y��g�]���-PC��)����^�`K�����R�yb�T�0Ch��BHQKd~QF��"��K�*�"A�jt�*	�s��K�#�ZRi�2���}��\!�rMd���C�u#��;�H�df_�_ZJ;V'���u�/��KL�)�LST���9�j�D�8!�v�":�7�X�db�&ƕ�8�0��Z��g�H��<�$���"�쫐��L�d<ҥg���39�
�Ԟ�A�1�SM|�[�:��I��.���ݻ}:'�2���.�k�I�%�ƹ3+���
�*���y��K3;u�^�?*���ij?���^n{��!��Zk��Щʁ�\�K襑4�*��4����E�|Mo�k\\��u�y~q��M���+l$�}�G���g_���_�x�ap_�F�r��bg@��5:~�>_�^��!��0�ੌb�b�����UY��v)4�'٫�_�ǹ��HP\�ttL�x{IbS���+�p��=f��Ks_	2X.
0���D�(n�T�':�Or��vmnO'2�o��H#��
�o_y0�@���D+uU�P��`��M�3�d����;њ�7q}m����/J���͸��]��R�.��J�XNg�-���y=��A�򢛗e$��I��#��:���&��$Y���p��|��&$��������/#P�_���GFp�o��,��V.P�@��W7x|�AI�X�	2D8�q~����8�6�MEr� j�G��؏����g:���'&3/ύ+;D�3��4�M�Y��':E����;�9z�D��r�zS�EYa�+a��+�
K��u�~=e��L\�8��l]!z�Ω�G�t�`RS�)�0/;4RO�n�8� ��RD{D��Z�*�l�ŗJ"����0'�D��9�*�~�tQ��H��O�&K����;�Tm�w��'%�z*���c�*� 
�w�ֱPE|,@AJ��$�)�v8Ek���f�5\��ux�y߬g��֕����{@F7Z{>ڱf-�i/sڝe$|�7�Y,FF�Q�</q���	G�nb��w���-���y~�q������~8e�83��	<�a�t�v�
[w�s�Qr�(�H��1�.c�OC�ة��o�]����ʿ�)�P/s}Ճ��c�lE�-��fBf���3�8��sP{Cht����;������B=�.�3N9�(`��Z/U�r�����H�k3���֕�F�D�!�ě=k�yxf��*�x��T�p��R-�2���:����W��A�ݷ��Hq���q��掂	�W��UّI��ZU�+�oQ_�Q���'ٗ�x)�\*6�m��#A��~��G;>�1�jyey!��d����i�O�	��D"����pa��,�!�QY 2
b[�8���TF�[BRs���/��
T�w�	G`P�B�y�+
�f[P�/���z�a;CӉ�O�˦�B`r\ɯ81�Flyq�6�m�b�;��_�ё�m��@
zS�s��i���b������*���Y�d���]����]����^��tw���.*pʽJ�U~K�Հ��.�U޹(eh~p���.L��I�!���e%
��Ym���wQm��*������Q�Н�)%��|8;�K�ӷ/8���V��Z�u�-�����K��F1>�+�F�'dL7�Y�Y�6�&͂p(��L�kJ���%��s�h.��u�3���x�e�v�
��L�HJj_��I,O���Y��?���>��x����dF4�$g���qED�L�I{&]�+/��}��RYG�Rf�%��A������!��Q�=V
�[��e?..F������������j!��dy�I��n� [���˹1q9C��������M=Xޖ�L�c��K>s��a�\6z-��w���Ƅ$/v�ѝ��k�,\G/j��@]�`�kuS�^i��e��,RQ��V�u�H��u)�`/ӌ̄
��5x�m
�"����$tmn�s��*Vk�u,��(��-�����n�!���+p|U��q)��
�
���a�哦���d0���
�Lvtjǭ�s,s�6��o��EC��zӳɉ���vR}��o��)���n�(�5��@10��	15�0�9|)+��v��~�u�_��U$B��˵��EkwҤ,E�#��B��p�|�SE;]�Ā�T��Q	��6�����l��v�R�1/>5���8�!	OM��bf�}V��XOc+
V��sbcB7�
���!���)ؓ���;�h�R�k�Z<�.��Qd�۠�c�%�}�ﴰ�B��L��v�l��dP�4;C��+�ҕ�|���u���t���F��+��d�9�ח#���<+�PY���6ZԹd��FAԬ����b�e�"��De9S�
����>W�)r�~�K/������D��Xxx����Ѽs��^�!�éR������MJ]��ge���3T���Y��J8r�p��ia&%	X���2v-�l �cQ�t�&VE'd"�ق�Vg�#i��'9ͮ��qO���' ��� ���e��D$���Eq�D���XJ�x���!��N��~һH��=���`1�v8��k��#ߑ0�:����E�,r��[�����!sV�$�|��Z^"_��(�D�Қy�5Y��'zMs:9�gbJ+���F4-�T�&�+���%��[Z�	/;;���$'�e@�l�jx�.�tBBA�M
��3ʲ7��e�s���Cv�5HGh�ή6�\6�f/jf�(!h� ���Ф�(����߹�#
��4=� U�Tʾ,�\88�:X�j���q>hFN����E�;w���R,LeV~-�����q���fI�1q��:(�{�ނ���׺M��XM�����;Q7�	fDW�sAo��X�����ч�-���pߘ�U�,**�g�9�i�4�f�<8��D̳�{��i�����9+�=�4�
����v��;�E3��@f�c}��uaT�2��W��:*/�ɟ����~� �8�Ѿ=��ڵ���y��S�8�O<���D~�7D�6K�c���g��V�KeI%KV���x�u��M�Jk�0�v��g8Mu�0�VF�ё��p�v-�Gfd�I6��x�n*G�;�����tK6�G�O�,mLs5|Xֽ0��Z��,d��XDg�r��*�F!����'�rX��US�vG�F�½�U��}OQs���t�H0L�j��m�#�<_h�F7&���;���"�`���0l��l��U��ސQM�+0��i~qq$+���]�`�V2��ޟ��c�#
��/���]~1#�V��3LG�#!�N:�M<\��p2�8����N|x�,�G�Yf��+��?n�n@���u&J/���$��Ͼ�"\� ��i�Ja�D&�%�8?��8��~2��i��q�R�ѽ�]��WvH!��.E՘����X���l*_i	���"��)�R��"��gt)5%v��p��~�MM�����u,�����*CIC�ٝqv`ܭ����/^�6��K(wݚ�֦����]�E�s�����d�M+\�Ԭ���wӾ�0kA����&��:�^�CMRoЉ�Y9�*�ݢq~s�u߯��>��M�Y�6��SБE���c"P���<NUf;Q_o�c�p�Y�O���L+����e:*���>0�J�A|5Q	���
�!�^����^
3����`�F
qq�?�;·~�r��D�J/�ւ�j
���FVN�	��,%�
�a�'dMF�⛠V��d�V$_�<�pp�Js���d��a�T���k�V���<d���bWKл�<l�x?8�K�c��.�6���3���)s ��_�Ѫaxf����~��y��:=��b�5�q!~������_��	�e��5�Azb��aE�U�y'[Q+HU�2���]媛��)~4����*��"!� �E�%�8���Xq����Qƽy�����f.1hޤ<��/��?�f"٭�pt�c���sS>�b8?�՚'�^���ku�K@�3X}P�0��U��h(~�/��|������^S	�ysU��*�k��K��Лa[YJq��P[�$�KZĆwK���U"�O��){��}b�H��Aƥ��؞�Ȥ�'�u���ўE*M��hj���Q"�fW;�����r�%v��q_r����O�0{��h�����&&/k�e"vKc҉�-Y��ś}j�%����I��)�!TН|�j��؋L*��z�k��cEEDc��*�5���1��'�/�U;ۦ�HW�٠g*��U��s��C�a<ξ}��3���E��۩�D-��Y�.7���0����~��m"�Q�sC���C}�&�oB�u�;�)��Z;��y$�d(�\���^G�6~$��Dw���g+�#���k�I��V�|89���x9��b|"܁ߤ��,"y�$C�'�9�dR��L��O�=��L�:�	''M�<�����9�/�=u��Fy9=3�c�qc-��<6�7kzL��X�f}D(�Te��x��H��{�E/���rj��d�y�~�Y�0M�l�;̜����({��K		�4�ō �n�l��_������q�Ik8�wT�Q�� `D�m��R+v�K<�e������C)�`3~�,��=�zXDs"V��׋l��;y�X�;R�Cx�Z|C0��~�n�Rz�,�-k����R��E�w�n�H0�^�{](�]��/�F@��s_�������ӑ��y~�Q�X�vB�C"*m�aB���>ďmc�Y�PS"wY�bɣ��G��Z~���䋌.E�e|��C	H��b�����^	&3�F��cXIy��w��K�h����	�>I~�Aw�w�X/��nm���x�%��AZ9S�Q���N$�Q(O�8�9=2�†tI���D*�`��X\���F���~`����^�&�Ka�`�7����@�EhiƺЫ���mQw�K3�*���
�fo4�
���w'5#���]��B��2�k�""p�H��f�ݔky�/���M�O�&�e��%�?��Kr ��;r����(^?M;2�e��p��	��a"��?e(L-���8$�$�s�T�Yd}���M�ߵ�:��w*d�}�fv�]�V⼗A�c*�n:p�<�.לf�hi���96��X�Gf��X3�r_���Y!O�@ngU\�
�Yf���Ѐ�ˊ�e'�{C��bqEv.�Q�C��ҫW�1���-���
H,5������	��=�岜��"��@HE5�rT�[wv�(��zaG�9��kZz�
�~K���E� ���>����Ok^	v��jÓKz�kQK�	7��2Ղk��[��s�[M�|�3�����Bv�%���r>:IF��87����x)���و3��z��h�b,V�_gڥY/nj�Ǚ͈<6���)�:/��r���lOe��C�ɡ�Z��j+I���鱎��_�-��SdVT�$�V�A.
�>1•.�!�ܞ��H�o��?�w ���<?r�'�V���+5p/��y;��mq�z��4�C�0ؼ�Oٱ������'��g�!��	4Q���¸{�Gm���۷+��Jt���2_+�����K��m���
߫�6�^������B2$GI��0��`*kiTׁ=�:�T`Nu9ʿ9V�4�J�4�q�=��Ӹ��4z����u�Z��#l�n;Y;���[����9�-	�ޒ�o�H o��;��%��mI�}��y��It؈j6=�_�ȱ�f�4S7c�V���ps�,J��ckVꝖh�1ps�"M�`p$�@g���U�S�2���S�Z�WD}s�1#��B�B��yБ�?���\��<:/q��+������ח��I�`�A����+����Y0Ek��9AK�%Y2�Ȟ����^3����u+r�.mV���`0r�`000��FBO���iH����i%��H���s�k��k�}T����B��e8 �gqqT�7�m���� oA�K���M-�?*�Ѣdt:���~���/L�p���y��U�DV��~c�_?#�G�ܵĎ�~���#r�q����n�������џ2���5/���O��6(Dli��w�I{ �������d�ئ}���g���؊'�D���]�����s�ãt�˫yS5�m��f�6?-�l�lt!�4�"AfV�wb^��<�~�x�fUα��ɷ�EO.�4�^�R���pR����^����y"��s���6`|������gm�7�N�N������Ԝ�)g͋
���M�!�y��+�\����I�ͷ�jW�v���^7��]���͛�V�\s3�Ry��T�a��>���*%rne�FAl���ѯwǮD �h��
]�ݸyH=��Aб=a�ƨ��9��$y�m".I
���M�Ż�V���VRpb��?��+��C�;1*���c�Θiݣ�	���!]���t$b�]}Ez��c����v�|k����e���{Y(�E�
���b��ʹ�9w"�JA7�Х���G����[%�'6Ea���x���I}y��d|q����?Qq�lOa���b{�k[/��|�cgb.�	���+*�qckJd�7�Ͷni;�$TV�u
��p�DK�>�(6��yn��U���^����ћg�e��f1*O�k���|E&N�t�RY<V�#
���A���W�,2��rSV�����@�H�a9����bg�\���:ľV������!7I��d3z�.�!On�'�|f"��O�$�`����N��C��ªA�q�W!�.�Yaڬ�8ԡ��adQ���1.��!�j�}!nga�1�W����hcqX�F� ��M��֩ba�%�빾��G��˥R�(aۿ5������S�>�UQԓ6;�����u�ݝT,
?2��I�C��f]���
e��F����n'G�-/�!��R�!4�45�f���aD+�$3E�Ԭѿ� =�<�f���f��Nl�b��T�`V�ĩ�����l�rR���əI)5�K�F
wj':e�(���NIv�J��|�`Z]��B�RB�%<9��C�F�
��F�����Kܛ����2&��.�ި�]�h��	Y�_�"�����f��T}�H	u�*7LMgg�H.uA\u�|W��׿�ډ�)�ݥ��!��fѠZA���Qw�zT�LEwM<8ƙ�l�!4���F�/�uc��t�+�*�fN����|�j�Zm��D���Jυ�=4��Ƹ:i1�^�XO(����B3�r�x��s����vY['H
��?����Z����ot~P�Ak��C"x�щݬ�����Pq������O)<A�^n@>A�X#H�Aۆ ]yZ���
hVW��t�1x��%%�`U�f�1:�
�!�i���g̿+X!AcC�:��j��*'Hh���_]y�T���z�\-�$B=k�L����OV�K��f&�/L�I
o��6G+@��PKEePQ��.�3JRpip/_vendor/distlib/index.py�<k�ܶ��W��5�If�Gڠw۽��l��X���k�h$��I��v=���y������ED0��<<<�sH�8��T$E��͙�������C�(�Zm�F�/f�ٓ�_���<ދ7񏪌��K�ȼ��0�0[)^�Ͷ�śbm�b-ŷE���Q�n�1��V�)��FK���AXo�//_\�zs�F�y*^�����Oo��z��݉ڕ�6bW�L��Ϭ�l`
�gQ��j[�5��U��DV�{#w�Ze���ى�k���F��"l�kzp"?$�4�^h]h�SZ�v��T�j��ߨ�. PȾN�]�(�����J%�k��h�I=W�kY���ׯ㪺+t��F�	��U묌u%�bU�,]��L��7�/e5��#���I�le���R��\�S��TA�7R�J�Z�''H{��cB���%=�<���bvr��ŷ�߾�^\����o�8�SVg���RE���Mд��x��{lǏO��)^��M��� M�b��Ľ9���{�U���Z�ZV _^�=�®�ɬV�w�lAr__�=&Pv0A�E�(t�"��{�p�6���Z�?�J�4�:�J㫿/~0�T��^*�X����sd��"�vJ��𺄶*�T%A;`"���DF'M�3`s�C0g@)�^�Ś�EHD�r-��Z+���� T5*E5�y4����@
��tx�m���#�V�Z�igm���i.MV$s���0�j.@�5�Z���:t÷`��A\��P?�˃T.B��`n�1�H�����}]
��#R��R`�g�Q�Gb�=)��.���0�t�QUe�+��x�M��z��0��K�mT����T��u��T�+Q���;݇�-LGY�Q@�:3@�
�B��ͱ/ޠe��y
��P
l ���{W��M�,`���g^�i�_:�	�6=�&7�$β��%P����ڥEm�q�vr���Rk�;�"�Ȝ�'�����*��
�f�ֺ��x.�!�=�Fx��S'�n�Hiʄi��4d	�f����DlR��:N����-�Z�p���u~F-�q�^�
	�b�=R��<��G\�������}X��a4���t��p�V ����'(�]���%b1j���\���
4aUʑ��3Zt��+���b#+�\�m��h��9�r��p�%L&�-�WA��a���.��l{��z�Ң��5�H9Q��d�eC�F���kԘ$Z;Lس���pMH�g��%�ۺg��D4�!=@[EQI�^[7-�к�F���V/^o��a��ߋZ��
�ch\�|��^�b��J�Qц������(���X�sO�Qm�������2�(
B��c�疲E��N�:b3�J�ǣ!�X���ҽKob�J�y4��hĭ��.�@���8�]W�P�ӑv�����5 H�V$X�藨 �D�#��
�Ϳ��[���T��[Ula�_G�FB���*,wۿ��S��Ab�d�I�ϭ!�H=g���,ꊵIbht�R�r��7g�8�T�l��}�l�~D���x��tp�ܴ����
F���6���G?!h�>�H^hU�H�I�����!�U��v�"d8I��9�H��Bup��;���{S�*1��w��;8b
J1�>�"��Y�'E*�i�F��`2��ᆥ���i���Q b�OF�"�÷�#z�F���x:a�2�\���s+^���� �w0xP�R�g�ʊ��DO\j�h��<h��}�~��qsg���4"fë;�e€�@O���*'U�p.�€Bemx�ӟ�#��� hB�K��8�$Ԙx�ׅ��ʤ��uϾW(�%�$�&0��9�0!h�F�����ba0�4�����,ª��FhUo��Q�R�Њ��3�|�bވ'��Jm�Nn3Xɳ@�%ո��������P���y�L��#?I‘�C!v�1���ABl%߲�e�ӡ�Ҍ��"sGe���bF4�pXTU��1X%�P0���Uju&�&ų$���N�D����A��-�!���4���r������i Ε�D��7�-���w��Nb,8�&7�2�R�l6�����k��,�5>١{�j
T�ɘ�:]���<�Y^����c�xLؼ=�֖� t{N��`P����	8x���;5��<".Ⱥ!>=���$[�[+�v�Oo�r�hw�⽟8��}QE(�я��C���*�g��v&�AW���PK!�H��8/F0ֻB�-�qv�k0n������=0i�L�7���T�mqC�7`E�?`I��f����}JMT,0::h뜖tX��O�
���$��+:{�+n��CS	(�b9���|`WZ,�P�;j�y��W ��i�;���-#�h�1�Zg�;��υ�KrT�(��F����E��N�!2��de��&V}��|"(��r�����z��:�F 8�ח�/�f�P����e�U`��!h�!r�B �h,������_|������B���A�@bZ�� H[Ȍ@n�_�I��������7�L������UO[����;4��4�\��h��<_@�"�u�o�"���.�~�c�
�i����R��l�H�P�Gw����1m�	
��]�:�z���[�5�e�7���`n^���#���7�����5vtCN�����4�O
�UUdؼa����GV��(`�BԙX`aw�6$�M@�ϝ>>k��<�J���p��D�'��A�̴cxt"�k�:7U�D�mnyR����Dp��b[�k0�)�U����S߮���!鱉�����q��yPa�
����QQk���[B�OK,9����c�(gz&��:b'�����@�6�N$xP��L|%��Ĺ&�����p�-3DTi�`��+#~.d�Կ EX`Qa��
,��̏O�DI�8y����h��Xf�/.� �)"�-N:��+�yöy�]Qg�h B0%R3���Nq����-�"�����$�N��V`ˠ.���2U���6�����fӿ��k��l����꺶�3,��"$6�~D�)c��nP��[p}T�:e`\�8\f�B��m���a���wj�	�;��hb�D��K�׎��-R����4��a�km�n�si?���î����iT�$�4ۭ��� �]��`�)����U���~#g�᥻�ٷ���^��<Ш��O�}b`��r����ޅ�2���PIn�2q���$m]�����OK1ZM	H��[�]l�&T�ۍ:; �n�Yw(����R�2��.`?�<r}�&�QK�6`M���M��?r���e�p8��3�&�Z��-)���C�|:���AZ�uE,_��:q�rɤߚn%��3WM�p(�4�W�W��5:t�5Xy�6��R1�7��?"� ���Q��B'�^��/ڮܢ�G[����
%��#�08f����k)��uZ��&�;�x��0p>���3�^����Z����A,����BJ�m0���?�:�� �HZ�bx��خ�^Tm����d�\crx*xOUo�_�
t��_נ�^����P�϶�ZkA��?�
9Ƃ���E�Ԙ�t�j0~�C�5���p�>$0��B\%�u�`}a*z�g.꼭/��R<s\u���ݐ�r���'9d�����;��d.��>~}➕	{��5Miq���&j�� �,�Sz�*������!��*�t$�V�Jb��G
��a��n��b+��
��=���7i�GۥI'�MQo@mk�!n�m�\�f�i���{�W�"9x	��
r6�i�����f��Db��~�M)����l]����k%o%$\�7��[�������t�G!�0����,+�*�*[ף)k�Қvø�P�K`���`�<QS�Twaɔj��Cɛ_)8�8����
B�9fz �nmƭ�Q(��ŵ��~����F���3�R�}9>�I��lE
�$�eO��iB�h��"�]��ySh����Z�r���`���S(4*��ϻތZU��LHE�1&�=��\O�'�������
����
�^P��]k׸E�r>6��Jb=g��F�:�6e_�9�Nn9{N%�`j���п���<��f�zdw�����%���	9�.�xp��
�:)�
���cs�u��t[��p�2��{QlE��f�5��x���.��6��e���w�l����8��.�4��cğ��P�V��
�&>�>�:�w�g����V9��n9v]��f�8S�7�g������կ���a��M���������25�;}:RF�1z23�w�/Aغ�)�c�P�-�㇏-*7�m���%�x?��@��ܾ��$sxx�<Dg���T�o N�F9�V����n�,�_� '5>��v�Qc�K~H��[P:���o(Bv��ē�����5���l�{h4gV6�(w�"�v_���w%$����'-���G���kc�/9ڵL.<q$�x��ڣ�vWÀ��K�����9 0�AP��s{����������݆��D5��NU�Ex��	,�J爬��<�j��3���_��<��>ӥ����<f�ul>'D�kjc������)�Y��D��g�IH)S��'�e�a�
csx�J�	Q<j��]�	G�ĶW��l<V��j��njw0���+\�osPl��l�N���-0�
~��(R���0ȋ�AD�r��ޒ���/,���ut�&����}4���Xu�YNE_]��������
�;�J����"a������WY��{��3t��Ӹ4n)���ԙ�*��#�a�^K~����c$x�S�K�?��XC�\�����~�Փ����6=����D��~7
�w7���y˝�ե�O�jp��S
p�'�&��CEFz;�OSrU�o�)�������8���w��C�؝b���"w��Q��8�of�=��c���CS��=��.#���<KDa�d}��C������i���gGPj�J�糞L7��Oo�����VE��:���GnW5�W|5�`WgF�����s�օ4yPo㓣�ݱ��w��)���d
�]O��E֘_y�:�b&��;L:�>���u���Kd�=���_��Vl��W��2G-pּ�}�<d����)�}r��ڨ�įZ}=��sMW�u�";��tp�m^ȫ��F�
�0� =�BĿPKEePQUQ*-s3��pip/_vendor/distlib/locators.py�}�w�6���+X{��R��ݏ�u�2i:�;m�M�y��2%R2����u�}�@)9��랳<m,Q�pqq�pqq�?fE��q����_�����I�ޖ���'������1��Y�,�������:�b�g�4��$����J���ȃWż���4����I\g�>�eC{y]f�M]��E���4�֫4
�����WO��m�y<�������_�—P�� [����e�yY�����߶uZ=�Q�gU���X,`��kQ�O��ޮ�J�(Ӄ�܎x�U}U�1�� };K�u��?-ˢ�Q�.��*y�IK�r�Y��
"�+���m�Mx4���MV��)�(��g�
z�
��r��"�G|X�e�ҧM�|>���
��O��zD}l=�n�
��uS�X=O�Y��O�Z����uZ���&[&�b��i��ׯ_�L��Lg�w0�K��*�[\���QP�ok��e
ݪ�%����^~O�����x
�M���Fַ��Q����I���*�c��� �G�ӳ�&^f	�*��RO�,�]��d]^�z��9���4��% �˦L'�2������ˬ�̳e�S�Hk��O@ׄ��PK@	 W��B��h�"D�JK���,�B�\��~�
�RV�{P�Ȱ7?A��6M���Ll�^��F��Q�U��l�Lp!������]8��N��=~��ӗ�E˔�P��_�7����x��Ã'�=~���k��o���+DD
���0�?�?����w��~�l���ד���S�)�U�Z���033bfކW�������鷏������o���Wu������,*�}$�P/�Dv�i����E���0�כ2�R`V
�Rp��y0��2`�o#�4�ɏW���k`˰T�bN�,U�q�8Xh,��0�vc�կl��av��XS �<,��o�e�
?�c�����bS�}=RQ�|��>J��9Ydz�x(��sI˥Q�ˆ�ٲ����`�U��vB+r��8� �n��:�Kh Ŧ��2���z�D��[��2���p�tP5Uq2�]��6�H��T�hћ��4��&�1O�2�
���Y�}�d\�P�s$���� ��`-��d���i:�7�*렊�u��x0H}��i��ςe
8�7�g�sUl�I��f��yPIM$7M5"�.�ʪj�G'�|���M�4p�LRd&�O��U����u��#�R�����HY
�	��VeUA�峢�I]n���V�e������ʀV�bOa��|�(`��P~z���#�g%,���yzˤ��A�Ū���;,�e�=�M�
�Ȋ��ҳq���F��9T�h���nq��X���j��b�9sI?�+hW�!����b���=�QZB�_���"����-��*��2���t��g�߸��G�Fv���o&]Vi'B6�+���K�}Iگ��>jP]�����'��8U�GQ����3$~�%���\�
�a��,G>�:�$���bS�t�hu������h�.�8��T}�����wUf�ۀ�o
"�ܶोLߦ�j)@�_n���*�d>	V��X�0:����{�ͮ�w�`[l�����U\Ϯ"����b�:TG�z
� �/�,�jb��F�+�Y}�u��h+0 ��[
�/�-X"��p'�^�&M1yh<�g)B���n�S#]ooP;���Sή�2�	�є�A��O,РaP6��t�1NΓ�
�I��N<���l �5�"0|�Aй3 YҎx�
�%������H�D�,�k"�UQ�Q8C�E�5���Z�y�&1�R4�J�k���)����:�e�,���!������c�J���W<&Y|y9X��x�\^v˘jTE��S��m�Z����"/�q6�	=0����AI�!f���@��%�sOj�|,���XU#�mJ#:
Pke�4(cZ������M�c��"��R�̲iCWW�V��M�,�h��r8%C�9 
3�8��R����(UR��u`�U�YQ�X�R��H�&*��Ȇ�'`^@�*2t����+�I\��
������ehAv,?e���@2︊o`�fDЉ��ʴ�u
8o��,1/j��Q�Z��p�[��l
�u�``�`���VQ�R6 ���) >!�S�X�Et~e�&�~0��qu=I`J¡��$w�����˵�aoy.�)h�d�wL�Q🸆;D��s�U�nķ��&#�L�n��i��6�ID��z�����pu�6M�ʮ7b��jV�+����wʣNL_�����"�V���-zA�Evs ���/A�@&�
��zM����P�j9���tm5
�0м�;7l�M�O�$V\y�fJ��U8���b͋��7���m�\"l�j�Rh@���MN�rt�jj9)0�ۦ
�Vc��E��y��2ěQ*�[�s�4�Of�D���r�g�R+��SRe�����bc!��nj^dؑe�**�k?2A�15�;X�"u���Lv����mjtd��Ը�8�Z �ܤ�c�_50�armV�$ax^�R͊2%{��
e?���k4�c�'��BH��]��L�)J~t5�M�ʓ���tFXv<ڨ49g��N�^�u�ߛ҆�u�.
ɜUvg�i��
��д%��i�x��tt�B�#E�l���S˩��=T-�%7�XK�4NrX���<�b2Q�����	g�#���ɑƀ��x�m�:�=�.��Mf4n��4�Ц ,�fZK���%[B��j<�H$�0C߷��C,����	58EpSE�o�zh��LӬ�]��,�*P[<�@�
ތt��5��/.F?:�%�ʝ�Z T��l��� Jj�/��Җ�����P�q�_߉ùNWj��rXҩ��i���A�mv�ĭ%?~�nW�ͧ(I�� o��`�W���:����Ah�}�?�.�km�Riv�n`�p\�h�f����U}\ۊ�2<��8�E/�����m���34�"�5��.4�d��h�^�#3W,�4d�Q��뽈X:�yGLC��
y`}3�� s����Z+�y���`�/ҡ�f3X���aA}���t[�8��Qp(�=lxʡB�!M�!`���F������@55��O��rBSho�r�!���Ã6_��b�ܠ`ڭ�W�%�sP�:e7�)�-�[t�D�H��H�t�8�a�ۋ�^5��
�#�����1-�.GY`"w���
�`lR���e`4+��rQ��V`8�U�(���T��Ʃ��x/�l��F��X���5~8?>� ��`����1Tt��t!��^�ҧX_�1<:ylG�W�i���M��l�ģ��ū�$��nU�i���,�k�`-lBA�c��8�
������[�1:�_^�����P�k)~��i��_x	Ti����eIj��y���b��p��3k���
h�v=w6~>��(�Ȅ7�����
r0�
��\���w��R�p2���,�G��m\�>T8�8�����߲bc����kݕɣ"g���Hţ�5ݪ��i��kJ��[�vt���[<
wp7�/C��l;�(pT5�p��z?"�ٙD�H�dQ��a=g�
Y�+���#��٩P���1��䭶�wtP߳'��G��ݬ�J7�c/�IuֹӤZ�FƉϝ�'>G��°Pd���}�Z�r<��e�Dr7zVO���ѫFP�Z�8B.���f�����:a�oܣb���e;Nؕ�EŨB���{'�^�-�oX2�-m���r���(dh�l��n-����a9��д88=�X� 4��!i7"����	;W�M��;�'�
�˫��~���=?|�����DC���k��ȯ�}���ui����	cᐯ�*���_%��"�Њ����mt�-DU�D~��#�H�1H
�����&mmdv��P��V���k	l��	P!�5����h��*iJ׌�@�
7U?Қ1��C6�ǛQ���1k���U�L*�"�s�L�ً�	(��#�~=��4ݚ�%!J6��uȂ��eA�E���]9�{)
{�7!Υ��~V	�����=���ӑ���H���2ܷ1z��n���wK��kqt#���1��9��a��4H"	�BpY��N�͒�;��n���8^y?@��*�%�*lP���p�Ib�j?��)-�cU�+8n��!�xH}�7T�Gbtl^f�ȶb�,��
r�0;,J�KFu��`��0�G��7��-�6/� <���iy�;ø��*���5
�
N��G����톁�1z//яpy9���?�z[�����-9F?6.�;��m(�O�8V0�-��O|�7�Q��1���dT��U�]kfg*~A��R�$��9>�-nV�a�v��[l��[�U�+Qnz[�a'N�K��9�\�'	��ay۱
5)�6Yޫ���8Bٔ��m5�t$pք�(���l�V��2��_@0r!R���E�$P'ݶawD��xx�5��❰JWK綴��-�s�=5!�m�H�(�TK^U�U(b��F�� ��`�x����9�]v:_���3P�4 xcJ�����l
W4�G�BǢ��4����4C*���+���tu�q�����G):�.�����Zc-�{O\_���j�0n��+cKq��a)����j�"�OڨUK��S\t�k�L�|l��b�];������hUk�O*pn�G�G3|�B��6�[o�(}[��gUK�'����|��Q��7!N��KW���C��hX�^k�S�,$-������?��k^�%�dZM�[�'/N���0�dǦ�s)���u<E�:�S^qvwT?��1Tkb��C)�3
i��(��8G���h�U��2|
�9��a��Q��']<�H���������WC�Nx��|x�7:^��r�%Օ
�mf���T6��w�P1�����S���>f���P���Ms�^��>�Na��#�Y����D�׆%���/MO�<�͆f.�6�_��e�p�<���p,<8�D�o%}�L�w��R0�~>gŅ�`#<��v��/9��gN+�]x[�Ie�Q/�=�_tT�6�z��z��iK<�!*0-����y�+�:ؖ�M�L��ϕa�)��3bU���G���-�L����{ܡ�
���o��1���
r�a#��Տ��*
�ޠ
�*`�N�y2d ��E�El��a��&g�%�<�"Q��QFu�p��U�-�ib�=ĉ�U����ݡ���q�r��7��I����z�`��OP-o��2O��Z@||����_�=��0N8S�A�C�9�d<޶4a�L��k���p��ҁ�|����n���+N�����"$�Pᑴ���e�
��<��y�/�6����f�
Ӣ�涆����������@w��NV�G/��q�ҡ�Vj]��7����w`�+�G���&�3���=Vܷx�kx$�����nS��(��E�(�ڥ|_��K4�]��Jh>D-)�B�F���tc����/�ua���#���e�Ux/
�_ˡ�V�=�����G~��uW~��}P�A�uֶ0uX��K���:�)E��ʓ&��3�@���Y>>TH��T�*:���:hߓ�	���ХZ-1�!��Y�=V/e�H��AD3Q����Ao���=�|v�Q��z��W�K�<(
��t~���l�J�,�Shy�;�I�����
�<_�!���*�i��r�N���K��J�
ꛤ�a����{��XFb$����L������-��912��V"5�~]C��0������_���G�^��țSx3�7�w��x������>|<��[i��s66<<sc��6��!v���V�>s{��
z��s�;��̴>�4:v�:����nШ8[�����;|t���ڝ!��v�����3?�j�xz��c�k4���Ph��ғ'Di�f��k���p����.���w��mAN\�'��	���'�;��_�����/���у�g_�Gtto��ͻ��:� ����QO	��}�L�h�����º�����.�m��z�!_dP<-6���J�C��Ld
�*˛�E���!��80D�R)<�vaJ	B盒�D�V��A��lړs�:�q�FD���}�i"|D�􅶲�KA�;�R=�}�HR[W�p��q�GsL(�bвߤ���l1�,�"a���.���S��'��7>��S��g�����K�-��A��OŶ��К7)-�g��j0���"���x5Mb���޽{�oы6t�V���3�4+�t�q[�+��OI]�A�W�+cPMI�x�V͑�p^����V�Xe8�8��^`�jzf{��+ڷz%��[�X�
y��U5:Ten�i!�-[������j�.r��JR> �=��K�"n��Or֨mTȏ�EQ�F���z�� mo`�n{K���&��԰T�b=��+�e����+��I/����e�u���;~�srl�E�JV���$5!���l	��)�3��V�5<e������tL)����?ߢ�mDPt�$�u����^2F�؂1��T�M4>>�oVD�����{�F����Ȳ(jwG�-&���kʗ3J�<̴FQk�~�gLR�TQ'�&��HN�����J+:�Z2l���^L1��<�ך��\x@�@�R�յ��wަ�ۚ���?ĥn�T8<Sش� ���
7��+&����������M�drUpd�F�Б�8��hR��1�P���4\�ǩr�G/�ס)��l�~6Ƭt*�ޔ�Eƻ۷*��b�@
ȆH�Ǥ���%�KArKD�
0{`F(���Դƚ���q�	uZ���`�s�JL�G{@̮H���F���B�c��J.{�ŷ�މ*�P�L~�*O�������`iN�}z�k
%�ap�a��>���q�!V���5��ġ$S&k{K�)n,�lR��\��p�(�a\�����t�"u�c/���1��u���8_HT�A��!lk*/a
�>���+�V�j�>}��"m-C~�3�NZ"��*Ҭ6�����>���	�� Ce�s��-���M
�	�T`���aa��k��\]9��k������k��������-��rG��e�OcT����6GDN<f���k�����{���<q�ۚT�L����QT��Vt2T�֩ͳ��=�sO�s?���%�z��s#�
9��Y?��^;*���z<��1w&}�SΡ|Z���ֲu6a�3�e��+��9�yY�7`�e���$��$_|����O>��]\��w��떃[�'��&�*����U<+�����$�Lm�
�9�'���3��7��}�����
ұ>�줯�`̴��^(7�̀�rF�Ξ���*UN��ʩ6YM!:I�� Ǜ�L`䥥�|R�=��̴��8�j�����h�27D�L�Y�|X�J@�\Ѥ��骅�@߀G5��:�	�����jI���ڎY�R/ח��W�v�pɃNs?ҬDN>��n��4�51k|wD� $y�ɴ)�(n0tp���u�]����JyK'd��n�d,�iӱd���	ٓSm>6ɧ)�@�+�>�x�A6�,㖏�ȪJL:l^K��:8'����ĎZS�I��ˤ�2����nf�|����Q"�m��R}��/D%F��@̜N���C|�g���WJ� :�sU�R$:�#��=�Ӌ>���k��@gY���"���e�	��@h<�E��B�:x2t�C���)-�Bv�omݡ��~X�<I�ac��Cj�v
�XB��f&��6w��cթ�d�$
��n�ϝ.
��T�l�RQzIdJY�xl�x6�[�Rr�]�7bSX3�|L���߫�]h��t5�9�\�9iE�k�V.�kzu]O��m��)�Ii����Hb�3�/�)r��sTU@�`�N~�y����G��I1��f��4�Y��U�b��&
�S�R��C�N���	�e4��S3��-������Q�Y������2�vcHb^|���51�dW{��g����[���tZr�w��|%�L����!WXT��x��軖��}d��+�A
�ԬFOd4h7�Y>4֬`���w��J2��#��Ue���yf��*]`��9̟߰�9x��7?��1VjH"�w����x��B�a�7+�����Q9�>�h�������Ž�9�b���1�b2p�jhy��W����H�	���X<Rن׀ߨN�t��&��-���Io�`�z��i\m�a��#9StL7�����q�|ɧq�k@b��(7w�UIVRV`u[)o�}BH�{Z��h�U�xw�أ7�::N���M��QG7�/*&?c������3�P	���4��z�M��
]XuZ3��O~�2��'w��E+����k�x�\�8��V���u��v�{�7t�J{ߦ��t�Mp�=�@���=Ss����60����8����El?�w�q��ڪ~�I�(�Z��Ժ�T���{�7���/�̗]Ƨ}أ�����ѩ������~D��լ��sU�"@F�1�J�Q&�~��ư<�T:;�K�����&W�*�5]}�X�����Uz��j���#=��L�^$ц;.ӾC˃%nr�d�dbl;��Y(s�&��$���j�����g���1?:>}���<F���N��)~�V�;��!���w�]�2��ڢ��(�Ȱ:u�f�^��& ��C�����%��eAG)=��:�*0���G���|u���?�-H��I�W�v����^��\G~��r�	���j��:`{�8
d7���'�s1�FL'p��	�0�o�B�U�8��58L�r�r$wO��a�o�D�y��X��c��� &g�э$�>(wEg�p��N�r�77`��ཚ@Q��܏bf�
;���x�R�I��bpt��.��V�8*�������F78�31�&#�t�֊Ù`��6�7-���ԶG䘤�V�[<��[V�m�Q�M��Q����
7�
rE�&wqfI���U+1�\um�򞏑�sJ�%*�_�M콘��n����UpK0���鈽R�-P�� 3�GV��{=H�R�Y\�����C�]��%E�yNTG��ͪa'l$	��&��;��_�ـ�n��uhͶÀ�YNno��M�M�|D�vXG�� ~�՜z8�z�v\�	�A�m����3r�&����=�k�3�f)'�_��F��[(���ӽU��%�ڹ�[�����9���O�Y	���ޏ�
}��s��?��Y;z��1�/������hS�I^"���s�~����d�>�Qj�z��ˍ�%JX�K^Z}����������P3}�U�yK��P�n�
�Z�y_�~�"�I�Ƶ�Q-�M�f2��n��gL!#nh�����m�-�< :u	�(�t�eT�F�t�:D�B�@���͝�;��x������^	��T5R�ʳbܛ���c���Q��3�Б 	n���tՒ
E5��Y!�[��ͬ5�I��N������ɼϭ��x�b.{��M�OW�Hғ��)�6�#��;$�<\�in�ЗD0�3n����NF�
#��o����$?M���ٗT7��]emוw�$���K�c���0�[�+�y��� �� ��S��..�xAH{���%���2PQ��E9�	?���2]�����δg��yP\�ؕ\Q�$X�9S���a��İO�P���c���BL�1�[D	ϳ@E�x�� �潮�N2����s��I�c���{�M�0�^{
����o�����j�w�7Ypm2��o���$$���a��:L�ci)�3�J�۹t��Q��v�O�xdl�ӑ��9^G�	���j3�P�Z�”��b^���Gl�(�^It���&�_�P���Hu?�NgV�f��1.l�%���W���uO�lˁ
�k�v��tIA>�C�j����Um��	�;oӆ�
l8͊��!Frnl#f��?� *�ߩ(�]H�h�yd��=m��ߣ�IC֝m7
�n��]�3�2j����ޡ���f��l��3o)�>�KP�S~[fu�(a#��I��݈�n�'?uw�^�ӃB�x�{�I�>�����)
�t�F�����;��ޢ��h�u�J����Ē�“���zv��g��s�y�/�ɣ @U�96���Q��	u�_4��ԩ-z �kѷ)of�3mx3�_e�t�+V{�w"
���Sc�q��vww/�����\m�J&�^���;��{�N�*�g�m
�SNz0n������w�10r)U�i�!oy�HI�70}Pf�-v����NcS�1�)
��K1S�-]��:��Wh٣Vg������/�9Id/2��er-#Lr�Qnx��1W��˟�Csa�1b��L��}붪�>�b���zV���{\ڳ�0��; H�<сyEG?���P�S�Qn���Ix��D²���ڶ���f�#qU�j�l�T.��d�-e��1���)O��*�G0�`G'�r��������σ��Ӈс\��^�1�:�~�$U|Z#շ�,*�����\���!�z�g0z�].)��ܐz&Pz�?����O_�z����˧�Iv�����������7�����3N�a����&��/C�>��J�a�S���iQ��$]�א��YW��*]���2F�����o����]W�t�
��O��К%�F�Ez�Ac$q�خ�Əׁ��I�Du�$o4G;J()krMޝ�D��W����-�DB�f�v�&���8��.NN�63&�\*#>z������WM�[��O�Kܔ;�K`LGհU���W����3�[^u�#�*��µ7'���H�`Α�?�W��(��R�M�7�4|ݡ
� �2]�wGz{I�\��Nw]�59|8��X��;*�!���x������Ӝ�M�{�r+��L��Ѧ=��
-h�#yN���.e�-�_�(��G+�)%���[xbC�.ڔj
�i.tԼon�u��\Dž�0U;**AD?0��weKm4.bm�Ps+�J��g ��zM�?����y�N,����+<+�*��Q:*�
��dyao�|Y�dY�8l'����cC*Ȑ&BGe��Z�����D<�x3�r�|�!���ǰ/���*%��s��ُ��	sT&�c����B�E�{4dz���X�ٍy]�?f^��,�?�8��9�5�֭"j�����̣��{Μ�k7n���Fol��ܹT�_و�R���
2V�k�P��w�.z1�kk�q]��u��av�f:8?MN�"��(;��H�?�x�+��I:U/�:V�R��ب����\yٞ�2�����(����e��w�_^��\^B*�A��^[�1\���4r�&��j��yA�9��$;�
��Җ(�fZ>�S2�c�on��دA���s���m2*x蝼!���Ά
$�{�s� �
��+`� ��1
������6�od̉�/@��w"[�-����R�${n����o)#��˦/�P쎦^�ㆴ�K�d���J���Mμ-�(��lߋ�#*��f3P5&�׶���1��
�п�Վ$ϥf;��A���J6yl�i��0���:�:z����,b�5�ֶIF;szȀ��3�FkP�4Dd�<[~
����U�X��5��Z�#
v��ג>ܸ�}��c�"S@��De��`�Zz�9՟�N'>��r99�i��
�<
�1㖺���@
Q���@�1w�q��:����&[���+�NU�!-=4�I�\^�T"����R{�ڥ�ӽ�)��-��8��<��{Am�%Hu�"�����dcB��_	_[�������2�13]��b����Fe���n(�s�s��7��J.�~i�i���9	�5\^ya./
��k9tyI�lH3��#D9�bO� �^s�81KuQ���K�������;|*��μU�W�A�
��_^6y-W�@O�n`.du�M�=N���!�X���W��E��w�lo�a���y��r5y~'N�������o��wzb`���M&ck
���C�l��� qP�6�!
�I6��39�t��.
 0��2���c�ތ1r��jIsa��۰>�nk�yy�q2��R�����*б����Ak+�7#����=�c�E�s;Ш3��'�e߄��s=r�I� ���r�F��p����i�")�%���̬f���)�Bl9"�,��g��
ӻ����j�I��ݡ�����7�Hpk
/Z'�/�T�&��fn�4|X/=�t��ٕ�p��
=�%'!�\��$S���b�+�e��9m1i��M�.K/o�T�ZI#��ʼn(>*�VU�GM閳�"�B^E��T�鍛uU�3��Uc\O�N�ӯ��9{��vQ\��*�i�=O�Ff�B�;۲3�-�kz���UQ����T
Uf��[��%�]������I�Δf<ڏ���5��.�7��D�����1��|�D��zf�J	[T�cS��$����}1GOGv�
�	|»�tm{'Nzl��������#�r�=�@�x"�.�3�!ۜ~G�U5���2h��=�cvi�]����,(f�=[Ƨ��-)���y��=�ާ'���W�GD����{W	��G��a�b?��Yn���{�?�x�K�T��Q��c��S�(�>
�Tؚ�E|�p8����=l(��*ځ�J�}��ʮ���$�5U>��F025�E��x7���Q0-��e��Q�ūB�lP�PKEePQx�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�PKEePQ���f#pip/_vendor/distlib/markers.py�Wmo�6��_�&(d����+Vu�-s�E4�0 TF�m62��TbcX��"S��N,������R�9�	i���-�$��19��V��ʐ�YF^��|u�~!rA��~�u��dB�91��#W[���\˅y���sو95��)B�<a�o����bl̈́A^׌�g���Yn6�P1'g/o>]�����k\\rtt�\Q���x�L<r%r"k���d�K%O**�
]22g.@P.��슼9}�[Np�4lB.���ߌ-�=�'��v�\נ�}��D;��6�h-�M�`���䞑�[�Fi	79�C>�G��A�(�*(k�(XEݔ+`'~�Z3L�S��劀QEj�V�1�dZs�%�w��������*O���2D���c]Q�\�wŒd���NQp���*�3��1iTe�[�_Ų0ۚiϡ1�
�\�਱3G�$EA��(Ȕܦ`
�j�Lz�$�1Rp]Ti5��$!��"$��\hCE�F�{vF ,"~�g�9��fI� oO�К���Q�$eE�&�GZ5芑���J��p�ߛ��!�!8�9"���M�~�B�-�}p~�
��V�t:M'���9%�1�N�O���c̷4ʆ��`�
`�uٽ�>�]1��N��`�2��>�.���fL���^1��>�"�ؘ�����c7�H�j1�x�����6!����,���H�0��v��5g�hD9��I��l^~i�!��^�)t�J��‹�J	%����_;�=1q"u�%��@�[����˻�A^��<�`c/ugO���
�f�$oڈ!�y��S(��\����s����}	�0e���s(���橬ӻ}��C%��;Z-�c]�2��^�e��u�g�n��=����Uo�w�r�%���ߴ<�C�t\��������p_Te���A��3˒W���b�~�"$^����0<DȞ�ne}7���H�=�Q�~^
�~䍂[؂�)
tC0�G\,dd7���un��&����s�\D�0��z�8O�-�*FAI�8�-�@
#���9�bjq��/�<8) #8�z6�DIh�+��C�P};#Ei��)v�0˻���1t�П}J�I\��yP��4��!i�$�(�z�t����A/J��o�
Q�����i�r3��R�F�~p<��ü|`��~i�3l���0zg�Bh�W��0�o���u���8���)����N^�E��a�(�px
�H����>;���/V��n 
{%	
U���$,��@���3W�ڹ}���vX������R��A�"���l ^d2e�j&�J Ӣ�^��i���=�	L��Sy+�u&8��Ppg̡'�c�_ܠ�7N�ϕ�Ms _���(m�vWN�zb=��Eސ�p�M�jCf��
���4�F?�w:F��]5�;�eY(�V$�m��c;8N�{h#��S��v���?�&�|�T<�L=�3�h/X[�n�
�mS�m3�GfqR�1u�Δ��PKEePQA`ߥ$2�pip/_vendor/distlib/metadata.py�=�w�Ƒ��@��tHZb��Vm�Nt�e?IN��
+	0(YM�����7vRJ��w|�E�����󵳻[���(��iV\���b�_�dckc+xV.���	�g�`��3	N�X�殹*�฼hn��/�e�&MVc�t�X������x:n>6AR���ׇ'G_�=y}t�������|��9+��A�_�&pIpQV��E2�N.Y�������Ţ��:H�<��	<�v���`g���L�ϟL�;��m�\�Ur[��`�hl\T�<��e��X���"��8�V%y��!^��Yͫ�y��Ɯ�5��"˙��,���b˟������n��|�q�H�! wê�Ʊ(;+狤�5��
@�5}�����A�>6�]Ԛ'�5�ղz��X#^/��Y%�&>�����0�dML�D��#Y�׳+�!��ӧ��wӣ�ׇ��tc{ͪ`Ov�_ҳ(��dt!fyR׊^eu
e�UUVQ�*�ݍ>0��@ğ�Y�R�Y�ym�6�geq�g�f%�a�E4%4��p�m�`�\��ƅ���0��I>�����ج�,���;N�UH�-��V�))_,���6sP�$y������K�d�xU��,��Н`����H�2]k�1L>�-{�i(�
�A��ۯ�����������9���M�K�ϰ�i�EP��aq�(�Z#��\�7��vH"+$T+v�*�A�q�M�`�<��y����*).Y
�aLA:e1cȰ��O����\�`�n���n��4�@���pJ��;��T��) �޿�%إ�O_��O���/�/�C�HQ|$��|�����I�b1n�'<^�A�a�笞U����K~S��h2�/A8W�ۈ����lƊ�A76��w���6҅�%����pf ��s��y����G/����Y�j�7Uy����8�ҬV�z��-���Q��G��^���/����U�
����
ƨ9u���U�H���Y^�(�ǩ��z�m���#(�"�ը����%h�7���5>������$b�t����)�#��M�0=H$�j:���~̚�b�p"-:@(�hn*f�Y���Sk�F��ҕ�
6�?�$�F[;�_��&S��!qɳ��8(g�%Z�eq	�GV��q���qpP��e�����[@&g�p6�T��[�Q���/P�Dh�1�K�ŗ�2��g@ ��G`�B���	�:�9��.8؜9�-`�/5r5k���l�\Xd5���X�x���������! =}wr�Ίm�Ua���~���D��鏛g�
6	�[��B�%e�t�&��U�x"���BY�{d=n��jT�[VE`P�^�ܩ�㩥��Uk⫥���挠����C����zI�(L���E��$��j�I�UR��Ս$�=3��<Q0kh�a9�T�� ߣ�Q�t艐o��	�UR�܃��%�Z��Mp~�H9�~ךs@]��:SRP�Z�6�^$y�6�)�E��lC�L��p�
я1�y8��2�����o_c|Xl`#m�&��8Y Ր�͢v�3IB��{ȹu�ُ�vږ\u�al�
H�|��`��"�6�hE���j�#|e�H4lR�%1@��"����/�pzc��y=�ؼ�aXey�c����e�˥�zn)�t�
["d���$���H��Hj) ���Z$'k"9YICg
$?��H~�&��?��z�-��n϶twqZ`�sgbL����\��\�$��(���a���O�H�%#��+��d�)9�MI!���I*�u_?-�
wu����Y9X
P	�8
�)w�}F
_`p=��֥�P�5T����\TҸ�(X�#�`���N���4�7
��$�	͸����~�J�W��qr��N�#�i��&npu� hX�`�Gu��.��5�xu��.X��l���zX���${�{q�
��R�&Ư�����op(�<�|�1E����@k*�_�߲�*�!�&�]�����C���(3�&���?��kV�e����뚖nh��)˼� � 7��tSf��f`>��&�"8l
�����|VuP$i�q�
�A��hc�A�n�(���̋%�ω�sb����c@$���<-���bIq�6�2���=���bRțn���S���n���Wfb����L(hn?٦8���TO5�Q��q�K;pĊ�;h������9�*�j�E�������xA�qY]>I�͓[��h�瓭,�8�''GR909&�pEj�����Hy2c��hslƛ�]zOF&}A���ˍO��#H��� i��*ᗡ�g��B@Z����y~�l�dj�ɜp����?��=�‘]�,�,�bq|b�2�lv��/��/��Z7��#V�e1C_`hU��9"j��}�rj��l�$ӗ�W�Óc�|���o��~n���H;���D ����bYy��G������V�#<�q�d�����g�����*-�1�aメ4{��ٴ荏��O����8��רA�&N�r͎˄��w�RX$�|5��&�h8W�zf�7�����%�H�Q,K��n�-\�\/FI��J��U ��V8
8���q9~��H��
p�L8
�A����7��Hh�S/�V-�����3f5LX�j��<�V��Fn*��+*�-%[ ����ȏ�����j�P��]&�;i@D���c�HNE��X�+_��%5���9��J� �\�*�#J�M9J)���8@[e�p-Fy�M�4�
!LiTt�̞��\b�IDTU��Q�����C��_ɴ0�s&K�w���2�����5��7������`�0O����	LFuY�gV�B�I�!�����cN^?��:�cϼZ�GR����eޠ*�Б�8+�&����C"�F����%��_n`���6B;u�`D���V�D&-��LV43ՂB]�]�Y�>��e
Ccx�ةq,�|��?�oD.IM����<bȊYF�S���=A���N"����	�4�re�dW�&�#Q�ER������xz��j����ﱦ��@��+�g(����Y�h+���\���*!�0�i�i��1U�@Ρ���0E�0A�֙�$oÖp���F��S�E�S0��	-ey6D�X(N7<@H��#[Y4՝��
O�F	E�,4}U�s�!(+�Iۚ�e�H��>��HX��X���Z�^�J�a�“��,j�0ұpVA?�R
}�rB�����6�v�]�,Oo�'��N``Ãlqvh�	X�G�R���>m� W��:����/_��3�q�W�ř`|��aOx�Ժ8��
5r�f���=y���o�-̜Y�%T���'olq-���p�]D���r����Ҙ g�R{Ʌm���f<~.�{����y]",O9r2+��L���qV[��5�а������.L�ԦXL&��ZCZ��&�s��Y�mO��Yz��h�{�Z)|����Q$���� ȓ���E$��LG�����=��٣�ڦ�B���ȭ��_,Ƴ���i��ꦍ�r���꼾��:����۞&�:
e��FO���+VPw�x���âz�C��"j��7�Mz�LL,$Vbwi�Y
�j������1�8Oz)���$(OA}���|U�]vr00C/��s`�V���)��D�{\/�؊�!8�DL�~΋�9���FX	�R�x�J��HD�(~�&!�n�zy_�U�����������?L����/e����wJ�(�;̳��e�!�g@Jn�,O�s�S��|��a&\dO��M#ȵ����A��/R�W�h�^!y��Q�Acm*�+c优��u� �`آ@]g�X,����Cr�A���-jo j�GE��F��׀f�g E�C��6�D
�t��cD[�����V�+�[������*����Z�	�`����9��w�1���=F����<��"f?��?ʬ��seo?rY�O-��{����z�+�-�E;i��{/|������@�H*�~]kh:!
��5f�d��y��Z���%L�J?��M��ږǦ<6�1
w��ǬY\��@�>���W�+vGVR�Y?`�U�>좫"���p���l��Lu�
�Q�1/K�Z����H\@�3��~C]g��7Z�+PSड|+�*����`���۷�Jj8-q%��ʎZ#אFNn�A;����0C�J�����c����H�k��]!H�C��8�"߉l6�-�)I��wSĜ�=Z��1R|t�#���-L(�;H��X$��N&���g}1
	UP���؄��
M�'����*�!0�*��(�jj��>�١(�G�T5�Z� gY��|)h&��a�>�L���eY�����C7i��ތ��"rUIL�s�-u��P��l��|�v����/��9����i��,}QV��������׭�|�l����ޗk3�U��d]hש�y���o�1�]koI(3T$]�2w�Y�8+��1	xVE7��N�}���r�,(��Qg9�l�����p(���_ܪ����$�`��h�Ps��8x�j�7W��rmrH�B$B�������pYs�:(�	f�W�|��G�u��C68�F�=�#��.-�$�m("��cJXv�$��?�>�H�])����,x�-+�GQ�	X�wK��U�=��c+گ�nm�Zxe&�ydj����%�,$۶W�\&�hQ쾃f�Ia_#���==���5[0�l��䮢񧭌�G�Gy��m��'ڒ�t��hv�����`�6����V5��
��y�s6�=�����x��ros���^�h����f3�u1���Y�d=#�]ؑ�S���lR4ctA9|NkPd\��B#tZ��=h'���X����A���ݻwA}����Ja:#+hS������T���8�-�O��@M{{������\����&�s�T #�+�BИ҅xY���٠��N(K8��О��O���(�b|+��:�Zt�Ƿݵ�-1�M��S,�i��C�:s�yۖ>�
��J��ᔈ�g��.��\e�[q�z�l����*�7���m�����p.Q��g:�C���D���ֲ�����V�U��=�UM��SϨ���ϒ���=.��%�����?�0�ZÒ���Opgn?�71�̊��?Y���C�R��҂(ܓ�!֒�pjD_�}���#��9	r���k1���ʊ�(�i��[sg���C�.���h��<�P�h���8���3+�7��G�B��`������\omHf��g]�P(M)�ԝ�4{:�o�EƀN�n�?��o�ś�g4(w�J'kY�0�-�c�L�n3���'�<���=4��9Sa�ِ�i,�4�v�ya>rS�y��������3�5��x��ڡ&����U�8'��=�e�:�$7h'1���Ϝ��Yd���^�q�r�i����"���~5�[	�b�h��gBYYyؠH�k� VhZ���wD3+ӝ�:�<UK9�
���;��um�\l��tSfb��Q���e.	b���cy�"osL�U:�J<^MO�������W�S(\�a����7��f:}{˩�nxɗӯ����/*����v�{b�N�f�$�CEA_մ$���ׇ\׫�t���1I��-!aT��*Y������g�lv�HsƷ,€���o�N:V��/�$�Bz����Q��ߧ�E��������n[$��B�������E�K<�=��}�Rq|  ��{��Ă�o_��?������;���?|���'7?�_O�G�'�L��C*��Q=@�6�<��c��o�?����	����{4��s�ǵ�(�C�7)��BK>����D[�,s~�W ��*������w1?-�Z��b˰�fj'e퇔���H=2?���҇�~�h�Zq?�Ԉ����B�:_fy��ZM�]LDjbl����m��w��k�1+n2��I��n�px��.�n���tk��va� ��.Ĝ2C�:8��bpUk���F��:/�1
X,Ka,�R�>Ph���YbˠogU,,�\m����2��hcYa�����D9�9�I�bD���F�3��UH�YuVF�����-Z��)��%/�F���E����\E�~��u�e���8�җ`4���)6}y��j�����x�N�d@�Zn�-J�B�ǩ�[|�GI��]���go�|������߆/Y���)+YO�U�§�|��:�B��9�0񎐇�$�})�d���6��dr����]M(�3�:���=�$�
��鄟-`����AZ2�P��M0))wM7D��$��p��)b�<��l�OlhC��s#�NQX���IW���lFb:Y���
4���ۤ�³!J�Ô\��s�\��O��e�@c��~��P1�""�X��a�7Q��y
_s}X�q⬴�����)Š���o�/1p�_�/Q'�a�~2MA2�'h�"��m R���튦��Tg�"�)�QƲ0;�p3�ps�h����DAO:���)2]�[$����A�km��։)mD�rY���Q��q�d~��Զ�}�)�>I�27z��l��M���ČL-+9��E��Bc�*�����_���&)��-��k4^���	��0m�o��>̯�M��$Z* k��H@��(�(��2��j�G���:[�������4w�<�5���J�k͆΅4��dU\�)� �߫�� �o��_��C���ơ9+������
\����c�ڤݹ|b�0L�%O/��)G@��#�AU�!#[5jʳ�vS���w�w�{��w�;t?��n�Q�<�e�1k���6��S'��5�"��ݭ(�D+Czp���U���uN(����Ҳ�=�S�8I@�����aǠ����ZmQ�N䫕��aU1�1~����W�E":R�̤�#��z�G�t��R!��?��V�u=Ѧ��m/�HU��+����D�@�Ch�������>��:(»-��r~���os*��6��Q��V��1�'������D�i��֔Ye�h�"׹}vl_�`i)�Fֵ��a��NCo
;"=uL�,��g+p�k"�2��s�:)�M��65Sܳ�u���=2�GWTU��4�w,~�� Ra���.K�g����=x+��3�R�X�ន�k�R��I����T�E�'��zk	~H����&�*\���[H���U�z��g)YH�zj�tDc�Z��곝V*goԇ�̭�{ʹ�I��F�th�}`������6%
�T�o�Hhj�!���+~��i[�f��W�uǷ1c�C��1Q|#5��y�OY��H�����`/�j��lPP�R.?��c�ϻ��J���`�B]���(�02��L�4�9p���l�W���n����3QP�� z�d�7�s���R������0Gq'�o4֛�D�u�cK8
����F��x*N��G�P�>�|��T���r~�����UW0fY��#q�
Fܐ�g߂�M�����pr�4S����;sh���L?�H�R!��ϸ�fM�VE��ݤb)�*�`���C��o��`p��1��!u�Q�B�@]M�z$߼�ko 38���U�	g.��'��	����b�ϼGD��G�.j5�+���Q���m%���/9�-+L�� χt�A��u@ �<+��c��fL �O�8gt���D-��pIO��Q�i8l��=2�Vq�r�`��"��J�6�p�SuwO��+���R�a����(�~H�t�;�Ǵo����{+�Lڧ&�m3���=M����`Qq�L�€JuR9��%g{g�m�����
_�V^n�l������͈	�p��*�?��vUEϼ�^3�:Vh k]g�����;㌭���o��΢�8E���@�x�c`mDi�:�h]�혴b�|W)�[cb�	����h��Wk»j���y~�*A�`��X'7������� �+((��$챣W�?�ܵ��^05@�/I]����Z�3C78(�9d�[+gL���͛&e��mVҌi���JZ�S�[LҾۚ+���K��^�v݊Jv%�����B���W|O�V~��Z�_��g\��Q�������ak�2շN�t�ۼ�����(RFq���t�T!OU֘;[)C[� >�k���бR�M�Ny}�ע��ϡ�!$�|r�`Y���=#y��u#�\]�c?�Lx��e��~ێ�?Aly����7-����W3g��[�HJ��鷩uId���8�-��D�Tw�B��{��#�f}�K1M�{�pP�v
˹��N�je]�cT�5!�r,���M١D�r�j�,�Th=���	��/kG�q�q��W�x���P�Y!�Xqc�+���L_�)���>w*��Ae�mK�H��%$%�I�F�C�Th#��B}?6$A�`�Q��f,=�_ܬ��K���;�Q\�����MVg�X
�5�'��0�Ja�uZ�O�q6�e5��,���%�jj�릊��z�^l�l�+�x�k�|�z��j��#~B�?!��>�F�UtJ�r�
�G1�=�/��d*c���#ә�/���K���[c��A���<���D�=t��W,q
2�(��AWM�
o�mg|k��g��b�ЈM���6�	0fR�s��a��O+1�, ��0�.�j��V���%��U&��鸅|������[h%���j�޹���~F�qrYz��ٻ�~g��LhQ�Ao����G03�;y�]�bɼ������n��U�!�qnW.w��㨭!ܪ�(q��\
��Q�s̽��5��΢�;��M��'���?tۍm��v�L��6�r��Rc�%X�ˊ�I=�2b�!�[\|ڛ�gp�Q>מ2�cM���[��֭�y6��ۇ���:�c���؁kA���3�r���$�M�C&;(Z�2�t,�zV]yu�(k-���P*������?��1^�3�O��90�t�ح=�m��D�/�[��+Lb��d-�����ۘ��mխP�a桜�8�/����X�}}U��
C�������>�k�Yi��GY+f@Q�-st�PKEePQ�݄�* pip/_vendor/distlib/resources.py�Z{�۸�ߟ��q�|���K_0�m�4)��!�h
C�-��,	����{g��zx�w5��3��<$5f�_�u��|;g���3>�Gc��(�����^O���_\�b��9?�k~#���˵�k�2U0��ǣ�9�.6�W��-yʕ�gp!*�a�\UruP�m+!�"W(�Z����7����A1�����?�{����O��F��س$�ԡI��,*�%LE$�T��Y=�+Y���w��WY�����mQ۫�v{P2���.�;::u,���&K}5�
�V��Zer��a-J4�y�2-ɚ�w"Mʪ(E��3�*��Ɋ�b�J�v�*̳TV3�/G#�����&��,J���@��hD�@����ߘ�+�8�~'r����2^�쓨�C�4FD�O�#�K�L/s��$�E��1��
���
=f���z�/�*�����Xȷ>���)p�Q3���9����1���/�@
r���B�M!�(�]4��Ѥ2s��w���	�`�(�3�ܦ��*�;Z�:�τ1������ٳg�]M�=A�l)�϶`��I�����K^�{3g��zNN��e+�6�Q��Q%͈W��АV$�y���[	Ȯ���@w6��OI��w�c� ��gҤ>�p��U� �W�س�Ec=��X��2�Y�)�R��1�����0��C����{
a�9u�}5�Jl��X�o$�Ÿ	Z�o�����(-�?���)�����CtAʠ�c]i�R��JM��&�q����3O"=PH
s��He��
�4�@��jGuJ�x�J[ۑ��t�]�@�_t�䓓E\·R��ue��}m��duTX�Z�G-��5%NGν�.Enf9c���d�x�6�Q�id�wL�w�O��4�WXA��
����Cx�Zn$��w`E}�4��:#G�
F�ͧ�L�VB��ՏC��/J���[�U�ޡ}8�b�A�\�̐E�&iByQ�y�MP�Z���5h����A�
|�'�vyK��
MU¨{��.u��8�	��!.s2�[�-���W0@Qi
�!��J�96E�cTBߓ'N� ���/n�1	��3E0.1	��<[�����
�u蠰\��M�@fJ�ʡ	;/F���Ѫ������ё	�`{�۬X�Lg�_>]��VO��B��I]�mgzLAJ��r�h�Z�o�L�
i�٠�K�VP8# U��w�1Z��u��e�Ɩ�1��F
�v%��_7y82�q�q,��@�j,�����_�neY�D�����M��@A���%�':��s�m���HY��� G_�/���2��
�&���D�K�P|��Bض��ȡ�D)׍�<�9ԪI�H6a`��
��n�� �C��ˤ�x��a�������u�
�h��pnW���dJ�U(�d�_Ldm�b�1�i?�k9��8d)�e��9k��
]��W��MN 7M�Ӕ��$⺄��Ӑ0�!-��Y�X����S�?�E{��0��r�Am-g����J��mޓ�F���P�T�'��YH����&�)E�N�+	���%���}��B�7�3PnG��4Kll,8Zh����Oy҂�ƑPP�դM���䎨�lF�`�I��`���T��30}0pK`��z��˲�^�ѦZ4b�a����m�R%�О��R@��iq�.4�Iu-6���*f�A���-� �q��2�+YD�S�ϐ&.t#��(�i�/}Ep_�'_5��D%h�4v�KU�[X�e��
� ��䴪 A\et9���&c�;�=%c��F��w,�<�'
"���U�B�_��
E
S����H��/m����t���]�����`�
��r�ΰ����	"��K|�:"H����eA��g i�\ty�M����pM{b�-׎F�mW��xs�s���kl�����ae���s�[W��l���xdi!�|���p����.�5���b�=X"�G�wp����=
��ɴ
�4����9�'���T��lj�Q3�eh"����S��H�%�=]'�-W͗�%�P�T0V��׋�H����x���	��r7�<
!p4U(�:+�O��ogPU�Ы�]ȥ���
t���!�*z��K�ImЪ߆\�)N�갍&�9��`�tξ���D�iD��>a�>��Eu�4�'0�9+�k~�b�w�)Hl�0
y�i#���<�����p��$n<C�"~�
���ò���<	�Zg8s(GY�@������0��C?%�uv_�ӻ��������|J)�XO�����n�)Wn}9X�����
{D��,��^ͼb�B�6��$3�|��\N�I���Hqo\C�J�'����
���C�
g?�y����H���-+&�A�laF������"}��)��!xpf�E���G#7�1hkw�^��A[��o"O��L���_�iI	�:ug�xf��9Lr�[��Z&�󷍵��l&�S�]z�o�S�^^��4\��ht�y�>c/���Eн���9`t�Q�C��z�ȂG�	�KY��v�~�0]��6��D�=��g3���u�z�麷��0i��>6�g���?*��z�ޞ���U��D ���m�sĉ�,��N���0�z�O,b����찷 hb"+ֈ�ے���a]i�ݙ��~����~���u�9�&��K�Ζ��\�=��4�	�� &�v���V�Q6���͏���%�+�|�'�A|:e߱�O]0��v֩�����q-)<yO��~L\���e��3Ν>cJYB�,^'�tҜ�<1���Cksd����{��a��{?,�5�m���ݽ�1o���<?����mM���v3��Os�k��#�ki���"�N�0�,QҜ�6��S�3��E�[_�^�(�}cv�'�7�E�r�C�V��F�PKEePQ��8�Cpip/_vendor/distlib/scripts.py�;�r�8�����.������Y�(�Nb�jױ]�3��$��DHbL�\����=��{��{�{��n�$@R�3;̔�"�F����<`��l��Q�<f�\�'���{�f�<Z�$s_{��C���5J�-��D��Σ9O�L�\qv���4a��Bn�����H�@F�nx�X/�y4+d
��9�k�H�u�9;��>��>��dA�ח7�&���\��Ƈ0����5�R��4���Vr1���q�\�~ʟ�(�r^�	�sY�ڊ�����uHV�\�r�B.�\Ny��5`�egQ�������\�SnV�-d�/\�u��<��ؒ�{|�e� u�8�<V�k_j
�2��|��dzǓ;��Ý��%	|zN���4	�|:�Q�7�g'��o�oO.&g��70�q��Ͽܯck`ָ�?�r�����O}�0%�ӄ��[.�����׳x�`~"�"O��|�ׁ��y�
�!��8k����A-�������
�$jDrk����=��)Z��I>_EȖ"l>��#��]���n�6��M��x����'�!S�[� ��h��SEs\2�(���R�l8D�@^��$��{|A�)A�=B���*��@�\X�O����9��1����Ir���ϊ�d���A,8n��<�vd.=��f�J����Q�P0���E�R�#��A�f�$�"�hW�p���
���]�}dQ�l��fz>�8��;��9� ��8x����/�
�����>��w�/p���w������۫��Pm�%&m;t�iX�ܫt��U7���+Ձ�A���uJ4u�I���˻��>�]�b��;s ���g��??�����tg`��* �>�(��'\�롖�z!_�^��H%7�حo=���(a���� ��r&@�ن3���`�3p�<�W�3�/���`���Q!��,JF0��Ga�+�,��7_�y}@���!B�[9?L�M�mV)���
l��D4ȥ@h�c��xǖy�gfP�g�M�.t��<k^Mgs2��$��3�~syB�\�9-����D�F��27•���S��s���4����D&�C��,��e3�#I7ހG���ƒw�y�\��/`Y!@=Y$��m�F>��z�,�&�z��������JTN���"H�s��+u��^�����Um]d|-������3�4�Y��z-_�����R�a���i�Dr:u����b�����>�i�uڊ�M^���i^$�34�0�1O�1�o�������{P�>�؃,�`���
�#A=��<Ng3
G�l"��B&`0ď�_�%���,B&���z�o��Ac��'�E#��"�w<��Kp8��]���L��md�<
 L@�s��
����1p����
�i��f��k̋�4�0��R"�f��l{�`^]��Bd3&�e>2$�$�%ϓ�v[J��x4�H����bD�:�"B�Tx����c�,����(=`d�4L@
E��iﲭx��E!:������B�S:q�	���k|I��U+ף;��.R�	��ڲ��o�&��@0,q�"p��V���@���1H4Юk�q��!׆Ϛ�bn��>xB���w9HY�ވ\���d
z�E�lr����}<q���2����<��irI7�PeB>d�	x&�9�X娈;�E��|��2\6c�T�2��k��J�[w��-�o�#F�*&�� �<Tq�y��(mང߂�`�^��^�18/��@�z^�@�\n]G�Gq��r��oT|��.N7��=�'a��=�����c��5�!+7I��
r�t#v1qV��S�`�qSmgE�S��;�8	V�/3�`��+��z�`�v�l��+Q N��[oj��ޞR�۬����	�� �0C�R�U��A|��ZmR���+p��Z�g�el>��D �ґ��oR���s�k?[�Єh��!��������!�{RT5Pae
�����X��f$��9���E��˜Ӿ��Q�үe+L���1[I��F��Ə�a������yʃG���B��&F1O�r�!�H���_�_#:�4_��p�e� ���(����S<�Kj'��
8lmP,���{2�v����)��K%7|C��(�ȶz���4���)=1E�h�<��
	���È���ik���7�Hs;�=����s�&}�9V��="Tt�<�@�3B9$���q��"� oF<zj:ꧦ]�_3�S���Kk�9������h]�ó>��S/<,%�2����'�����gQ�ر��褲����*��43�k�l�J�г���
���4����1Xeɱ�b0G'�U��bN�M�f�D�.�
W}�B�T+���������:k�եcg�/m8�v
�uN?����뿀p��+��\�����F�����
���wדˋ�H�
EϔN-�I�+ٲ�Ϳ�}�;�5ch#�?�b��Q<��G�3l�^_�}{zqs��]��1&u�=H�3����Wp����RR��M0���D-3�������s�&f5�������$���C0���G_���-�n�OD$!�� ����đrl�	;�K���z�!�����/�Vq]`�;?��\��'W���sv~zss��]�������zt��SOE��d����w���	�!pϞ�9�m�&�}�-lE�@�m
p}�㓻� �V�#5�7%d��S�-sF!I%�@�Ċ/#	�u�f6�x��[ؘj��jv%A�qF
���~��Xi���������{s�J�~8:fa���8z!���@R�T��	}����U ��r�@ب�+���ۮ�Z�uh�cbj�L�4Q18���.�����@.rd%�f�&��V�7�#U�r���hbqNޢu5����Sa¬��!V#�JQJ#g�x��;�t:_ɂY�ZJl�\���h>�	*H��b��==�[�)��=�'���R�I4c㍕i��s9�`@�	M"0:Ar�L�<����`����z�Z��n@���"�*
�i%�A]�y�D��
�����|�t3�q�f�c�$�{�{e�loG��3j��6W��x�I�D&r�BHP��̥|ۘ�f�7�V�WA����K��R��fDg����H�*��Y�86=�UN�D�`�����:��Z�\=�����C���U��F�^N���i�!����g�c��,���Ҽ�l
D��\�w���>H<��`��l���j�I��)G��0:a�	3C�Rs�G���N
V��|�h���^�"�����?Ö uZ�G��@A���ۧ^�c�j&�Y�3�+�c�o-@�`U�S��:�$�+=�	�D�1��7n�e���<���R�~m;�6M���]G6�U:�7i�	�‹��˵_S��[�\5v��_��.|�*�V� >l�%{��Q6
 δ�}wh��4�R���X5��ݱ
1	��5�.�D���ۧ�J3Z��=�pC h�E�-�F�}t�Rc%�H͎�������~�
:���w�5�q��8=�E	����>f㥝�)����>f�u(�33Ȫ0����1��>��k���
[W���ظ�M���\ǥ����1^��`@9c�RUl�~	)\f���s��+�V�H�:8P�_6�t�!�Rq��w�Y����Y�Y�;AQ:@g�&�TN��9�c�N
�HcR�s���;r�UH��*aF	_�a��=��Ǣ��z�4��B_���#�jϖ��ž������V�B��l�OSy�o�,C^H�A�RG�;�(^X���-������/ja?�U��Y�G���F�Ey�xj������9l���9�m�m;j�fv��}�G�
���[}(
@�S|����3�M�8�����S���Ml_�3fl�$̣=�*G�4�j�(�Y��dF�1;�ڣ2��+ �!�d��5SZ
R]���0tm@��S���7ۛ�3�����߰ʰ6&�W��<�=��s灁j���G�,Y"�!l��;,�F1�;Ѫ��J�Z)���خi�wk��u~)(�lt�"�vͶJ�	��A�dž̭<��L���G�1��2���Rn�4}6��HA��3
�s�l(�!�ܫR۬��٬���)��pR
�X��t�?9��0����z)�C��H�l�p�@��E����,P
l���j�vIRủ � S̓�FN>k�uף2Պ���m�������ꔊ�c���4�ᶼ�_~\���12Oj sXgr�bW�d�!�B4P���5'��\o�:����$�ց�c��M�OO�z�UO���–JjO�Zġ�>��y���l�I �e��{Dm���� �z�:��D+a7���TMMn� �����rD[`�L�#q�Ң��R��e�R�zc;��a";����N�;��m|R���ՖQ�.�u�����:{J:#�Y����[�����q�w�ɏ5�=��p��΄��oL>�ZQ
A�c7H�WW�՟2�"Z�z�u�;��
ѐ�/T
�	ۄ7`TYk~�ЀĢaUvW�#{�3����Y|U����1켮%����ErV�o��V�;����E�H���pG��c�8��s%aG�1}��σx.���_�6ޟ�	��-FӇ@��ot^w
p9��s{t�vׅ;��[�ʃ��9�*�C�H�	3�ƅ��m��L���4��u�;~��w��&b��4kjIyͦ����@?��V�1���h�?�u�<����f	���QP���^��c� �+
�Y�06��]���ZG�<�$��
_)����Y���Մ-Rj��3�����kgvov��a�I��Br�y����r{���E7h("���`�(��!2��6�R�<���Sݥ�g4���ݺZ���-N���$RYa't	��D�֙%5o��FB59�k��G�	�����ʕ�
�-�8�6�Z� ��^)r�[_Ż;8؋2����OXi�-u�'�RP�Z��*U�S~�R��b�.beq�v�.~���Q�S�Æ@�M}&l~+	j��U$a������*
�o����R=���x!��xY�'���4<���S�PKEePQ�����zpip/_vendor/distlib/t32.exe�|��8<�+�$��	����A�.(q	nL6D%��K���-�f+�������j[���R��}������.�٠��B5�T�:<JH2�9wf7	�>}������hv��{�s�=��{�9Sy�6��0��T�a�3�?'�끿�i�e1���{�~��w���Ⱥ��
�}����=�࣏~�����ѼG�+��*�;�]�zNffz�^���]��˙���?�m�x~P�63F�fF铝�;x�w�4�]
�s�i�U���?o��{yȇ�]�f��a,̖k/�H�u3FC�!�aN��Z��f���Dl`��0�@�O��@�w���l���|&�_a��Y��̋�o@j���A3�1���{7g=F��e�?�_�����z�����0yЪ9
���q���}��i4�뜣�1�o���L�p%\hNú�� L�
}f�g���sV��.~��ဖ��������������f�av�L/a�oI�A��eW�es��5�WU�
<‡��&Y�����oAz	C�ą�nr �~����8�r�.�L�#�&�?�i`tM��$j��6bML��C9�P�)Q�\�z�j�|�����0�FsB��W1JNs��Q�+��-�
�����Z,A<;������"5J�=���~��
�^��d���~�WɹI�I�ٛ�0�K.bRU�p�T}Vr��F���8ր}fR{y?�a��R�b�<G��J�)��\q��`��/A��ߕ�a��=dE&�H�^�:P�*Ԫ���^�h6��B'�Yr�=����ހnH�Y7��h��W�������_:"q�\y�T��g��$���3�"��M�{cȦx�:�
�wy���eU��3�B`��"�(��:�7�C~ƍM��V -k�8������-跗)Z�e�T%�^���%�;���Ⱥ/���B�M������uG�q�z�sT���IB��
H��hb���+.�H��5����\y��c2�z�@
n�?I�"E�󔮲CAW��
 ���E�G)d#��C�)I:څ���W�ť��Y)�k��=jN6��a�F���x�(��S�T���j��)���i�Sk������͙P��SK?o>{:9�K-�],"�����z����j�|��+X�os���c�۟V��j�����mk����r��n2nPU���"{)D�Ҝ���
9}�)���_V�Ĺ^7����Q��g����O=��U��"j�_F��٠�Z��|�%�4�'Zb������%n����
��9�hY�
\�՜2��s1�l����<4JͱA�#*k(���C�4�l>��ݻ�
da�"򱈖�n����F ���$j��,?�j'�����]��T�p���[{���2[�݇.a�!ڦ�0~Ka���sN�YT4�~��/���[�}L=�41>���g�d���+j���!S�e�vV�����7�$�8!�sU>��-Ж��ܾT�p.V0�.����P�{�6=�b�*F����|l�)�׋�3r??�ۗ�	mz4�X_�"|�'t�	<k�K)��%7�U�w��BM�T?���s�n������c�p
dN��
��Ll�c���Mk7�#4��*2���NM����'�N�s���
i�Vh��l��Dsi�
��u���F�>�]V�����X�:rQ��Us�0���ٟ�X��Ő�f���jN�a4p"���@fJ~p�Q�ս�}Cu��Ԙ�A\�<~��ٴ�b|�γҞ��dF��D��(?�/�#���𬗬w�kK)�3��]�P��d?E���	�X���F~�ѵ.�mLӥL��t)�O-qt4|��s���u�l��#m{��^`���༧��b�q^ͥ<���r��<�4���k0SMMp>닶�#IK��� JKS���0����"y��O�Wj��)�!�ԏ�sDB�\�[��r+͢�/��`���H��I��Dq�
���Y��>l}����	�c��s˫����f��|��T�΢p��u�FM�� />�c�e�t��o[\���&VPVu�^��7�!�fS

�W��"��3iIn()x_�h�m��Y1d�.:�{d��`��h�qH	�K�N$	J=_O�;dJ���\�rJ+��a
bN�1���zH6:IX�_�/�,DiX�T��6x}�8 eO�)
�QXE��f��P����$�Gb�]���g�R�S�6U��=\��	��=�|B�̏���=�<��JF �}�*Z����OD������y�=F9�a}�C�#-��CAW�ۇ�!�FM�˷
�����&��D](��$
�����G���A����*�8r-$���I�����v%��Ġ0b���b�UJ�4C?RI?B1 �b`y����
[�x�#��cqx{�l<����q�M��U
B���$�*Q�P�����n>�@�!�G2<dl�&�� Y=�p5b�t��<��+{~f����ɞ� �������݌�����!�w=���&G&a�)��.W2�נvZ�l�F��'���q���&�Ct���WY�\{�+{�l��/g�5R�\ᓖ��,G������ʙyׁ�U�VH%ׂF,���f�e�,H/C�d:K����!�Ϲ�(d�k�P�AI�Y(�i�D���
gm��z�\6�娶@��H�LJFHr? rK�eh�T�b���=�PE��Gܘ�%�p��1^Ґ)����;���l�Wt����EQ���e� $�^���#�|$hn��Mn��a ���
��6J��Z
� ?��9-���������:>U������r��k��
C�x�ǁ�����J�W��dOON�{�<$WZG����e]ѣN�Q'����i��]DZ]�|���PAX��'R�HU6[���PB���]�W,Fd�\�u!�ĩ���WUl�gEt=8ś�H���*\��U��o�+��2#��l�2p9�5��J�L�r�@�@ɮ"�Er�D���)��6���+a"G����r�]E����)%��ޘ*����''6j��S�f�4�HtT��?qY]�~�U,Z��h�j�y�!s��&�`�����
 ��p�"�M �ʗ�ϧ�?O��@A*�:�y3i�n��w4_\6�������J��x������ú�
�^G���i��<�Խa��^AG��Eۖ�eӼ���Q��<P�|��\N�g7�C67�ː�X�+4xqY��Z����pôbZan�Vu�������{Kiv-�y+Y,�bv�8=m䌯�È=�Z�^��|�~�mE���n������C����Db�o�b�/Dbn��eM���f�D��B>+��	9��/� ���t�;o�CC�M�s��}�O������7+��p�A+�J�����H��{���o7�ޱ"a����$���B�$�f���]A�;�u��U�q|b��B�٨k�0Ʌ��p�
����!�Ofdg6P��� ��`]/�ܽ�s7�W/QI�(W��=�`��ʯz�D
tǟ� w�F"U���@ne��iy!W��A���]7�VJ>�X��X-��;�K����ωqcí��4��
��v,��#�O�2G��*c�$�j$D�Ećb���]��3IkNb�*O�n-�fzյ٤�d.�rLE�^m�L�Q�č͹���sU$ܧFn�>:���u=ȝ	Vy��
9��JY0.��B6d�55I��gA�F���|��\Е�,J�f|�Fu���dUP>p?+(��6@�T;k�D�1��Ap���8;ɜ�p�'D�Y��o	�~���ȕ��jq@�U~�!+*5��l��wcv��
C*5�ȟ�\�+�z�Ԩ��l��[p+Z��`�ts���b���`���A��C�W�]!NV,f��6�

��O��_�8(7����mX!6�2��Wqa�w�q}��z尒*G0)8�d�u�ѵ�(G��
��q���@ΠݕP�@&���t]�T�=� +��{E~:�ꊷ�{w� s�zA�
\C������4ZU���%W-�����!��C�cO#�k�-��/�b-Z�M92�e8�8��$�L�`�o,��닄\�Z:�"���Z��M�ڱ8��z�r�j���2w�|D��GȰM�Sh���<=�ͯb�)fSqs-6�%��T��y#�@�2E�nԩ1T⌽E���Z*tF��R#�%������EV��]/)�KG�$1>"Xg��ħ�Ÿ����ᲥX^��[_I��:����2]f����SL���:�l�1�݉-�<�՞fx�d4=(���zI��T�z�K9�(�^���/&�t?����X�#����u Q�@�<{h���%��l����u�&�ZM(6]�[?�Wi���R�e�]G�%�Նh<���J7�*Y��Sd����0�C0����/�Ns�}![=���r��qh�Ch�D�!b�֋E�T9�/���
���݄�����̷1f�L�	������5X����\Y�d��*`O��:�d,�M��i$�p��+p����E+͍&i��o��V�	˗#�m���¢��Y[���	!9U����
�(��2A_N"IeSR?��,���fs��1G�:���t[�`(��q���/L�#�.(��ƯH-�hg���k�Z^���k��ս������xA�t(<`�����c����&Zk!��߈�"N�k�%�ɋ`ebMJZ�t���X'8�Y�Oqb�?�Og^�[P��OEI��
6�k_���0.��I^�K+�Z�<	��9��kr
֡<SzN��Yt��X��0�9dMVr`�,M{��ԟ�ԏ��\�k�7(�G��/9WijyU^�)?�5��3Rm����j���U����T3�!�;�� ��?e&�u�g�%�:�猒@$��Z�޾>-�:C�����vh�*L��5��V�Y��g;��Gd�j噍鲫�5Wuu+c�]E��f:����D��D,�
9ܙz�l��=$cݰ�k/`s�p��V�����A���
T'[�`���E�&y*U
�Ԛ�=K8fE�l������U��&'C���P.0G�N���?]�%?��4_�O�ꀾ!�-�mai��!�� 6Ͽ�4蹮%>̕�LR�b?R/e!��,�&6қA;RDmb�ȽBH����vX]�˭�D('-�/������*dy� �@R_mcj<�y@�֚����=0�]~�.��5��-�ʼn�U�!=�t�e)n���q\�K�:���F��s�D�!#9L��)��88|�8d�-�Q�v�p^������<d�s�y~x.7��-�[���/����y� ���� ��$s���<�����?�Āp��	�TBw[X�/!�F�+���'tD�O�S����1^<�"o�%dNl7�)P�q��``R�e�J/���Ҟ�m*!�@A(�j�.��.-MO�
�p�Qx�VX-`q0J��P�FA��z3T����V�KЈ�Z���!)_jK���(��@ZB'=i�.�IU7q0��
Wc-Q�EjL"z���Y/�#i���Fm�y�'Uٚ��D!��NA^�9��':q�
�j��ʛ����a��$�1�t�(oW!���8f�Ғ���2LFT)�+���|oƑ��|b�(�M���1����*c���x0�&�:X���Q���}J�=8L��4��n�эcJ�`�5{X��3�j'�I�D@ƈ��$h�,PG�q�2�=m=#��,�����7P���� ���Y��q�>�h��0��h�@�B���7�ڿ�������d�"��� ܼc��ūT�jͅᴸ��g��G�v�<�*ϐY�t>������L=�Fӈ��H��D�M��D�-�F��%;�[��
&��h>�C���E�<�G���1�o 7a7��A�^�Q;p���[��7��-�_2#����"ጐ�&�_H�e��:+�r�Tyڽ�����Ȯ�.6�a~�x.otH`�!�@݋�����sx���Y&�@�F�12{�7�����y�i#����9�B|d��cJ7������]�q�	x��i ���9x#>�;�B<NgwZ1>�=��QK����s0��o��	E-�sJ�+�� � ˎV<
A5��	ER�[��eԜ<E}��MxF^� ��c�ò�v���	�Z��\G	c?^�"�Ru�T��{(��x<���b���!�7�W�'-��r��J���p�d�O���%�4δA�&6ۏ�xA��ZNBt��-��U���e�����nmI�҇�d�V�"��oI:�H�\`�%�88J�8bL|���3�*�E�\�?i��nG]={�&��6�ſ��(�c̈B�cx� 6��O���<*����E�Ż*Ш��p�	�aB�lWƟ�E�a��Ճ�0Ԯ^̯�Dcg�U&b��y�4���u
��*�]��~D1ft%�.p���=�����ƥh!��<��0���
��:�؞2#X,�,�Q��!����z�iҡ (%~��E���L�a��Q��S}gi���Ib{&��bW����AS�H�H�}Mt{�t��<��'��!�s�<�	UK7^Z��*�r�U�h��KYi�d��F7]�6_!r�e&T��I���T�v��n��o�DנywQ.���P���5�](	�_�
c��67���K͵<�ȥ���!۾��P�.�w�9a-��=�s]�<#ǡ�C��d<269�n*�J���^d�H�R��	�r�oP��=y�2)	���Z���i%
������I+Yi��r�x�MM,?H�Q"�T��-�
ɕT���cu�Rc�#65�ZX�T>��,x�^B~�g ��V�
&.ecg

/k��r')�
�R�4�>ׅ��O��N�=pϯ�>���Y���A����R�>��
x���@�ed��`�Y
�w�և�S
L�sP
��PJ�%W� ���l�_�9�1� m�[c�@�6�J�z�QQ�rp����䅿h;����
���o$oQ����H�t�}^6=yV�2d�U���F�oh�Q{ȍ�HT�J������6~\�x�s���/�ِ��\f~���8r�2���U���f��[�g�Е���%L�"�DԠe�e9���.�X�}*^��7�)�i����mENf�:/7�e�6iM�-�U/���\�����j�50Q�%W<��Y��E�ʞUR&kV���j�&*��\��*�c��L����R�K���VU���lz�n�O��B�X�rV{�F�`���z�����T5(/���H�gŁ!~e�N�����Of˞��E�8���G��J
��F�E�+.w���^S���r��&H�Z<�	���iz��Ep�����Z��n�:������y>|�V#��\N����^5���,�0Đg
� �h���Ӑ��A~�E˕q�W��'�[��O�Y�\�B���x?L-��r-�@@/�RI�	H�x��|u��8?��^�ҥ�ݎ$
$�ϕ峫��:U��X��m� ���CC�ʘ+^�͎�����>��69Z,>af��>����z�y�_^�e���Qv�]y@f�5���S f?��v����;�zW-�rյVu�
���!��R��a����&��媏�"9:�!3S��V�_��q{�]U�-����99�S]�R
��tU��G=^?s�ϳ��,%��a��^-��g�]���dϐ^>�$5��\�T:W�h6���P���*�Kߝ�=��V@}�_XR�
.�sog^G1Aȫ"/��.�`y��(��R�2�<W*7+����fVZ(��Ju��%V�zb�\�w�LJT��>�
��'xH�ms�UE�>oc��,S�����O7BΉx?�,��z�n�:‚E�Rk#jJr��8�"4�v	�Oy�F��dէ�@7�n����o'��]�w?�=�d!�����E۱�z�@�.u<����*%�.v�S|`�e����q�?��˲��Z�Y�{�g�����;Tڍ�M���H{B��>��z1�l��s�f10J�b�;�r�^���~)���y�K�L�見A�����o���m�b!���}��2rc�.���[D��3"(���@�A�gco$����d�{��4�2n�9xM����A�^�x�0[������J�-����%��A�-Cݟ��ۡtnߑ`۩�=V��/aϘ�M���]p�^�Z0�B�B�콢H|�}�j����{Ÿ�/�k�\�D���l�S�b!+\�F��t^����,��Mt��I2��i�To�Ջ��s�\�ݬgoJf_�Y�v
�f
�%���p�IaVq-��#\��.�2�Pwh`#�2��q-�x	i0�d�4��-J� �rK��T���o!�k	�Л&�Q�f���6 ��c"\��b8/JI�([�S���������P�é�1Q:ȉcgᵟe!b,��U��4!U����	K��� �>
�7��J��ߌg�BƎ�P��H�'{�%p�{��iKi!=B�����k��^
��*m~�ϛ:c��!4_��R��_zh�kD�kfDk*���W�hޞ�L)�"��;Z(�b�n�>�G����ߢ�B�ݺ%���{S��'��Z/�4
B룴��Ō�/�Y�M�0��bװ��ͽ	Çy���&��9��	:�>G�~�n��A�L�A�k��Q��Z�Q3�����sO�P��?�?&��g!�~	i:��$������p��[�M&_�
W��!K"[o��Hɸ5�jA)%JYmy�9ABN��t�
hD���ڹ��,F���&�� ��B�F�T�^ZDÛS4��Li%�ͷ�{hL{-���G'��8���6r�.%]+3B��P�����6L^4(��uN+� m�J+�p)g)�r��raIWO����xxr��Ȅ�)���"��y�:lMM���u$D^��q�0F�\�6�b)h@;�c&=����/�u\�#���[����k����q-sŀ�yײ ��ˀx�"(�Z
��
$��آ!:d6d�X4��p��!�/���A���[4��2p����a�<>4)p|�U�@@^7��K<��i�w�L�#sI��vU�^�uL)S�׎�FфɈ
)W��5�gG��%(ڒ��
2��U�w�Å���>�K�Ţ�)� "�5k�r ��
���!�H�l�_	D�*�7�/��S��)�i\��)T�)�;���Z��V���3|�2N	/��xK�l��‰B۰���1ƛ�7(Y��,PRv�l^M�<J���˗�B_p�,�����]V!_���H�<mI����։a��7�-�{0�|�0��aAJ)�	�,�� +����Q��kdZ�2�_��-G�!�^Y�_���	ߖ)C���L��Q�8���S{�wK�v�8�����|uϋ��y�:2�2@����-��9b�V��Ԧ��#�c�_4�o�ǘ�@�ɮw��^���P�f�( �m_݃��v4�F�$�}@�T
��Q~�� �fvľ
-'ƞ����W0e�B�1��R��|q�78�<��~�t2�.t2��7�v'��6�_��q��	���M柡]��<މ�=�p�f ,S��e�uG�
��]嬍p�]	Z��@�`(�w�{�8��yi���b�/��=de�va�8=X�SE�jSi��R����a�⧋��_%�L�Z����~����K��3��e������d���K�u�ai����𧶌pp���_~��/�f��{3�eZm�{���S� C�X�["�K�>�-�v׼@:�paXoVs^�.�K}�\Ү��P�@�#����������ۿ���N�����0� �t���t޽��k�o[�A�[B�I��hi
��>7ԍ�n��#W�i�C�e�,�d/d�"�҉S����sb�E��o[]XM_�g5-N�bk�j�b�1}a#��Qy�nMA�)��?���ʽa��b~���u4,?����,L6u��&lHoZ�5�\��d��&l��k^piw�M1�3L����&ީ�������3ϣ��A�/Z��5�������oжHn'N��3��	��z�I8�G/����'zԜ]�r�CH%|���؉��$-����:��)Y8��a���*��-(F���Z�А05j� �j5g74�v�w����ea�H���rJ��6��<��Ƽ��+NyB{��ټQ[�Vz(KV�Բ�O�cl!K���Ѯ'�0�1{�h!�kykv�C��hO��y�J.��d��a=艺՜W(����u+D�,��qC>���;p��	���ZTM�'q�45~	E~�\_��-���Ҏ���r�)Gb�fF���<�|�H�$t���F)h+7�$��ۻT	P���4�2�(Ͱ�_��܈VM�Nuu����m�br�-���#�S�Rk����BA���7�K�bO������G(2��WY������>,~3��h�,���v�e�w
�R3��r�U�b����y�ƪ�@V��G�<g.p�_���;t"d���D���Vv�dk
N��4�]qy�Ɯ<�[�.�Qj�Z�8y0��mhˈ���r�|ϙ`J��_gP�L�
�R�\�x�$����,#����y�&���y��J.ƙ�~�W����@Ԃ����^���,5O)�s>}Zw.��=$��-��zyq��^��fA�S!4���1�mq���ּk0!�%�h�����uֵ���Jgm����lN6|�Ql���R?J�h#N�Bh�8\�"�L1�
y�Z�*����R�X�������� ."o�Mba��2��հ�#teЍ3<�<�^�'��f�M�ɍ/�G��2�%4�\鎺X�䛟����4٤��O��PjN�Glj%+@�IÂEB��u%l^T!�����Yu˩;��V~�#�~��n�|Жx��$6
"�r���'�koW��87��6�^�E&�@�N~�Q�a���#���#���o���i� �S~�0�݀S�M���$Y���_A�M�#թ��;��a~��j�#?�-��h�T�Sl��9/p۽�D�ơ��Hܢ!q��
�ȀF���V�c�E���f���Qi��Qc�&V�4b�G.t���|�ǩk�$��
25�n�^[�ћ��:�]I��lC�����K
6��|-Hn�a�L�v��
��*���p����Y�:-��5R�j��̨9x��Fsd`��Z�aFԜ��fu����o$LR�%���$@_��";�`�q�z��$��)fb��c�����a�.Ȥ�v�,�g}���/�QU��xC���h���l	�_���������O�Zi��w�.-�!���c[���OG��GZ�`Ӭ��|
��ف����~
y5�D�$��9���סЃx��4am���P��=���0f��Z��6��&��3F:�ͣA��*F�����ć�aN'�f�Y�R�4�D!��5�x���-(q�P:���)��"x1ѸꯐJ/m��q�)�G��M��#ŕ���~�����~��-�ޞ�ޜ�[��V��5ho��*�mE1FTa����f��xG�����8�j��>�RCչ7���3��?�|�QL-,��U:�����\?r�2�y��[����"9��E&5[ɏ���Ilh��F�^F�me��	�/�z��l�&|�t��/eڋ���!=)##��i��?^,.�&n�bq
�A\��Y��8�Zt���(u�ԦNȝ���Z�(=�i��@�[_��"�0�<�zR���Q��Xmjꍥu��2��\���U;��ԏ�Ν�Y]��矱Iz.M�QZ���<{�JZFW�T����Vj��Z7�g�Ѣ�k�]#�O�Y�z)���$�~���5X�f�xq�s�f���M�!�j1e��{�pChQ�ϖ�:J]�A�V��7��{�KɆ,�
y3ZH̯���T/�
u	i�7�/Aб_n��pB{������d�t ��H�/��%+�,���s�4�l=�,z�!mV!nF-���i9������n�r)���M9{�zLl7;k���9e�6z�>��O��r�5���`T
��.S7��1~�C�+�y���C��A��S#���89�1��C
���g���u�$��,�&���f9K���|�X��c�Yr1]g@	E��[�ag�\�_���h��J�x��n,�$�%�vN�>u^�8:��	�����%~e��c��nr�EU-J�^��b62
��T��<�JQT{Z����,,��Sru�R��N����&�As�Vx�#��Ȍ����Y�ս�to����)�Ə������Ei���:�H��@��y�:�+z�Ā,�z�����ՃX�>���-?C$�_q�{�+�Cb��%A_v5ڭZz׆��Cr%밾r�$�����A��or_�B�<���_yU�O�H�P�c�kY�S�Dn���W�%U��S��Y3D;bH����A��~jR�*�h�	Ŀ֛�qοׯ�q�F�ߋ��A���~硹%�����:�4�Q(��CJ�㭉�D���v��a�Ъ��(��.d�rG�{~ӱ���P@����+�w��y��ek�~�PxI݃]���ɸg|�<�[���5WuU�/�8�L�UsP)�q�/�T��j�.j�ja��w��E<�,�;7
�*�
���[k�[8�5�Ksy�)���k"�Wh��s�e�

��t��}�q2s��ah?��힟���×�-�2������mwd�'�zX��N����y�#��#����ރ��n'�\��ï�к[ĐE�P�N�I�*L�Ƥ�;��{kō�<j]r���X��dûU���ϸ�,z�8�\�	��b�j�DHt���&��q�����o��[H��ѥ���4G�#��&�M�&��iM�vFk��C�ndd�dz�8�p��VŦ_*)2
�q/��Lхt^J��p���n`e_�2e�r��~�ir4��?K1�Ռ�1��"�ۘ�r3�/,�&�Ir-�Y��芛��A������XEޅR��;�i��Iy����8%X�}˔�`���tb�['͸�G� {-�&�f���"-�FKq*ib�$�!�~�M�lh���`Q<fSK��ՇTt�՜�����uG"hFЧ-v^{��m��ԀLvm�e?��i@�g�v�f�C�4�N�#���/$I�97,	��\V䊲�v��NP
6jv�������VZⲣ�~,Pk�h�WK<��j�|y����X�� �=c�n��M+��nG1^�m�Od�&��]������P`B�0ᦤ��i��k�$q���~�Wp);��D��j���bL��V�XrGӧ&����F��k���r�+/,�{�l��C~�E
�V?�0�� _K�qN쾌�X�h�,�����b��C�Y>���!З�^�r��lR�,�S#�ixy�	�f{�-Y��p��滋�o{��}N�嬓�K�--5����a�T�Q�q;'yaz>_'3��F�d���wHՃ	\�־���XT�
c��.UG�T@�2�������F=I0��@�$x,]���A��l��$���T�`
0�Iv�&��P	<���i��������L	�/�Gx>��j��MNa+,N��>.��."�S@<_:'�U�$�A���N1N�l6�^�/Y��x
�?�l�P�l�)�J4��R0����?�v1��}k?�\�\e��>M��"��t�h
�	�d,x��dEb![�K��68�6�h*o���w����QQ�v@���ٛ��e�6q��
�����q*�{��`�)�B��o��~&&�5'p��ujҾ	]������FA%C�hʪ�2�y�?6j��A�T��t;F
5�F��bۥ�)ߦ�$�G|�	p�4^�-]U![��}�%�<Gd�7X��5��T娥j늅�?0T�'ۓ������m�:?��I�Y�
���A�90l������e�t��\��4_qSCU
���^�PeF�����I˜'W�=>�=�ьT{�B�T�9F;�όT/�2RLB�3����]R�w2���3�SMH��ǂ��f�|�S.kùї������|��C��3�'����]T걩��2��| ���v�.+Z��>�N��2e�@[7�8�r���D���V�O�2��:�.����KX�{H��
���m������lr�>�^/o%�%��f�ג�E����!���A�[q��r-Mt��+R��$� ~�����<�K�̾?a��T�yP+��r�U���.�燰�=M>�d������g��UUKɇ>��q�W]τZ�*�VV�Nj��5����ixR��JIT��6���O�d�.�.Yw�\�W��|�O#�i��=�؁&��`}���oo2��s����J�K��)Z��
ׂ��t��xXTn������{�(�9Zx��
�jx��\@N2]�tO�A<�֬ԑ��4����Tt��m�fj-�`7F�J۠oY�3��P"e)�T�춉![��߀�a.7Y��,�?�Lr����AL"�A:��|/I�@����B��X$�����)J�J���՘�Z�B׼�-A띜
rq��B3�B6�}�f�ӻ�̊��lٰD��u|�ݢ��\���Z�yme���Pg��5�U��5��
!K>�߉SB�ːTm�k���{Z�0��i5�}7I� ��":F�J�#�`�\�Ї���[T��S�J��XwH9
�:25�Xb��'����T�5��}Y�e��^_��B���k���t1�o��
k�J[S�Ӛ!s�R�nK�^�eI��2׶8k&�(���9�j�@g�3)�5:��f'@̤�]��g��d)t�-��sSԜ^]k�h��f8µ~��J��U�j��
�����&��O���\nA���M�t��ĚSSހ\ۃ'"R-,U��.N<�P#�6Â�\��˂L��j*-Ǟ�to��c]n�Ā�0��$����|Gu��=���[-�k�������M�೛�t��vS���V��.N�(3�=�+a�0N���櫇�+m�Rh:��~9^�ʑS��;��F��f��ˑWt�t2ڭ<��-���Ɣ�ؓT�qr{�(�7o�7d����p6��=�I�8n���A	_G�L�׷���9��G�`6u)N��+�	�4�����,��mJk's��e�,E�/�vMiA�2���y��^j鐣�$��ڞcYe�*�>\��QH��p�؊�b�Y�Łe
�l��r��,p'. S;7&jO�*�G�{.l
AA���J;�DF��ω���ї��q]����K�0d�����+��@����KŢt!��%����
Q�vٌ:�у�?���J�T2�^l���g.��LH)q�\��L9��,�t�z��T
8@Ig�^x�"X�O�
��'h"���|��/	(˨��ˌ�,-�CUi���:G;���Hrοu��[̏"K�;\�~�>��Vѓ\�@�lE�|`�;�!`׿���3#�^��SY�i�H:���L*�����>��ёS��e�f���k.�\�I!'���bft$o�"J:��W�aU�4��ȗ�d�}QZz:H��V]��Vn�ֲUIJj�}(���r4�ėDuIVvچ�lX��p�A�}}�@i!�BHnW*(��n�m&K�o�v�Iw_�Ca_�uY�K�}C��?~Y�*Q�/ߊ6a��#�P[Y>��7_B�!K,^�B`��Aw��E��?���xk���T1jc�O�w��0>l�x[��)3�)�_���5�/*X�_s����<=�2|�z�yc�<�ը�ȥn���e�n�QS;�M�+�k��qG�����h�*^��=��{���A�P���<�n�g����+9n?~��_���
�n͠B�S���Q?�}���0�'<d�>�PI�(�M���Hb�=�e�1�|��q���->����!�6N�R���~�m}�+�m9ε<��0��>i;Z��A@n��h[uG���:x�k�U�eU��
9�eU�f'#m��V�a��=�{(&�P�AL�bhWu��vU�]���@	���d��}2l����Ua�1��d�1&C��R®�Z*����1����O
�c�S#(���5#(�t;�2{�g��z�׌.�����b)bi�@rE���/Y,�N��钏/k����m����d��&UQs�Ɨ�hPE�+�[6�~[�d8/�,��Ln�6=a@k��Q�۔̻`�)���K��-��!Vq-�|�kY���r-��S�,�l�Z���2�e*�n�Az���m0�3���=�&�R��-�tW�O��8�H� P��T���v�u��}x]�`�F*h}��Z�,KX_��/��W@:���VTp��A�n:�
�^�n�kt�PC*�fH�sfƟfF&��I2U�˫�9�hþS��s-C	�*ʹ���;tS;��z�bG�Q�A<�vo)s-�;l��FI��o��/DK�R���>�)�&O=�[>�Ӣ�mѫ���
�4;�.=R˨�-�i�
+���j�Vw�
����ѷ����g����6'���i��=��r̺T15��iԍ�Lf�j�-�7��j�95���[C��xj
�F4�z@`�Y�y� ��@eэ�V�f���CQ��2���BK�h�V�f�	���VQ���\A��ݢ�:e�@�+�Z��o�)~aLӥ����(:N�"F�|6S�B
��eZ@j��0o(E�9aNE�ۃ�i�T��̩�.��T-�3U���J�Ѩb_� �c�)vu�)梦T��Q�TM��IK���,��xj�T؏�X�9ч\
��\O-�6Ӥe�HK�� �fOEiGG͞�f�o����Q�����	��X�s��Q�TX��jN��8�e<5���w�;��T��sj�5�h�HSQ�Ӎ�F҅nLE�Ԡp^[dTʠFZRa�5K���uK*�4��T�͒�u��Q%�D3K{�t�5�z����������P�Tn���}��|%�cqe�{�a��4�E'��F��&��C@8�Ц�p���icu�2�7��ŊGc��<m�/�jЂt	�Z�U�)Ǖ)#��y��R�'|S���'*E�|%<y;�����RhQ��Ьj�4C��e�V�����{ȼ+
��x%��/B���h���ej}�1���A���n$�[�3w�"��Q�l���4m�h�x�bjj�_)3D*��D-L�n�7
��k�U��l�Y��ީ�amE�X '��U ���U4�F�+|����-!~��J[��3�p�g�Q'o"�?��S_	N��uNf*�d6�_�} ��Α. ~\�mO
6���J�R�8z��Vs��i�'G%�]<�r�xD�&�=?�'��J�7j�����.T`o{m���������T`��R�=���:	F���(�Udj�?RO��F�����}����W�i}uR=]�Wjuz�9�)>S|t�T�e5�(�����y��r����#��P��5���o�0};��tq	�[:�Ev
J��M�+}V�ޖ��m�#���Bm;�y�v4Г��֠yn����_j���F m@9�	�Tos�O�m�C�%L����?������]%Q�B�dY����I�9��w��Z^�n+jL�h9XDsp[7j�U�k�!no�n%Ӳ�J�vB��
s�f+�h��Lj�T�������
~,v�������!���oU��5����/��t݋>)�P��Fx�xy��_��b�
s��X�:���@6�sbp��('ՏtbAM�Q׀�qB׍hR�'7$ʝ9��^�ܬ>,��}X�=‡����R�a��aqt��ԇ��k�1���>,b����Fx�x�ռ�o&ԋ[�s�� ,{��}G�[ASo�R�~+b�$<V�'<V'<V�Mx�(Hx����X1�z����2�S�7ᱢS7*&o�,��������&*u��P�����C�a�~�cA�|�.+�tYA�Z�(�}{�80�"p������+|Va�1w��f�Ԩٰ�M�dE�>+����53{��"jX����
�{jL�gE*�Y��C�Y���_�Yq@�Yq:��}�>+@%{�MR��J �IsZ�9�iE��4�i�+��4>��ӊw��pZ�3�uZ1<'�%�	�НVt|�ӊק�rZ�7�n��5��_֜V<��Z��N+@r�z�5�a�'�XE�`���m�ڕ+LI��(ej��#=V`��I*�4���\�c�4.W
�>��ͱ�=�#|������>	:�/j^*���Ԫ���ƯX4�U���KE|��
��VE^*J�^*�'�T�=T���P��VmOx��kB�Jz���y��P�
E���H�z��<T,��76a��Ky�����C����[~�Ыޣ�5�C֬iT���P��#<Tq�yQ�
$�)����O�N
?�^�R��ԫ��4@mBŢPz�;^+4���k"Dӵ�)���/y���ZQ��^+P�u��	���C�V�� ����iN����N+p�N8�� �pZ��Ұ��?|�i�I8�81p�ӊ\H�N+���N+>��םVP�MN+F0�+�V�'���y�ӊu����B�͸�^�&��C_CY����X<�܈�V w<�������)�Y҈�O
h�h;�Qg�(����;�}���Qܽ�SE�Өm�dV�NfE��y
�b�7�N��~�Eg�;rx�
h3����BF�HN�6)fo���!��t)����CT'!У����O�琧�an� ݪտ@�_�4��NT�ق��>��W|��C1�����lk7ލ_l;�_l����ur����[�<h^�3��v��ź��0��}	IkϰQT���!L�]ݕ���x_@�����Z�r��-���>��A�(l�Ip��ezڷ���G>O7{����W����b��+��Bdt)����4�u��x(�_�rWU��U�_�7���k���Q�
q�_UoA`z�A�sf�&�m̡N�a���'z���v����X/|
�RY��g�v��&�ʶ�A9>^�y��k�|y�1�U�͋�����:L�4�~��@o����R�y����F?�o��c��h"]��I�	g�w�j���L#���"�σ�:��8��Z��v�5�W�ET�M��Ba��J�I���v45�9G�Q{�q�~�"�EY<��i+�gOUA{p����c�;w�5�+��E�<^�\��6��C�2���{��2i}MH�!�1��Yf����2�$�II��Z=��ð[����%�`���gJ��R��Mj��
�L@�^rz���b�>��:p��(/��G�]#�QZ��Fi���#�]��6�G�Wl�X�ȇ��b�؆+��m����&7���~���O����,�eUm���େ)����GL3�i�O��^/n���|ٙ]�g��>��j|dO�Gj1�|� X��ө��Cf�w�3N�}�q���6���r-7�b�d�F9�-��R�_�뽎h�W�a
�3k�i���
������E���x(v�F4c;`TUr�Ғ@/�\�g��k��+�UE,C��X����y��&$�E�W�wes��{3�?Z�L��W�+�Q�?��,)&��������;^VR��0�ކ�S���� �g����Wo����z�FڼJI�.ŗ���뷵Ir쀊��L���"
"/_�1�f���)�9�/(�	�K�c�T�<(���*��!n�Єf2C�ѻ���y��`�Փ�_�Ĩ�t��t��r����e/�~{�
�
��k��g/&��ʕ�*{�#�����Q�Ԅ�f��p��X�4�u���~3�5���ܳ�r��@M�u�mKi5�!U[ۦr{#�r2�N�zs���[} _TZ�RT���P@u-����~�4��[�҄_@I�;T� t�k�1��/���҄�r��4�S_=��.��6�`?U���K���/bk�������rC��Y�Q2ѵ0t:}8�Ev이r�;�CG�s�A�����&ܽ �_8�sCn�A�Th��lK��i�SS�{�d��	�Tm-�yP�?Χ��f�Ų�2غ��K5�����[4I(��Ot�݆���S�h�`�b~D���H�Ҋ;��s�$�Ճx���*��K��#.�*�Zo_w�L����C��?7͜#�p��������y�:=�i���\NP�?"�O��C�I��>�鉥����X�`P}�]_�
���P����,~��)�x�ŝ�*�Gr�jbC;?�Mn}���Ax���A�Az
�X��Oj�җ<��4=��`�����J����F;d�A̳�E(��C��jqu�m���%�9_X�
+cf §�w��/�(�=�C5'�!څ���
a{�fώO}���̱"�����8��ԃ�@Ɋ-p^���c1L�ۖ�#Q��'�yX5�g��Y�&��sٚ<r�T{��vH��G]G5k�N>M�=��RmJz�u�ޒ�U���nҵH�"C���ُ�+�M���{����|0*:�Z�JTT
���� �@�(
�DB�a�+����[��Y7�u����1�����JK���4�D�}�9g8 �u�����k�>����k��}ӥ(?f�a���M_ϋ]Q~����oR�r��(�EDۂ�mR�:�Lv����u�1��� �V}%�<^��J�QG�d%{FV�n��tN����75��v'���	���|�������uW��	��D��ė,b��A#��[�0�M#O��LE!� j$�TM����6i�d�vE��L&�E/���"23�yQ����E�n�Mj���3*�y
���BߘYļ9�oWT
�vJw�nv��D-�ҡ��%{�(w��T��%���_�{8���_Z�=[�l����
�m6��|�?�K��{��rO�����J��@p�;J@�U͒�רn���w�.Y{�]*��GM��.L�����G��w�vۃ��t�>K,03�)Ž>❮��m�]SO�~�W|��_����t=9�~j���4��`�_����z�)寠w T��?.���K���K��R�x��D���E|�0u91�ݲ8�u��]�XP�,�j��j�xn/�XQl,�H�C�a���H���U�5]�w��z�ĿPH=��,�"���(��c�G�:�:���(<����k�D�|.�Xi�.N��:~+’˦�Q�����G}S��S�g7�����e�j�W��*ʏ���.S�-r��vI�d��{fě���gB��3��;���i�z�	.hMn�z�eJ�5����jG���,<e,}Z>[-:���Юe�"�D/q���X�P��z�����Q@SY}A����X:
K��E]��ƒ[q0�X:�Q��5�U���Tg���6�m����WC�/nL�ƒ�X��,�:�r<�_)5cI�8��a�"�0�bIhIᩳo���S@��ZFAp�8��a|0S���%�{9���܍%�S�`���{;�T
Y��G���@Iɨk�c�B�r~Bx�I�q�k�R��Q ��59˃��~ҍ�v�@��%r�}���b�Y��\����"G	j��⻝�(�g���/�� ��U�._q�T���,R��pG���E�
ͅ��~U~�'}��)j�aq�U��`�)z�%�PU"ʱ�ņ�=�bѓ,p7[�/��DWB��=���N誨Gq��	Λ͇z��?.ҫZ��ᮏ4T�ĩoGRL��_8:�kI��!a��	�{]�S�o���w�;Hm�P{��0S��'��� Bؾ
+�f�ױO��t-7�>t�i���vJ�k���Oh�C����EB �(aO=Q�X�)[PX�	�dݗ+��S����@��C{�ԓk��C�B�r�:���m���n�����ߑ�q[��
(ʥx:��L�Hϊ%��.��!+��E������B�L7z��n��I�m�{�|�\i���]]���h_�ek+����+��c�A�Ϭ���~�(�{-��!��w笧�d	�3��sjC>Hpߎ�HT�e�>�vQ4�s7�� ��}��Al��+��h Щ��i�ؑ/���|�7��qI��PG���&�ѡg��7����06CM��},w��b��BvK���>?WB�DWB�D�#����c�%3��~������-C]E�^.
��ep���p,
��m�&[`��eC\���q���Vf�fn��l�b�bI���
h+�*˄������z�`�sM�uM�
�`�{	�*'�]3���6���68#��|'OH�2u��i��t/���Y�d}L]�3��/0���
�MR��K��/�Wu}�a|�ڐ�yFC�ޭ���������a,�����$��
��z%IȮ��;>7t�X��\n,�a,��.��W>ܧ�j��'tjÄ>��tB:c�3"�͚�^�$�d��\�%tѬ/��]Ӆ,/��i�0���ШU=#���,���/���<nԅeW;�S�vT��.$%H�T*_d�v�3�,:�NuT���������:��Gu[�ɢO���Gu�aC�r�Wr���2�A�C�������L�z�օ�	��F�`��
4(�^*�����:G��#;�ϊ��ʞ�.�[�ڵŞ5<d���dm�n�Mr��Q�;JN�_$���:@�-�yT�/��%���,���v�m�Sl�]���Mw
��g��ځ
$�y�bCH9f�^�7��^Fؔ��[�@����Q(��`h>ۋ�2�� Aϥ8�P�M�e�b�u����-
�8l
O�'ROH�j����'s���a��ID����Q�[���X�.z9��Qu/��6���i��*�I�p"�r|�GIg��f,����mS��
�ʛ
��O�k������5.'>Jĭ�}0m����ҝ�Ah����C��6� �ܲ���s�#�!ɬqU^J#�ݮ�0=U�#�tr�gO�Pաc�~8t����K�]5�#�����w����Ln��j4Q؂V��G�I�C���@6�KG/qe�]�]_ ������k��X�1^܃ׇ1��6�ٴ�~ѱ���WD�����(�‡�����.���6T�t��JL�q�j��*�G��ݬ�f!XНH΋#d��H���Y9�0
S����T�;���b��Q�o� %͇��J[�]��/���
Ψ�b_�q��r���A܀�(+<��5�Fl�D�&v�dŃbV^J��m��8����E� #�MQ|*�*�5]Y<F��p o�����>a^g�b������]�����w'(�hn��,j4�P;ꕘ6#��OL����I�69�u�RQ�,��9��΅bIlj������ұ��~Leh���A�n���n��� ����b�	4cEpA7-t��pAG�~�\�
\@,�����#��|�>T[��޻���_W|GJ���*ӏN�b���]b��%�n��C�D�����7���R�ja�q�+yM�Q+
+PV�b�F���)IQQ:�+�z�R)0H7	�Wj-L?�C��_�\�����R�x
��f��F^$fi�0K��*�-�n�fa�J/	s���~`h�fi�p��V	3ZZ&�8�X�	�aN��9E��ti�0gIS��&%3C�f�df�*L�4X�� a.�^�z�t\_�~��#��".���sŠ]�;a�e阰�����>�ºַ��9X�)�a}NX�f��Z�Ja�`%9�}��@X�US�����~)Ex`�(MV�ťa=�]Š^F
VlKIA�
�J�.�g��*�6�k��?��~a���PewLX�:&V,�K+��Ho�*(C�����u��v��1a���%�8})k�va
�5KX�`M��N����PX��PXC�u$�A�j����F�z��F�꣢���9�H��Ga���:�#�:��:��9b:9���,�T���K�I���J|�&���K��B��Yq���2�䕡�d
����a�e���pi�����]c}M^�J�!rJ~&�hť���������]�M^	�˕y¥��k��R%����(.��.�&����K��+Oq�,���Y��^v1��(.�.�&�E�K��m�*V\�.q�a%
�S��Ի����GM��b�r��P��]g|IX}�ʈdr'�w���ک3n���p�Pܻ&���%+C� ;����F��Ʈ_�Q�����e���=6�����N&��������v~>)P��@/m"�H���} !�wD��ާ�)[�
�oD���39���i�#)ܱ]���cI�����:�(�U^�.f���=�VJ�{"�"�������]X� ���u'����Q�Q�LS~ɐ�I�u\�C�;M�
�Z��u�����0���/�;$'9�7:�3���L�{Uef��.AKNJ*�7����m��a���[�tT魾����y`i�Wi^X�Gޫ�|�^W�O��������|���-�[>փ�]6�ñ�ӱK$�ϝ8թ;��s��p��@���C���P��]:�.Ӧq��<Ep���};�!�B�\y���)2%2%2ϐy��2kȼ@�2kɬ%��̺2=vؙg�g�ZD���%�03eO�*`����+.�im�Pq�a�lC����)uX_m�����}j3���t�fA�Z'��:	F��{M�	��D�O�����}h�8OǏ��Ί�{M�4pS���ՏR��2M�U�p���~�t��ƥ�n�vSfd�, (&xd���nT����'ӟ̎dv$ӏL���%�&/+
d�ԓ�oX7r�L�[v٬�������.�{�zк5��F��n��rq�Q��չ��\A™t��&���S�d^@���B'��j�Θ5�lҾ4:]����-fe�`C�)�ի��Oo�g(~BMn����Ƶ
gIa	z��u��ԛ���vZ�ܷ��3�0�T��o�5�aCM�[�����%n}�G��6Ew�:�*�<���K���Fv{��
;�47;��c1���P\����|�t�ai�8ĖgpyWOpU:$����m�m�I�9�o!k���������=�?խ����+�<)�;�N��;
O�%��	�	�O��t�y�âN��럸2'&W��D���qEo��?���s�,r�����?�k\dJ��w�5Sq:㏻�F��S���/��?N�J��lo�Qǫ��v>-���,�#�|~Z"�|bjug*LW�G�)��fRt�T
��h�wE�8y��:ǥ��K�/U5`�	�
j}Cd��8���UEQ�-�����:�B՘��⨒�Z�qzG��jO�J����O5ɏ~C(>����4UZ�	8��_T��\�G�w	�*��6��{$�
}C�Z�9��QB��No�N}�|�@&� ���6d���"ܣQ_.�h���2��ї�!�_�OW-�b޸�ub��N9��X����Rzh�Z����[��L�v��6�r���K�UJ��IY�cT4�5�d/���
�'@�
G��]��%	[�{~�� �ډ{�gk�����^"�����=A}�0�l��##ANn���㊗��6U�ƅ�EX��T9��Zhw/�4�
�T;������	Y�~��]����[-��c,�U��.�(�v[����:�� ���(��gO>L�7?1�=�m1x����ђT�LY�n��d�I�)R�����#T+��K>Pz��t�f�&i��Q�}�!l�8��ID���u?��Sr�)�ԭ�^���*1��2e����&��bWF+I�\�"S�XH�_���ӝ�5XyT�ڎ;��I�<'#�NA�!S��u.�'�6_�t�r��=��y��'v��i)7�.�H����6�
��Q&���nJ�����=q�����}�=�ן�N@ζ�t�bw�V���I����{ka�����i��hϦ���:>�z��|1�\��z�b�9�n��a^�z�fN�N?++��v�`o��)ޥ5��*eQ��C�8����Y��]���������U��B+�����_�o�FhR�7�3�/)�u.l���T��W\=�%�2�t4}��|>)�y~�(�*��
����S]������z�b;K���'#��w0����u�W�q��Cں*U�'���E��E��z��ZbY7�<����{/�
��s���@JsY�h�-��a�*����#��tG�Kɋ�S�#��O�Wu��/F��lF\;�KG�v� IҊ��5 %k����b����X�����P��',�cYi4>Z����C}\�x��8׵J�gQh�9�o�@�X��;;��E""�([���g|��>2���
D*)7�Υ>ry��@��rk��*�v;➻B�����&_X��cV(�.�	�w߫H�H2��p�!�ཞ�~$C�v|^��(+�<
uR�$*V����.�K�%H�4a�7�^�WY����fB�
�����|&yM�2AmBpt��(���� @��Ƨ�"����Y�,�mED㊋�$�]Џ�&M���Otgԅ�
~UDDH�q�&��"}.R��1��:�~����q[H��5*�
(��x8��>grVN��Mz�75�t�($ci��z(x�n�j;%�)�����	<B��f�a"?���W	-tY�[�A�l�q���3�Zu��)dX3���^���0g��4��dN�'޺
N�r1X0BYi4����.��|�V�Kk��;Y[��e~�K��4A��U#G	�Ay�u(\���d'��ꦝ�&�U��]��DvU7���
���'�ϣ<ws�,��	�#��:x~�������
���NKw�����N�V$!��;�<w.y�k���JY��z�Ru�(��!��_%�.T��U!LC�e�,��/�ٷݤ\�Hk'�,9�C���\LJʘ�@�TS�,+C��B�S��"!IQ�)Z��WƒǕV$h'2v&��C�
���M_��G ���e�K��G��&\z\�V��CC��v����|�`b�a�1�0{��]�6 �kf�h���Ҍ�ο��'�G+�3B�CTZЙ�i�'p,�"6H��"~7��S k��M�"��QL�ﻝ)U'�R�2���_��ӕ*�<�|doQ�v%��`R���>]�־9
 9�
 �)O�7��®~ʒ�^h�������n�:H
hYߐ���om�$k��fi�4|�(M����M4!��(Y4��8
�F�z"Fﰜbb�YrڰK}�i��m-}�#�T�\~7���.U��`��,�f�^)��d��q���Z�k�����%_V�iSZM~U��Wk��x�%m�B{���r�d�ZM�*ZM,�n�Ɛ��<�P��l�Z��$U��r�K�Am�ѡ(�(�� �VY������uR��Z��j�t6�H�PkJ����ZS��)gq��g�FK��7E�S)tX�%�[S�5�2���^Oe�ޔ�hEo��7��`-�4�q�f-���"�����T"ݎ5����T��5��6TS��y5�/i�T>�QS��
���U5���(EM�(EM�0EM�EMeEMew�:Ehs</�p�	ES����/�dܴ���)��KcE����m���mBs��_QT�QUT	N�(�L��QTy�U�Q5�t�(�ܬ(��~�����4�*��z��*^��r���d�
)��gj�W5�TY���W5U:sz��*���d3�5U.��ۅ�ok����_�R��PcT��Z*��q-�_B�5׸ZWr]U��Z*��M(����?LM��G5j*�]m��9ݸ�J�N��1{���5W��J�\Kj*����r��F�S��[QQiSTTNSU���QQ�pͨ�&TT"@�**�kTT��UT6�;�y�J�F%��7��r�"�Sd�p+NAQ����9�J*�\���#�(Z*��Z*���Z*�\mAK�g��R	ɯ)-�]~V���Z*�OC-�7J�%-��8)�T
Ŕ��J(�Z*۴�h��+�T.k�i���|�Gi]��򩫍�TF)�T��R)����^_��JtDB�
,ҥ�1�n�k�4�
6���Ui?���B�
,>�ҲM�؍�V�Q4�<����if;	z�2���	~"?qߒ>xw��K{�v���jH��mm����9�����KYu�r0PYYuFպ����h�!a��q�O5��&�U�E�]�ϫc�A�	�3Z��2w�;��K�Z%H��b�|�y����d�m�ۍ�a$�������r0��t&]��Jw�P�:,��O�w�v(�^t����Z}H|�R6RL,\5�̑&qC�4�M�n�h4��������Ψ���'�;K��s/g*��p�x�5���:�W"�{�o�^'h@�@H��pZ'���'"m1��]�⚢��/�H^�>�np��SW�阔Le0U.��	�V5�J!�\#��َۇ)7�b�h��!1!Iz�wH̺PmH���31�"�48>�n�!�Ӫo��[ܤ�Y������|�x�i���DW�\�k��b�9�:����{m~16CL3X8|�yHyu'�47_���e���)��/mOS�?�4K
���"�U	�O�/Y�?��3����y�Kow�I`�g~p����6Te?<�X�L�}XVk鯫 �̨�{��."�{:g��c
*�Ʈ��S��"my;Bi6e����!�J?%�N�g]�
�d��ڋ����
q��3��cs��O�dz�Hw<�\�'f�X�o#�����WYs��̄�j�H�&�i?��/�U]ct<�d�^g��Xl`�P��q$r,�JB�u��(���T{�Xj���"�Ǚ������2�H��5Q&ı�\�pq�OP�3�çRD�n's��2�׼�0Oxy�8��RpḪ�T��ݬ����R�|E�N�m��~�vA��[v���a�;�^����Qn�H�_V|��,<%s���'��	�I�06�T�ڥ$u;��ٸ����T�ϖOH�=p�M�ȵ��MQ��c�S��$�X�#��O~�nj����O^�Bj��`�Ƕ;]�+$��X�IC��E�/:�1ں�������fpv.����k'<m��:�G��6��u��1G�_���Îo����RQ�8���n{�U�Q��y�Pj�p�M�S��J����t���t����)��ӟ���O*�%ŜR�,u��Yb�7��q���(�{c)����:�����M�M�mFJ�Mrb���b�Rz~������R>6ѨӢX}MW�H �^��!\��Q��{���������e$�X �`�����te�'$:g��OV�{S[ǰ��R�co0���U�)�������@�t�X���
��G&HٵF�R5M�kntw�#bP���b��mqa�4c�|���M���_�n�m]p�	NI�kG��7�>
�m���R�&��t�qmyY$�՟�ڦ��ŕZٛ�o�\��m�Еu+6�;�[��kg��T�z\:�t�߫kd�#�UR�:P�mqa>�V�
���엒�Y�i�B��r�^��ZI��`��:�N����X'����N��9�Bs����Q��^0�rp�t�l�)���$�����2}e�d�J����j�5�d�׶	!��a�=�ˆ���䕇{^[Kéz6����$'��k1�
��l!?����͘�,L�����Ӎ�2\^f����;�]��Ri)Q�!M$m;�&��ށ�������}�`��?F�oƗ�u��_���^D��W\��b,����o��Rd���e�7�$f:�Aх\�<�%
i�Q^��	҈Rw��K��%K+n0��=\MȞ2��t���g�/��t���	ɼ�t��7:�/p�n��P��W͔�����`*&�uQ����{����0o�y�k�6:�A�OV4�
.U�(�VLU0�(Y;a^�q��q�]����(9�pa}�^I�L����NcI*r�\W����~=�g���䓄Gz
��=?Z�7��*���h�?F�7�O�|]��O�X2Iם�0ܞuS���zG�)z�=C��M~��ߩeQ��~�柘�[yu�r��w�I]inጒ���3Xt���Dф�y(��!���m�8�\�\�㲝�O��:��
�ېH����$NPuJ2.!�B��o�0
���`3��$�����Bj8�|Q�"��U窱�p�L\d�|�R؆�E���Ss?��GU���qm���0*�J��$B��m���Uuv8>����5])�e�_b}�'�ջT�%�`&r�.���P���Ψ��۝�/@��mR�;yiҽ��e�ބko��5J
:��&	���I���:�?�U��^��&�u�%�֊`����@��d������%�C�K��;��$�2���/Lf����G��]���.o_�͒�u��W�k躴�C�j�8U_Tݶާ�gq)l����3��ч�3��Ls�Q\9:�ݥ��!|
h;�D�A|د��7a5�Q�ҷ�T7E{���N�j�N���)�K}On��n�������]鋛[�@)��q��6��i�K���}�o�����B��|���P�Q�����P�
�뼇f��ž��(��u�(����o�طS"�M���Գ�m�aHw�WwDZ�:d�"�f�I�N����6�b��qU
� �M���@�Lv�B��K�9NU��c�T{�=)K�����d��D�e�LH�>�!l&C�L!��t6ssH��- a3wqy̅�t>Т�2�X����o(�c�!����h�+�)+�++򋵟u�4�i�X�ak��yKY���Hc?��CO[+�;.�~i�̔�oa�3�`�\��7/�E��$m??�
g�'?��!�f�i��赎e[�,]F'��Y���D��펅�V;q:��45���u���{
N�%�߉=�1j%}��%��xA�!O�°lA�0���ؕ�}�/ܕޝ��a3�@xR2��w�Nf�.�#I��Vd�A~I�R�8U�m�&���JLUυ�^%���f�-}M������s�}[�Z�c�׺��۱S�إ��{ķ�=<���l�d�9ℽ
�`<�g�	[+l
q�ǥ/\� j�#[��AD�3��F�@��@�Z6_l��(�>�O�Uq�~mvC[���n�tr�K�tR��:-���l;�yxy�>k(��>�/<;H�����O�7�حwD���`#�{G	j��XG�@�����U�N$x�`#�m!('8BPC��O�n'���^�+�� �������ԙ�%0L$�I�M�A	����$8N�#AA�.:֗` �]��	
V������#�#���$J0�`"A��e�\��XLte��Ew]���̞I0�9�����,c���W��������}��]���k�D�e�j��G
gs�/��'�Il,�B5�!l8�cQ"����"�x)\��o�G#(~�����g����vY��1�>H�R\K�1����B�Y(���kn��\V��m<�����Hf�hC���%�'w<�d�V�=���y�Q�L���d�=BTJ�J!��K�x�.2�*�*^*>*j�j�r>�y���y�� �TJ�N~iJ����[��׸%S:i��z�IJ�O8�h�$
ܴ既9?55m5=55>���7oD�`�4z����BzX|����AE&	T����9�y�-�r��-p��ϱ�šhɳ����|$�l�F�=GTdx�5S�a�u��?�l�=�*�I�V��#]����Ҡx��#.��T�ݚ�*�k��Ivk��lI˱(/��->7G8$�3Ն�����0�gwS��H�E-.��G�A]:���k�X`&ZlI��va���gg��Qۼ��S���chպ�o�vF��7u����[�;w�ڭ��=z��اo���n�?`�C�:l���a#L#G�5�>&"2j��ػ����0ab��I�S��;m���)�Rg�I�����̺/{^Nn��|��`����iQ��"�k�Z�iK��α�����!ް�X��4j�����<r��*�:ڲ�
_�Q{J�?m�7�z�{ظ&|�&�O��M�O��m0�v�p@a�	��@ z��sXD�����j҄[�Hs��A��-U�r�~}�]����7UP] R�O���'��e��phU�E�����3�b�
l�<(7�H��osE��ˣ�lw9Ł�#��S�G���!�te�A�����{!L.Q ���e�RE�j9
��,ѧ��`A��ϡ7+�M�8`�'my�6YR9Gp���[.�1#N�I3���w}�P��QZs���!���Q�WN=�L�Z��d�y�m�ϐ_���ۢ)�Jg�R/V��\¹��Ж�|ј��n:T��rk���F�� �B�o5:[)ŖJe�Դ���;�o����v�T~�G~�Ҵߙ�0w~y���n��
	i4�rԶX�����߁�H���)%����Z��!,��Υ�,
�r{�U��nl:݆|l��eS��g�����+��Sz�L��"�4wp߯��{��aNi��S���t��!�4W�C��G3Ę $^Kn��=��ύ�2���w[�k���Ӆ��\M1�:����EȭGq��=S��S�p��w9NZ����9Ѭkf�'3�X��t�,Bd��5-?2�ý��n�;��N&4o��bf��L ��'~1��d摉�Kȼ�ͬ��dB��Tkƕ-�������!�c	� 2��h��R5�/چU��A[���^!��_�\C�*�l����_Z+�0P�16R�?r�Lj�2�ʱ��}�4���]J�4�!��"z���6B�$fL���DA9��l�z�_Ge�<�����>**�ϰ���&L�1�;NN�B
@�1ì�Y�0� o=
�|��@���|������]�M5��_I
C,��n�O�����Ը����s}�f�Os����F�����z�w�~�~�u�?���IV�n�~������E\�Ê�,u��>��2�r׊���Z��G��c��Y�ēO=��g֭v�s�텍/�������?7����-[_�ƛo��λ�_^��r�;w�����}�?:p��LJ?��Ϗ|q���/�����o�=u��索���dz5�~:�狗j/�r���5�o/L4��pC���o�_j�����6J�؝�z��Ǝ�T�a���ƾJc_���YcDcǥd�}���e����1�qu�,93'-w~�-Ֆ������Y�9����\�<�,ljKͷ�ϱeXr��y�M~��a�b�\˘��l2K+����x?X���1��\Z��ˋ$���R*�������T�/4!���,��k4 �xY1�b$�edd>�����5�ðsp�ptr�2��f
��5�l����c�se�ul�-5;�b��Z2s�S�9s2,�}�E�X9G��lKZ�-7 7ϒ`Y`�c�����"��X�N�����G��(<V���j�X-�i���yZDg�{b�"�����B&c&�csg^�j
��n�.�̙�.��?�b�i�Y�-��J��egΑC�>�/�nkړ��P�������Qf�6�&�戵�|&�|�3�~T���O��l��S_�s-6*�L[���4K@nz@���;P̱�=�A"M+��Eʃ��%��y��rjr�PZ�楒�j%D��o �c?��3,�S�1;3�Bu���d�32m����9���t���o�=�:hvf� KNA?5b#~���D3��9�,96wF
�X�e椊J��X���,TǍ�j
���{�X;��\�w�4����ϴe�
�m�V��e��3A����S�ۙ6�a�,�ʵ��|�5y���קۯw��T{pJ�����_�~D[vv�|$�؍ѹ>N����Y��Q��A��)2�,��lok9���R
Ӥb�%��@eXQ�,�r�Y/���r���&ܰ���(!�1��1ebbd����ۖ5 zI�I��foA�1�H��$�ԅ�i����?=?s^^�%E�G��e�ۦ�B���6[�Ǫ0�6Q'g^�48H��T��t5���n-�O�۲��~-�����в�A-��n�O�3�bHC�����r���5�>�����H#�N��n{���8��I�~�j���-��2��[�g����9�f�J���O�[��\Բ��Z�s�3͗k�:�{]��Yږ����1������p[�o�l�厖�+���;~��w#�/>���t"{vG��}:κԐlܩ��)r�>ǚ|�{��?s֨�N�U�����G#X2�O�@ NH�e$���M;!IV����,��d�E������V+
�j���ɩ�����Dȳ-Jܹ2�b���9��ٖ�5;�bc7��̹9J
�r�d3uc"���y��H��:z�k|n�=�2�$�{R�!�� �7I�\�x{�-s�B�eRnrf�%"#������X�N��ES�af���Ȣ0=alJLC���$���%�D������5�8�Ӳ�s1��D'
	�$�$�(]��J�1D���n��6���#���#$l����E~dQ9$�EX3m�Hv"Q��&󌳤X�sϔi�R�MZ��\l�/��H�!�`z�ʰ��rX?9'C��`�%!�6��<�Rk��3&?�2�>w�Ś`��Q����!tS�3h�xxNZb^fND���@4CZM����C�Ҽ��'ڲ'琠��Z�:�Y��5t�����B�ϒ�3�j�'��Z�N	�����؝(��Q�&:��4�����$�Y�]����ƛ���N��
���m�s�V�Qz�@�'e`.CS�(e�!<-�*j��W2��`0��4��c�
�P�l��$���P$���d��vۼ�O̶X��ϸ�xb
�?�<'&"3���`U����@^T��K�G�Q�ƛ�`�o��B�{�
xR��U��֟`�
6͙#�IY?�T&eιO���~��o��a��2oR&�/J�l�a���C2���Jmc�5պ�p�X��D�\�O��G��#^ּ!T2ɺ���$6ƞ�N�;c��4}���H�,�:ւ�j�]�1j�y�V��ܓ[S~I��LLc�Y��6>]��X��)`M�ܺ����(s��mr����?�c�ݦN���>,��u�;7�q����t�w�_�~����T^�TL������'��}�uw&����b�V��h�nV��4*�)n8r�p喝S�Õ��=A�3QqOT�d%��J�ي�<��.6Α�L�U��[	_��D1�*�ſDIg5N^�Uy_������6�����,�2��>~�>�@��������Lٿ�Ͷ�]����uP���Y!����9�g-]�����es�����n��ban���nh&�%�dӬ�[o0|�b�N�<{��.��ҳӚO�za�@Ȅ�3����YG�>��#_���ؐ�rL���Ϗ���"	�#	B	�&" �'�%`����Dp���q�#�$�G��`A9�;[6�#X��_E�����F�M0�`AA���?AA+}���O�~FP{��j$�#�	� x�`A1A6A�t�Iq�#	��'$�FБ����'J��8�����;�|�`#��%y�	&���ԝ3|[�/��'��?�]Ǯ�W+��F]8��6��� ���pƕ�eO�^ܚ�[����[ݛ������?�v�̣��<j|3I��	��'��z��6�������`�ӯC�����mG������Iu_������|v�S̷�h:Ҏ��J1�\���&����u�y�L�;H&�%21O�@Ũ21�k��N�(�n���j��
�hݗ5㾦��͸�ь��f܏4�.5Ꮁ���
�uL��;�Z�I�1�+������FC�{y��exտ�ȿO������W����^_�~���Z}����ݫ���`���k�8p 7nKNNf����n��U\L��l͚5�^`o��&+//g��9�v�S�n�L/��&��+�e�]����ٺbߺ��-B��|_���y�w�����>>ޥ����R�:��҅��E5�3��T��0�"~zz��^����إ������~��0Er��{�%~߾;e�K"�����N�s�:�MY����������/�[��n�E���k��P��lJ�޽���� �Q>�#�X��,G�:l���;���;@!V��u/>1$T �k�x���DX��	�k)�X �?�0i_m݁�r��W'�_['��ʷ�Z.�E�#	I�Fx�g��-����̰LydoVף��g�hb��$�3��itJ8m���@/f:O#A>�Sx��|�С,>>�%&&�x���Z�����g[�l<��g��ӧO��<�-��ݴ�5�?����gE�}?��\VDU��>�E�W�'�W���)���诧�q~%�p��ɓ'��7�%2S<�[S�bg���MNaE|�['#�7W"�"�u��&&��O�-�у�����S��a|0��22�rjy��O�>,88�
<��5�������Qv&L`IIIl�ԩlƌlq�X6w�\�����͛ǬV��?
�z�h������&��V���
gOZ���%#�?�c�Kf�mk��·�f7�ǂ��vΆ��l�Ά}��ȏ8�����O8��(g��,�`�7�M���9'8�}��%K�0���V�^��q�v�Z��SO�u�ֱ�^��M��֭[E_��;�Õ���s�m���>`{��a���g�b�|�	;z�(���/���G��8;y���*v����˜��԰K�.	^��1�ƇƼ�i�kM|ӆ{;j��&6�a��������l+�}���)�H�{Q��ŏ��S)�\����g�)�S��_N�?���4�R|3ſ���(�J��"��N�Q�#�+��-ů��g)�EM�A}K��OM�W�۴���/ҘVI�����?u?�?�f��U�/j�w���(�`�ŏ���VM&�_H�S��)�?)~�����'�#��r	�ZQ|�W�����p�wQ�����8������ڱv�ٞl�f;� ίa1�����!y�Ox��b|�k�����C_k�P��?��Ϧ�(�J����L�ߣ��(>�8�?M�k��S
wS
���C����J�$�PӞ���pvag����j�.��ٕC��+�@�GS���/���(�Z��7����o��(�q�_��oPJ���J�{R���?ſ��O���S��o�}�T��"?Z���1�c��>��=�O`�^}ǹ}�����DF�F��2 �_�>���VS��!o��!KddJ�m0n\��;����=&<�?��ӫ��o�
������k`���Rꑌ��U��]�oI8PN!�Wπ���ҏ���ҽCg�AJ��)t8"GĦt�С��/p�@HƸ�O�ԱC��G��"@�ď��o8�;v�~��Z��ȁ⧌��'66*6����-7���v�C��ߥA��#��cbc��{4@��n鏉������{k�NJ��4 ���G�,�RK�J���⩈�b�"��	���!f�Kit;�C���2�;�<(�2���o;V����a�2��O�<�� ��X�=F�����5xtJ|J|L��e��]1C�D��Zߣx��b"�+51)a��Zy�t�	C�;���?��a�CZyn�!ψ1��C�FD����	oj��5��)H=&�>��oj��c��hb�XV��!3�i�n|JD�h�c���'گ}X|8�c���G
or�3$���[�J?�1&j؈Fޚ�hb�G4�f�
��Fޜ���G� A����犚�&e�b6��<ײ���s'N��b�8���‚�ز�(����,�b��X���M2�sџs��,3, ��cO>�${������s�='d�͛7y���§�/�'I��D�Ž;�G}$d�S�|;��v��)V]]�Μ9�~:wV�?��3�z�*[}��W��M?;��I��Ush�[H��4����[����w���a��g���4~�h�Ӏ�@3�<lW����)����R�i�~�����F�P��q�r��[�.JХK�u�Y��v��3h� ���Х������k��V�ν�����gP{?�mm�K���Q�~=
f�z�4�{�A�)@��mo�ֳOР6��nU�nd0�Q��nj׶��-�jc0�n���{���E����m��0ȯG'�O�Ax���B�7�{t��6�[�jL�g����ȗ�t�w�?�[�~��
�MU������=�}��jϞ�N]����X��T���z�&��Dy}�h�AZ�go�Q�txk�K��=[�G(:����
�g�}[�jE=�P�L%%T�PO!�a�%�G=�J��7�����3�$Ӹ�ٳg����������_���…gi^z����ڵ˥��G�9H��_IGRP���P��o�۷oo2QV�n0���i�F���]?���i���}����sO�g�}�*���_s�s�
���/%I�"ZO~������(3fL��	Gpna��zm��� �鎰����������q�;Sy�68i�y�}��%�����o��	?��o�O�>Ϳ��;~��A~��!qHF��)��̫��Z�m۶B٢����ȕ+W&�\
�p<(��[n	q:���q�(;���� ��[�?�<'Yfu�޽�Q���xyy���8�����'Տ��'N�cǎ�wФ�<�$��p�ܹZ�+����/��~���~���~�5�u��G��
#V"�oş�)���hPu��W�P�*4�E��
T�nк~����+�{O����۷��G�up��I��&�
�����6P0Qoh;��w�^�?��?G=\�v�kz�B�u�6|�o���ŋ��!�����}����~���os�sN2�h�(�Ǟ={�ݻw��r��a
��oh'�#���[�r>�#·��|��G���O�����S[�[��V#~%���A�E��\A��Î��ꫯ��2Gy_�h�(��g8���s�ǜ�p~�>�Cv
;8��h�.���|�q����-�S_�ூZ*��v�v~I���qG8����4P��DC��_��<���soM���.]/�		�E�P�������cSt��Q�#�
��.��B�	����4�����D�0⛼#2���9|Gn7�?�\��4q@�:Q�劺_�7T:��g�{��D���x��{��X���4�:�y�~�����o�<�ߎ?�ū���3��a%������7�_(�c\@<�3�'��Q��%�1DCѰ�_�F�sO4���˗9�3
4����T�4EǕ+W��7���/��O�?�?�kH�瓿�|�	��A�J{&����=r{F��=�=xGn����k��C��E�y	��4�|�nL�Jx|�-���#��(���
xfTq>U�!�k����/4�4(�y �$�S�P�ԓh��ܷҳ�)�{�����1�_Wh�Ժ@{��J�~��?��_Z8��m�(�,��4р'����D��c�72
j{
j{F�4d�{%緁*��7����|���������ڜJ�Jh�x�o�[���W�d�'�'��d���r>��h�8O>-�g�I����3hP�3hP�3����E2��v���,7���TQi���(���h�q�P0��\������a�D��=�*�9���'���g�O�G4�~��~I�O�aÆ�"���_�	�
�yTZ�V����2�������D�?���D�;ks���U7��T��NB�����k�*��1�/�B�W�
܀�J�~�נ��X��
�{KC��D���#��E&�2�и=�����������e��17��Er��^���
Zc�"c4�?����	���x�N��x�u�>^+c����ew�w��7��-�D��g��B�Z��U�!k(�hH��Ӣ
x�'����>h���g`�ظq#饗8�"�u�R;�z�*?��T^ḓ���h����h��Ҟ�'���ş�����������E4<H4,%
�<�e������?��������_~Y�s#t�� �th3�^r'/'�&D{&�'��y�IOYG�����a%Ѱ�h(%>Zbz�>)\#cl�n���*��L����-[��MCc:Z����:~��	�����#������4�9��'�L|��p�̔i�#d����^��{�Og�9���'L�����!pE{DX�x��A�_�V'0Ѧϱ�z>��[�@{.S�s��E����Q��_�d���

�4�DGKu�}Җ�7О��&����(�U�VUP�����SRR���?�1.���s���W�X!��_~)��BM��16���,y�<h��f�u��|cC��=�2�Z�=����k����;F�u&��0`xzzzNZZZ5����}�Y>~�x�������c�=�}�Q��4`,�8�ҁ9h@
>�X�<v�"��/�����
�e�Y�@{F��Ăx����#G:��㗀��WӼ�֭[_�6�ɏ/X��S��x����~�u��Z���y�:��ڴh�T��b���o�3����	{t�ڵby+m��I޻wo~�m�q��.�mC�A�ƴ�Sj��[�?=��Sj��Y�10>�T��=2��:���χ��ox�a͚5�����ի�ҥK���{yvv�(w�W
^
h����ƴ`
�0�c4�
�#0��d$�hi�!�/�2���?�Lmw]^^���ӟ����dh�*
��~;�?����ڎJ���/�0��F��w��ڹ���7���m�����/Y������X�h�"Q���3�O�2E��@�
�A��b.�|<a��@��� S!<�%�e˖�1��=��7�%�7�
xa��n�����f38p���#Nc:��-�m�&���
�1�N]� ���v���{����{Q��=����
�}RSSy\\���{N�F�������)��6����EL�_�tJ����T���ر7b���F�G�Z�G-W��ꖓl�SŢ=P}s�7��P�ju=�(���k���_y�1���P�TN�m3h�\D�o'�����q��7B~�������J����.�o�Y�S!K̛7O���������!��%�|�:@����`G��#��s�_���A��kyU��Z�n�<����Cq��8�}��
��~}��D���y��1������W�*�Р��Mс�FDc��'��0�6��/�Gݨ2�u���%�9������-���h<�6�&�اO���q���rW�K�u�c��ɵO�����_{V�/1�u���:�GZ:P����:�'?�m�յy�MxϨ��g��������_;.je�l�R�֭['�.�m��������|�������\�}	���D��D����ߡn�zP��Pg苰��=(��)���ϴ��v�G�K�T'��!���r�̝;w�~e��
~�hď�������O��@�N�/��0v��1�D٣�]���磯E?Fs
��A4�Ѹ���-�ys���௮[��A#x�������.0�x����0 �{�CT��b\ޟ?����k���?����$�lz*�N1�d���ɷX1����˦N1=�G1���C1G+f�br��l��N���(��Z���G���b��"ޱ��x=��y���;��X��2��H��q�� swb>E�_�r^�
�џ�{lXƞ���O����~���h����u'���6]���dΟ����~��KGI>�d�,���
��^$o��{J�'�Z(��L�Z�'�9?p���;D�?��w��7P���t����~����S�{��ͷ�0�L�߈}.�`Mk��^��O7�����ҥKS}��$��	�����1���,9~��&��b���X�����k�c@s��/d��{�s�/�h��:�ܤ}�_v��~�ʶ�4�t��9ۈD�ڳ��<�L0~���Q��#I�c�T�g����}��o�}_�����?�}Ƒd~ڐ'{`L��k*ɹI�s������k�50�cM^�0�y��m���{m��?b�
{��'��WDݭ�q��9���Y�nU��	���b-�XG�揽W�'7�G��G��>�1��ߕ�5�?ڽ����&ebC��{��|ɹ�8����he�4D��F�t"�'��]�6I����ă�6��bk¯?���{�?�¹�puH�kC��~�6�.�)**������,�`}{M�P���τ�P�#�����P��͑ᱥ������x/��0���b�{EX��ڸʏX�
�&���a�X��8
?��װ�!�9��ԧ�z*	m�}����`~�!S�b�
�/)k��(�h��^a�%�]x�}4�n�������P����`^���}������O���M��s�6�}&��OV��G�#�;����_�����]{\UU��(�d�4j�d�$��k�}�{�s�E�1���(7A�����#�,��h��!��Ӑ�Yڔ�N֤%MV>���1���Z��Y}~��9�垳�>k��]�}�A��a��a��t��ѡ�/�5��̈́1�_�56h��H���ɫV���!��q^\��q /��;lX��4�{��!yl k?���cO�6m�c�=��|X�p��{��h��Q�(�H�a���'���>yt�
ÿ����}�)��.��+��\���0onp.^[���9<s����1�{y\�?�����y����8n�kӁ@ 8o�<7��1yX�a%���쉿�^=.�}F����ǒ)}�K'��9^��R*={��������5z���	!�q�ƹy���/�A��o俷��q�MƆ}�y�l���׭[�!��n���2X[?+����}�\�s��qom%t����?����%b�8>>�Ϳ�&N����x2��=y;q1##c,�r�H�`7�׊�"�W��E���{�ƃ9�!C�q.��v��^�|���[#�[u��G���S��G6��"�?����s�(��KǺ�G�:��^�cA^ n#f�8_y啅��V�p����0y���C����0v��`�.]�p������r���K����-1[��.}���3cƌ��?�ɣ�G��ˆ#�3���
y��x�_ƚ
��p+~�z�W��$�egg�؀kU��"���1�СC�~&m�>��q����7o�\���#6b�ɫ)�B�.}���_�%�_�G���8�1�q`�����['�Ki��OɁ"� ��<������^���O~i�gM��u-|�j�Q�T�\��-�zf�᳻���+�_���F^u�`#���c�KJJ�
uz�ڵK֭[w���>�6l���	]�fM|qqq�ƍ��l�3��{
��zڮ]�0�-�Q
�w�cc��M���n����Oܮ*���\�i��<��)IJ?����?}����c�`�����D
}��Su1p�W�e���cb���{���˥��Yu�aʥ�	�G�_1V�X�@���k����Q�����]�,�`�����8�^�a܇q�	q'�0�S���a��▥�>�/����`c6��� o
�g�q�-���C_}]�7�V�u���#Ɓ�7l�0�΍�|�޳:���v�I���oǸc��i�\�>
�_�/_��F�j8�(/W��w��~��z�ov+�삋[X���-Ŷ9_��>��c�Y��9o�Q��QNq.��q���K���s��������[�뫪�\_�[����>��iñ��h��?��Ϳ�&	�B;���a��}#.�����8n�y��"�'�٘O�k1�F۽gϞˮŖߤ,&_�K��G�&����__dd�����;��p��F>�gw����pWb��{����C'�i�W�Όt�Y��ҙ��.kM|VrNNZ��)��33���Qy��ENJzZfrN��@JvVN֘�n)Y�"9'��$��<>0&-'whZvN k�E��(ټid������}�'���]W椥�er�\���N��T�R��ic�r�l�u�e{0���Ii��ӎJΉ?)k\ZvTd^ &_#aG�I��I��V��\�=�W�n��l�V�����V��21&1&66~@���K\������gMI�����RCΓڙ��0�Φ�7Y3���Y�<�d)k��^�#��H�Pu���5O}Z-S���T�VkZg��v�6^���y�3�*�\��^�n���_������
b�5�6��3�7F�he�0{�S�U�&�ّg�����'��b��!���D�����z��k����v�=W2'��Lr�:U��g�9��:��G��m�#a�!)$�� �H	y�|K�ҖԠchvD{T����at46����wX}���~�]��}�n"�%V"�!�0R@֒
�
y�!���W#O�$��>MW�RږE�hօQf0��6��ϒ���dV�
�R�,+f�V���#Vþ`���9p��&�Z�V���]Ԙ�K�Ч����j}���f�Ƹ`������C�3`�3w���ߘ��%|��	\�7�5�?��Ӛn��y���Q.��Hk�PQ7��R�-����Ѽ3��)�x,O�O�|���b��í��}V��eM���Y��7��bG����v��JR9U~.Ü��\g������|��:�҄8��I4�NTb�^�^2��^�%����O�;���fc�e��_�����Ֆ g�jw0���ޣާ�Pj�:M���O�/�o�gUE�Z�в�Y�J�5[�?�����F+��et6z�a���D#�H62�l��t��1��X��x��m�7G��F��Q�j65[����{�p~+��y���Ϗ��^��F-z�>"Q<$��t�xB��c �����a&F�Y������lk������n�n}k��w��qv����L��2^f�\����9��{�iΓN�󞃛0���@ڐ�$@��3 ӛȧ�4�@j�8:�.���-�0=FC�-�VցY��MIT��*���ʍj���ԑ���b�Y��w�[�4��^��F�y��h'*�q�n�iw���_ڣal���4n���+If�j:��S�2J٩P�P����\�W�
o+�����У4��r�\'��C򔌀�à��GI;��%�k�j�.�c�q?Ϳ��������?�7.�Y^#+������NG����9�;gQ�ս3�&��1d	�,����nTZ*���Te��G���R]��P�X�N��'����U�1�g47��An4c�1Fs;_�om�)��"K� �R{��;ʾ2Q����9�P\���t�I&+�fRI���t%m�z0�u�Ǝ���^�|�R{�qj���.��wc
�y���3�ڿ�Ʋ��[r� �m�\*�����<#C��N�c �r����r��қ���v4�)�>N����
Zش���rz��X(c�X6�Ζ�"V�ֳ2�;�:+DQS���J��$(O)+�b�TY��V���,�	u��R-Q+ԏ���3����<m���6[{\[�k!zS=\_�?������dL2�h���-�;��
:��h&���t3ۜl>j�7�2���`���̛y'^&�������?�?���io�"�|B�v�|X�
!���Q�U�@v��W�WAڛ���R5�6hoh������H+�*d\��x����n-�s���i���M��"��k�8�`�@��Rt����<v�]�+���	8T�y�״�Z�V��ZPk���}�^�k�m�as4���_(���b����(�����폶��X��vy+��*yRnu|�u�}� Ȟ����v�X��M���Fq����D=L��4�N����Τ/ӝt���<,������E�4sZ9�NWGu,'�Ip;ÝT'e|Z\�[�,r|�!�$���#�dYv�	�h'@�t:$�
@�Zz��yNb�`ي�NV�|`�"]�X^xP��o�bV42��F���Nf'ޕ�r�[�'X�8�Vg0O��(�����s�d>��|/��|إb^���2^�_�/�N���9ȫy
`�I^���\�>*�D3.Z�6�g����$�
"T�dK��"N$rIb�%RE��D.X�i���qB|����ɟ28�<՟��W�5�	��퓡2L6�Ვl#��H�A�Ғ=e���	��e�.�e�� s�d9Mșr��2�ޮ���z�ޮ��e�?PKEePQy!s���pip/_vendor/distlib/t64.exe�y|U�0ܝN'M�Y�h�Q0���$6h�tK�t$*h� h0���P-0"$V�L�;=��3�����<:�����3��–��Dq��@H��{ι՝fq�y��>~������g��*�w��b2���O�M�z�Wh��T�:q�P�߇칤���sɼ%��pVV-��ǜ�<��r��CΪ���Gwz���|l�⇮��Lsu�|�'��o��؟��/�z�����t����u����&Fy�ɛ(�%#�ό���Gʗ`}���xM���O1=}�ٲXZ��RSzR��t���Z��;��ɸO2���c���I4i�P�_aM�P�r��9����2�fЍ���n0�Ƨ'�n�it ����g6�'}�۫�V�p����!{�y�&Ӣ��? ?k|�Ӕo�	;�_!���g3M|�F�u���|
WU�4F�)�3.�WxUՊ�r��9��1�W�b�Z�2ފ�k�ka���f}�L����_�-�}��i/e��8��Ò
&�Y�;�l��K�+R�l�f�g_�(���K�+W
{\N�'�J�p��@ZDZ$E�f��g�L�p]tdžoL��M�wG���f^B���͚E��a��Y4&��x�M)\�Ia�e�[R;��o��vJbG��Y�?2댰������l�U
5����(�^�m�	��}z�/2{
�h�]�k�X��lw.ll'K
�q9����]��;��Y��^���Vށ��|o���C��"�"�j�w�E�Y��1���<0Ƥ�N���Y*�W���7��1��d� ���5����D[�2oI6c���kV�Y0�l��:�/��.�D�I7�2_�
j/�}9g%���`*�t��v��x��( ��!(�3��F���c��ύ�{��U��Fw[:��ɺ�g��g�к�����_��\��@-���a0oMG^��{X��6�N�m�Y���NM	
e򆰕�C+�P�5U���!9`-f_hX[�9��N�;P���5���ĮO�Jo������
u�zx]!X��O q�1�R�Ғ��a��U�c�}�\[�OI>vP\(�/.��r�jnL����W!4-R
�J�L�}�A�&n½]���6�3E
/s9uǵ��a� L�V�
��x��y�%��J��pm�#�R?�:���5���.��]
���ý����x�bCz�f�F�u��HI�'Ҹi��+��k|_J�����_R&�Z`g#5ۂ�QGZ�l��ރS��.'l�6�˺����?p����qs��Y���TO�3�e��c�'��:u�5P��:�l�҄���H��K�7\�}�5���nz�*7�*	A����k�S4\Wo��i��K�9)�<�v������jָJ0[ �0��q�`��������r��U�;9���)de�jd���u���D}�~�y���ÔU.!�<�����wz���7��̺c�Ԋ���L�<�|��-e��g�L��LKy��S���[H܌�i�܂��9ā��3*�Tz�<�B	.߄��&������6躓��P��˫;DMFV@�"=�!���#8�]�M����Ql��:כjhi�kSǟ�u�A��*�i[��6CfO�C�"���T�	C{�}R�Ҭ�I��X�ӛ����e4���|��R_�"�x���6�\�b3 @�#�ͱU�T('/�'�l��i�{��+��̱鎞C�2��R耜�x�E�MԵ_@F�>�*nWˇ�0�o!=�Ӏt���ie�P7����Gd*��2���ރٕ�$#{f��}S%�q���2y�P���V��&)MI�bR�+�����
Ox�Dr�<�Ϥ�ր� .��Z�r󥁩��R�)�Jd�Ԍ�c5)-I�=��7�`��!5�P�M�T3X�߱�g����"�!����˻9+�H��yb�&�Y*`�_H���K-�f͈c�8y�-\�����aU� 폼����K��G�^�#Rr�}	H�RBEA�l���R��vIiH��%}^�'RaC �L[�P��,I�F�����è�C}ʎ$N� �A��V�"�����ۙy��!C]שp���ͧp#)�`Z#��WW��k�j���M%�$�5 ���D�ۋp�`�@t��Z1�� S���4Io�ܭU_k�P>����)��q@A��7��9�gM0�Mѳ���L�Z9�����kT�(��
�
T��5%�9%�2�8,�;��v��!+7T��I4���[�P�f�f{l�[`�Si���%T�q�Ĭ��)�H���A���ic�*RX��^���gk\�lo1��Jc>‹��#�`��E��n��[|��H!�&f3Ύ:#�K���;G�1�5!p���3r���}I8y��M�ԏbTF�ķ8�7H�MR�Y��`+�${t��D��
&�5��6����)I�8����R�>D��6z>ϒ��4�R�K�G_�̖
p�nN"����B��f������9�G2�Y'��z&֏L�?�_-H�{���h�����ؿ�
ab��ɝ��2`��I�����F]$o����= 5�6迁��#&ak^�ͥo���Bm³
�(���M�g�lk�$��h�	Q0��<����
��W�0��s���ϙ�TG�[!�U�K�I�jQ0x)��$oؐנMŋ�H\���q^�M��DT���!����B�
�D��c�;%�>�#�P����M���"�gM���WS�$��� �J��S��B��y_�nmH�{�<LRa�q|	�d�56�5߅x�fU��ÅY��伓�['�P
�t�W]�˷�YVZumf0&�);\�x܀+o������%b��v�&������IFN/l!��(���o���F�e��h6!7�Ƨ��F�/_B��;�@�s�f��86�����Y��_'��
 Av��.!nXNW�;X�°
��s�Uh� cg`�z��xEv�mh����Xm=�ͱIn�Y�@�Q����u+Б�M�q#�k��T�LE6y�Ċ쬖�e>�ن���T�
_�R
I��
�Ij.�2ѱ'֙��iK`�*A�]��!�܌��|O�l{1
;��QcՇ��<�^L����S��V��}�Ąe��
�Gn�r����7U(�Ū4��wer���D��SR?%58��ȅ��+�]r�v-0+���70�@�A��R?�YEv�(����Xj7 r��)�ѓ<)�rX�\�8'g�����F����$!��>�Ml�N?{��zK>��J��{�'��1~._�9	u#��Q��Q5:�j�PNQ�)J���)ے|z+��
��S�.�m��rZp�J`���Ac�K����r�{�.���$�{���̴RN��Y�N��>]w:�5�|�L��Eöx�cL�A農���L�¡�lN�"����VM�!#�R����
W�!�zG<7+jLH}��&��Y��6����`���Mo��ij=*�4��I�7I孛��[!�zƋ@m}���H�)�!���{|�	��x�Z?1�$qY�5)<�,)�rs�$}�
�:2k_"B�8N�7�����3�8
l N��ߪ|:�ǒ�IK�J�l�٧�ҁ+WN
��b��)-I��Oo��}z[�_Pm)�Sn��T=s��&�U�s�v��L"h��q���
�~�M0IN���� 9�����
)g��wHj<H`���9�fW�
�`��,�h:2��T�I��w?Zk���ȧG(�vu�%n��x�C.�Dm�;����SwZWN6?�rv&�/z^����p6�BueP6�)l�����M��'������?L��i�-����E
�Ʀ݅�&�Adj�_ _
?]�?��zh2�;��$��b�U��7J�1n�������L�#��\��@����yML	�n��� �Q�������;?0H��[7�UX��ʊqH��n&ye�JE�U�t�d��@7�'L����s�b��^�U�<]`jX�0J�������ҟTU:�]�9�����RD$w��4��G��~�=�K�;)�y�\`��-��w���?�z�~$NB�飏pYZ�9�������m����0�������50��CH`8�r�-�!	���.�)2����
Xէ�gC���h��0
V��
2XA+yȎ:��N�P�D
'�[PR_'�
կ��z�W��b���`cG�Б�|Hzg�p�/R4�.��)�Ie6��:c���q�-D��(��d�������\��c�\š���1q"p$+��V��h��P	&���Ղ
�L���[���ɩ�2��v?k��D%d���R!��	�W>�c��7?雝�A��&�x�\��"�nU%���!X
��\�f$J��6o�W.jQ��s�f��~w��C�w�}���󻠺�+m"k��^"娒9�UzP���H9���R1x�e�>�Z����a�=�.�m^vL�;����a'|}=��cZ޺y��Ǡz�����C�^�9��ظ���M�_��V�Q�O�F�j�ϓK�[��].�҄��� �Ќ�^�K	y�D?!
�����/G�*�n��(s��R�G0� ��}�����!k��@Y�\=�?���%	;Jx蔟}�����>�
\���ґ4?ۖש�
�X�0:A�ïv5n�OO��M�|�A�@�n���|OC��Q)�Z�$r�Hi%�_J�l1�3$�>�,�KŨU�&);u�P'F"?�]���79���=K��� �=�	'�q9�Y�Z�^��U(��o�m*���B��'K�D5NZA�}��lR>�(-�,�YF�9�
=n�.Ԯ�j�2���_�����Z�(�bPk��>KFC��_-�P��މ}ݫÆ�{��Q����nC�(��]�E��цHqQ�Sp#�\si#�Z�G�B���
L�zD��8{��r��ڄ�dI��p~�h�Ȯ�zX��.�j`ƬB����]�cL9ο7�@1�!����#�zf$	�?1��ϑ�]�c6�N�����[0F���q7#,�G�K��B]��,�E�F\��Ө�_�|�r*wc����3�d_8�'x��E��La�s�A���K���O�"���xxʆt��d��b��v{"�����:�Vu�;���� { -g��5G'�ّ@%G4��79K��,�$�Л8K׀���٪�@N�Ҫ��I�	x9���(��8�#��
v�:���e�^�:���B�M�a 5�H�w�󔽘.f�Z��������9,��x�R��c����F���v���nL"�]���:�B�h�:�W����Z��r�c#���C�2P�a�EY693���e{�<��B��Vh�ZN��ޜ���sT���|Qj(7p���F���J�#�?1<�`ø�>V��"+�7��3�����'�Pf�/�x�����n��Hb#�] Ո�O�ס��KT`�wX�i�7�ox(}.[%�m�x�Y$E���Ws��'��x��
j�E�dW���gŒ�ya/zO��E.�W.����]�@�v�f�/�F�ۡ�ē��j�8�_b���,�n�\l�L�,,誘.�^h�
�1I���<͊)>�T.��9_ R��;�cQb%<1B"�Ґa)p�A���0p����^����9�O����n1B�����<�U~��SS��Lt�~���@��RJ��B�8�OڑË"�>j'��2��x�Ө��"���Xb���u,�_X�)���b^�����S!�՘-[M��H�����k���|�=Q��4���������D�&iT�Y?I�*���[DT�&�H�(��u*}�����eߗ�
X�&*�x�eic��&�<~m�PQ�|0�*��ȅ��S��Z��y��B���n�����@�s4Cv��,7�Ⱥ����ڇƧ�l(��9M9m����Gj�(�W�����}���q���"m'���;g�]~9�BP!�;ȓ
�o�D9��~���K@F�[��k��ˇIؿ�^�e�csp�݂��y��o�#;������'�@J�2c�̀����
FR@²i��HϪ�+t���;��☲wS*����@����C�|*G���AҞ�Z)<9s��Ț�p�g?�fKEqk.�|R�[n�U�(���P���J����̸"e�Q0���;X��U"��)�r�äIi� �Л�t����tbV��4t޼N?ké�<��"ٰ߆����l�s!��VQ�3K6����
�V$}g ��L{�ʢ=���6�Z�8�Үt~�zcF([���-�-�b�"ߨ.��6�W;�[�[I�s��B5 �9S��i�C��˧���,�0�����6�H����~����/�~�)�Y&�G}�k��]��(�7���O�dF;d�Q_|/�Y�S��w@˗ʭm;��x�4��Yb���$�*e��(�(�}rH��p#<�U���h�/Uf:'�MI�U�v�ɴi<�뮌i�L��e�Dz���Y�0+Z���dz~<~ږ���W�|�m�/.�ϒv�=z퍰G�|����3�N=��u>j$����Y�q��.�J[1VlOR�M��&�z�$�
'\X�(�Ug~�s�40X���m4�Wָ
M$�)����/�D�$ܶC]��[qD�D1l7-�Ts�����$�sv���A{��雇�]4Uy���8�H�f�I��+��"h,L�fh�@�#b����Y̏{˃D��ͧ@]ڥ��a�
ی�J�
��X�Y��Z�Q��7� ��z=$I65�Xs�[�X33x�K�~�q_�;�oC��K�������wT��]��fxPf~o<q�<ߗ�㋬V47����Nx�j�cg��^�>�/�4�^�D۽D�Ha1[m+fә��c��s��٧~vHb�W+���s�OH����p�V���I�濬%����=�3�BVVt�_#�l�?�;�9� >���Cz�gi�;��
û�r�Ӧ��u���|�ԬN���[}�q~0��O��q$�9�"�P]��36���ew&�ˋiJ�`���=?"�=�YtO�]�Ɏ#�C�0[F6��μ#��紼��y����N�̵1��P���py2C�����"K�DpK��/��e-��<̛�>v߰b��7I��%�'��[���>k+�{CGd�ǝ#O���3��m&`q0w1��w�3[li��X׫�Q�P2KC���p]�h���)��%��3q�s�u��Q�
�7����~\����^��1n �{�:�{��9W鯒')�+��괔8�l%ֵ(	
�,��2E6 ��h��C�(�'a}"���B�	R����f]�r��u��GŜv!����˳�6�&%�%_�D��1�����'���eJ�=�
�Mj�����P!�)����K[�I�'���/�(�I��S�J�(� T"��Z��'�U�C����h�d�0��b��Z�xa�s��U��;T��lz�z��m�̀��&���Xa�~-LS�P2T�E�$�Ƀ3
{`5��Xo!�[]'���	�M)��+�L!����W�(�
�&N���@�4�ftc�vd�FYlF�O>�g�C�aZd����Y�IY�Pol(d���OA�□~T#��v*��U�@Y���>dѭ'F��td���=��@C;�b��)\��s%rB����||lnށ����td�tTr�g�Qd6	4����^���ʌ�\!�4�[���f�@

�#��*�����\��&��+�LcwD�A,?�p���������X��;��'�J�JmzKt5rS)nvV�Jֱ��`U�~��������w50Ab�OQk'մO���ؖ�:m�\P����ꎭېJgKԝ񧑍B6<���F����d���9�uNA���n5%�]gFǚMM�2�|� F�p�O�IT���k�$
O�I��̋�=��*M	r^�X�3l��q�U)E� e۹�!o�ᥑ�b#��y��P������D��:T��Ѭ�b��,�F��A�(�PR/��
��cO�����F���j��J#`֯;���D�tGu#��=�2��:0H���$�Dp�R�nu�Gx��k��e�C+H+P���m�p�y4Pk1"��_っ�#
!!I���xQ;E2lA�J�c�0���=�Q#J��bg9{p�.�#K����q����9.R;�u�P�&�:AY9�\�G2��Ѭ���D
m�49Go�Y:��iU�"���ʔ�L�>j=P��� 0���$=/2Oc����8���l�"i���p|�.�ݱ�#�q��z_B��x�zf�E8s��Sr�?Rb�sC��pR�P��jw�=U^C1Z�„���P�6w���Pă��<+�t���}-�N���lF�
��y�	�k��N�ynԑ3IR����<G�7NC���"����<e��$�ҭf6��Q���|�h2��)3Θ9t���\`N>��%E��d����Q��.�ic|,��5PYSdË���k�d%
3���5\�"U�n@h�����ʢ����Nu�-��t��rW�c�H8Y�gv�i�g�ts�NS�tX���8髤�j��|����s�X�ú�RF�	.	q�(8�3?�uu
���a�ף��Ju)$L�|w����U9]bޗ���<Փ�Ay��h�W��"�cX�B/;%�Nx��+������z��&Ty"������j��ɯP��B�i�p7�t�w��4a��֭|*h��ʷI�mR�Q�I�C�22��T2����D�ir�mBp�~�k<?e\+��X�ڟB��T��C/ݍm�O!� �'
�f�����D7^!�w��-_��;�`-�B��$��8������}�<e"Ż����fߡ���X�
	�5[��$	�?O_�%lE�<�4�"g۾~��6�[�q�K�a��ُd��%y�m�;��_{L�ێO�7� H���&���鏷�
�$Ä��I�';��:��^��%_"l*E�oPZNuCg-��,�*�����|��4굧`��R=	_��^(��|(6Aɀ�
t!+���9�6��0�4)�!S+NC/�jIT�n���s=�/����`7�A�;Ԣnj���7�+��)��C���w�{���+�m��8���B�Ž�t!|���5��D���|H��h�`&�X�k�#L�Z�Dž PӦ�F�o*��Bp
��M��~̷�?���MD|S������"z��&-Co>�.��%��r�$	�Pt��C�a��R��"iI��6�?_���9+���#�w���"���r����6#s����n����RcB��W��x#�:q)�����
�I����I7�śF[�zd�<�nyH1�w��!����1�B��Z,l��_�.JK).��d/��0c& ��6__����x�/k�S��P��|�'�ϊ�ܳ�2�=E^hGX���6i'̅���P�:+Ⰹx,����w��"�@�+X�di��ߥ�C:�Hk@��uЛ`��/��3(��l�m�!�!��w�6��D?����
�;
8�-�r�O�[_��{����kZ`���r4�
{���_�J:�b}�2�aC���!�
K&
[�J�P�AwLBVwr������
������o#|;$�35_�<� 6
*�������gU�zA>�a���N���L�
��-J���v��,!ྃ��ͲP��u<.�~�����Xbdէ�)�!0d��=PM�8�Uޜ>ON����g�Z�v�3ČY��Ɖ4@<���4wZ1���M��eڔK�*= "E-��ꥯ}@b�Eև��c�k��}$���Wݳ���r5԰v2i+��{1��]	�,gq���L=צ�E٫���6��@��G�V���"U���]u)�U����b|^Ѵ�D|�I�/�ƴ�o���4�
�2��I��N��%J��h�2BJrj�����KzT@��X`�w��H��EF��L��=bFr0�m6PR���_�UI�R�dJ��+��3^^���-��G����?*��<�(�#"ֈt��<)���5�N���&����'�r���S=�Gz�r���T��C4m0ܦH$P����D P[�؊�Y#uP����6��b�W�&T�,V�MN����0%���&�QM�z�^LWL|�Dw�|��?I�fS_�I�����F�R�B�6mV���׬�"�j3�!I��	ϯŎV�O�H^���m8L�2�8�Fu#�G^hz��{���X��a��(&�*J���}�ڕk%��$�D2�i،|29ёˤ�X�7R#�pXy��Rf���g)��㴸	]���7�o�����k|xx
�ك��������ܪW[ 	o��5�t �h��w�̂�N��M�ȕ�c�_��5M���a���G���"�xrrm�`���!�?\p�s�9��D� �^vyЌKe��"O��ȜX�&OxA�?� ���Rd歽h%yv}�D$U@���K�H6�� ��O.�5���^\���#�mY�K�WWq�F5Wn,���%�(�%��]��\J�xx�wU֚�h��Tub��uW3pN4�K�*l���66x��V�s�5��'����N��.��LZ�l��n� U.5�-��d��E�����3ө�=J��Bdcwe@Z��V�˸�?�����6<iT��"�C�ל[B$���cK��U�yN)g�?�B%yݖ��i{-fyH��zO�Am(<&��!Nq��v��'KKm��G!z���]�V�f��۲a^#�N��JT���2D|
��W��
'���q�����]\�R�/Y>�6�SS|����S}�|��c�W�`!)�
(��=��輡-ۄ���l:�}�;t���O�A�Y��z�t`
"����^��V��=����}X�T�Y�����o���q�����TK�q�\�|���hV�z�NuT�L~(1����]���Iw�Z��w&��j^������ ���r�L`$j��-V��&ko�mr���L�ȅ�5%�����:���[��1Շ�*X?zJ�-���$`��͋����?���|!xQ�n��0�;��֪h���E��=J�0�&��]w,��_����	��c����o��G�,jz�Mߟ�)X�r
���^�_�L��_j��󅍒�}r�#��!:T��쳼���8�I~V�m)r˄MPA���l�w������1E�<N�fʂ�&'�H3�>9M���%�>ن����)|K�'\a�,�mRd�0�&�͑%fA�:��$��ш�U��{��9qN�=?��N�7~��/$s#�+�>�*�g����1�W
�	E��c����d��-���f��b�nwǓ���/L��[��C_��[0o5��а��$�d��ɔ���ط����C{��-�?g?L7t�>'��o7���%a3���yd;�*t�o@`��],�r�Y�iZa�`&�5�o��N��]� /�Վ��
�: Q[��ú�E�B0S�ə�z�ᘷ+O'��A�>?�U��,�
X7�`�U�Y�E���#��L���ԣ	3�|�ݸ���8��У[z�O[B�\z�oi1��-�`Nd��xQr�2@;+���������x�?bM����>W9e}�!���<s�b8(���m�g�=|_s
A���e�g�Y�As�lʀ҅�F�]��(���� ����h�>��<�8�چCʴ�
i-.L8[?FC�>��a�s�~=p�C�ט�C]y�; ��8Ӫi�<��oп��ٵ O�̜�:���MxF��o��<�#&rș�ԣ�%Vc7�sa�繏Y�>�&>F�R�>�v��Z��%=���юr$Iʪ~�}%���'��� ݣW��mY�=G�l���1I�Y2<��{�:�9�������ѻ�w�%�w/3�=#��og�s-�����j�Л����R$�W��2�Q~LbJ��(��@���}�<J)0��+�qs1�A]�(Vò��1?!�dİRufB�t�Wb#���͂���PE�f�}�J� �]=���J���jԏ�})�X� AR<VلӀ�z�!�fP���#O�n�m���f���%&�e�Ū�1���96ז�f9�iq"���s-բsw�_s�_WJ��3�l���)_-���r�*�bx9���Z�F�u�Xl����n��?M�x�:s^��-dW��y�PV������?��Z�&�O[?�k d�@>W���0�x�GF$�#�����өO�����W�yٷxģ˙��8�+�#!���
<�2@���Y_k@V��>���ED�SK
�kP�-j���(=D�r��i�e
G�F⟠A>�����[
\�	�&�^+|�4~�/��o�%���'�$�[w�^<�y�q4���^1����d�܊�brf,Q�c�1��c?�����w�3�0M�c��-Uu5����W�ܟ�
c���cA�`Y$�:=%aYM5s�tЇ���ެ�mXx�ğ6�R��*ZŸ~ɟ*����*�����DJx�'��w�{[�����!}k&'���i�瞑=���^��2���4����(��c���0*[E9e�0zʸg���<j�ك-��C��M�!�#}pUM��.��Q��jc^q���5Z��/�<E�G����[���G�bz|���̜��{�j��F��$]�ޗ�k�O�R�]g�Չ�i�r�J�t�|P*ܭB�4���*��/�V�i
\.���hkJF�j\�4�&TB���P�M��훹����IZT��!���k�fb�=�\���6�J6g$H�N��Iqz�xFO�r���d���Q�Y�.Y0�#On��_CQ��2G�"Gx�x,������j����jZl���o	���>�W�~�m(��9G��ҨCS��_�	&�R�z�?�b\?�S�]�bm�wK0I�.@R�B'$aߚl����#Č��ȻR�e4��I��X��w�I��8�F�>`�Hf9ܫ���#�����;����d��E]K.��{��w��"ٿ�,3
m����L��0p\�uO�	x��&FJ�`]s����xv<L�:dž�˺�v���^k�A�9�$2�A�B[�(_L�N�tC�	�wg.P���Kĵs3Md�_�oo��%��0��ȏ��\�T��#t����T�x=��$�KLX�\wة|���T�m���P���E��Y�;��Hm��~�*��ώ㰧H��o��KX巴$��֑ٓ��'=�I���
���g�	��X�����}�;mW��`�%�c�`��-�
,��4#ZA��p�f��`h��6T(E�Ы݆��öE�鰷���v��&�CG��X�:��Q�?Q���N���K�]�Uu4�8$��4��8�<C��p	i�c?5�Cb�'՗P1��Q��u׷Y�g�"�5s
�XJz�Le��n��2��A2XO,޴/z��iA1�����"�Q4ц��H:1��5f�XJ��d=�;����^�
ڹj�j�݁�KvZ��3��az0��h䎳�?��٘��z�ā?�q?Y�E������!��r�%�����l��}����]{������Oф0%���s��f��N<0ݣ~	b*@�_m�=?QNL�I`�4n̯�v�n�d
�o.�Og���Z[EA�<L�F1��jN}SZ���
k���C.����F���*a@lGw$�����@E}W=W�!�p���_1�p����L�U��`D����Vf��1@��2�s�V���Fx
�g�$����,���c��4�Ngyh�>h�2h��Y�qe>�5�7�E�aya�6��@��VX�	\
���Pk�4����m�bV:*�	gބO�^�\C$��>��e�nJ�,pw�)�y�t|��*��4(�J�ȭ}��ҵ�e~�j6Ux
d׃B�Zb��r�*��ηL	6�$���EA���r�"?��|
S��L��9^�Pv��L8��n�⺁��B�"%���^]}N�s�:�zagۘc6֢���o���RX�
�
��]�Sf�ty	^��^��,ߋ[`��e�tG�/iy��oɎĮ�D�Mw(_LD�Pi�R�re��%�0���ދl���k���kA&ϛ����>e��}zM�˾�%6sk
���u�4�= �U�ݶ�h���Dž6 ����z��8�Mi<(]�C������M1΢D|��g�����n�?)��UjiJ�%`�{���n�aZlts��w��I٥�d��5���v��4�3
?��Q��"
��/m�B���K��q����d3w�AG0<��C���6��)����1��f����^PQ1�Dd�(�>,�Z�Z�;Q����c��c�b�<@*��/�]���:	�}�R$�8ߞȋ���}HCOC'Έ�3���Љ��C/�sQ>�a\ť��Q
�^��K�ث;�^���EI
;��Vt���?��+�D�| �P��G�����ngK/�=ޙ��%v��D�3'D���[�~†�/��P��zd�Y]�A�"-x�ζ�2��~H*?��}k̐���!�/�:g'���r���ҥ��f:d~�J�=�`y�s��=������l�`%��&�I�1���eh��<����b.�.ˌ���}b��zV�����NS��

v�4[���L&wK@`EY��Ղ�}6\���*s���^�w�h3�E�K��sy�AjCcy"���>L,�lEM'�ow���ԙ#Ȭ�{�n_׸�A�r�5��}����fV?L"?F��i֍D�v���1.%�5�*3�M�[����Y��C�oב�j|�2�i��D�90\�
a�-�$��wi㼡#�Q�%	Vq)
��3�f�:F~՞A��)Z��a�Hn��8k<|�J(�/��"�b�e��q;���MAZ"��}�3���e���L*o�8�Y�dT��
*U"�RX��?#�z�ބ�p�Ӯ5m�{P������oU\�����΢���$f��
`r��y��͌	���g�L���a4bm����(�"��l���+ns Ew�a~��8xqG`��b�:����U�'�S��I�#B
R��[�Y�̅*5G��ܖ������=�.OK୦��b���,�b2k�Vo��YN��cTA}�3����T`)Qﲋ
L3(��~��!T/��������2}Ჳ&-E��g�LקX�2(�)[���+��)�ƙ8���ٞ A����3�c�3>ܐ0W
?�`��ױ\V�t����u�I��d<����И��T����F4�</JA��@�jXu	�����Ctͪ-�L�_����{AT�x9/������/��N��M�l0������)�@�XT�%�Qţ�Q��W�aTd(U'<��������HbH�%�!+C���3Q7%F��N����p���VOiN5��q͌�����vZ�����b�^�'`�W�?�6Q9�/����l�<Bd�����.�e�T�ꟴ�W���N�?$�d�c�-��!l-Jw��������cm�\L{݈}Z�D��N�Fg�3��}�|��v�S�7Զ6�؃����D������4�=kE�`�9F<���ހa�y8�f9��Y�������8G������#]�c+�;�I/˟�Q,�z�!??�q��o�U!�|f�)���HIl�`j��Ϡ,��)��q��^0]�K1=�NXu�9YRyOo�3���F�e"� ^����X(g���������F�<&�����.��x�]�t@
[�s����;���5	8���y�j��7��Pư���_2�0 r�O�	�.�FPߝ�\F�R����+r��"[���1��������6'� z3�:F�����@�3@6�G$ϴ�<��MK����0N��G�u��w�.G�.��#�9��Wn�Y�/�&OY�u5�>+�v@Na#j�xd�e���y�֛5��~[՝��N�&���'����&H}�+���)��F)l�,�Ŭէt��k��
�C*<X�a6��h��ߢrZ�0#Z`o�0�Є�࿯�$~FgE.����v;�+�k�uCy������.�g�?��4����"pӅ?T�*���O���:�e��;�7����v�]q�.p�����^U� ���Bz�&�ou�Ŭ(FvQZ�p�A+U]S����xN�6�%���!���L�ٶ����GS��g)~�����=�W�C}ܠ]�\7�VF�]R�i��͆
t�X��@��2�c-��^�L�"�������Y�5�(�I`�f�Ы������Oc�)�sm�F2��H�g�n��`2;Ky���r^�P@Hv:�3�ɇt�T�(��o7����#n��j�<=���k�m�� `:����Ý�:R��<�m>����<X��Fݪ|9q��I�� b,�-]�n{�,�Aޚ�Hğ�>5C�m�u�.L��
=roJ��Bק���y�/��/֣a�7��qV����>�Ho�G�����W���?;�-2��ߧ��.Q��#؃�d����X'5��@���X���X��Pm��Q��� 
	�nna����ȳ�zrރ�����!⍭B�G&ҷ1d�X;4VFTv��_�.�7���S���
��e�

������6-^��o�"�X�@�Y⪄27b�l(3f�/p�b�c���A!4c:i�u��0�zԢ5_���5�]�L�K���H&
���
X>���t���k��&	�&�?��)Vߔ�j�\[�f�^�k;�+��c��}�f)�U)X�8^��g��(�1Vb�%���r&����݄�������Ѿ�׌��R0f�����(�VYld���ЌX�c��Z��ݱ�tWQ���0�����AI���K�䉞�I���{Kk=Ӈhn���@:�X�-iZ�h0;u����L�j};�벀;��
�P���~L�ɀm�MLl���W�6炆�a�9_V?��,��%����PI��k���C�/&�U�S��FC惘C}���2+������&�sac�,aKЌO��wB=�Uv��Ԫ7��A���$K�����pCS��ʩ�5��[bs�����)K�����.m�O���w�����~�g���9�S=lW1kFV0���d����9D|��b��"!�:���	���؂n��Fg�g[����kr���B�s3nN9�B,�or�C�I_�P�&�“ѽ]�Qh��!�Bv��X̤�{`�N��j6?�6�8lR #���߄$���A�s�ʙ���r>��it��B��zoW�-��bek��ި�����kEx�v,�Բ
i @���a��4�z
�N-��2biǞ����"�dn�K/
�|J�rІD0(v��m>��~�[X����5i��a
�X+���M1J���-�V��gQz,��>�����^y����j^ј�����ƅe{�7�}F�\���xG��kE$o��򓊎���mh-�R��-N1�D���/��{�g� m�	��W~և����A]��|^:�%����;mʧf��$����yh���P�SK�ō��6�#�;�h��i3��<���w��h�٥9�	�n�yT�x?�Q
w5��C�#[�1.�ţ�9�;)v)qa��\�\^H�0q|��� ��Cy��O�HL��w�J�����XC1D�6����L�j�~�6F���u�o�<�Cr�^�����$cl!���P�Z���K>v:�>(\������w�.'����;��]�G:w�:�Y럚���P�9�G��/t��N��^�a*zC��ѽ����/�Z��~��G�i�O{�֘����!�?zs*�W��[�Ul�u g�^1q���'��{!��E����$yd�rF�n��@�xiCi�%؆X�Ⱥ�e�:t�+�_���'`�1sv�%I	��������j�J�g[�ݾ�;�-���%��!��� �x�;c���d�v{�@����\P/��ܲOo��[�ݯ�����+���-�aw���=�l�Е^�,�2w�^��oO���3�/5��黍�z�*�ܓ�ehP�_,�x���[�hPIN��'��̆w6��)��ߜ�i6��@�ˆ7�k]�ݾL؊�o_��������p�y���Ų7�s(��5Pݻ�=۷����P�H��M�:k��ݵ�%�a��X����X�,\ū�~f�������^��~���(fM*:1s��1P_g[����}����4D󡏐�
��j@G�t�n�Q\OH��4����-��{xm��g%�O��t���	��t9�H������
J�*!��_�}*�[+<F_iL|�#���Ԝ08��	���VO�092�u,g��F��K����b�(
����ۛ=��\1r��Z��vmn�9���Bo�<&�T[��{D���)�;����4��Jr��c�C�y.���R>2V�����ZF�o�	z4w��SZ�4='�?�a�iT��_��Ӣ0�4�����
�?��������3F��4!8��?UU����,/�l��FO�n�.V�y8P�PB�+0��U��(2��l�y�gh�D~����a\��t��n�ͻM�;��x��ӟ"3�j~�
�����Հp���rԣ��Y��y��zȧ��QI��3��� ��1���-�}�{�;��;�*�KJ�
�ʄ���M�ղ�HE���Ի�,��!'��
��$��85�A��|��JO�b�4�+��}�1�읿8�
��;�})�\�bz�����,�M>�h�:����%��y��!}m�Ď{�4�6��Q��_o�oѨ�{��
���WAМBmc|\�*G��v;Ϭ�Ц����1���[�Q�c��S�':@_���
��G�;���h��Y����F*���D�P%̩�϶��a�IXh�I�]%BX�!�w4�a?�>8ND�5ۑ�H�]����D�
��P�>�2�"!`�y�:Y 
H#>gh����3�뤐X�z��f\p�ի���}���R�0#���&��@�����
x�_��(�r����U�-�
�L@I+B�(l�M�H�IU���ʼ��E�߭�c.�S`�<�/��m�3�m�/���;�8�_�u��3W���t�[z}6W��4y���[��ݥ�S�]��X5�oi���Gڇ/�=�}]��a*�9j��ѥѩ��S�wl��39��;M��B(��`���UEO�s�0}\w���g<))��ٰK��ѥ��C��p��gȨ^�1�_5�C���G��9O�Z�>�
�K�bWW�j�?�j|���F���df�J�Uc>��Q�d!��8�PN�MM�O���_��^l�����=WY��16ڐ�<�3C��R��z�iRK�݋��hm�V�g2�7V,��'~����,�T�m�$��Di�����*�*/~���K_�z�Y	�1�8@!��Q걿Dž�T�0�&, ai�z��;m��{�����M{שּׁB���|ώl�n��Z]C���V%]ג�ؗ���"��P��ʳȷ�o䕋ٵ�UH���v��c*;�gQ9ç��iE�$t��b7}���QeG�p(�+#7�L.�Wu<)�]�ChZP%pA�3g̨�?Ǜzp��"�T%�7��)ɐ���l��	쓌��o��_�����o���xS�^v��v"�G񄇛���4({��m�x"�_�4�)�_$����6�i�Q�d?�(Y0��C?�K3�bc4O���I����V���S�[
�؈=�o<�b\7W�q���.���cO
��S��bO펉-��
�esLl��و=�h2bO=eĞ�K�˯c�˥f��-syⱚ�	�)�XMW[㱚z�XMeq~$�^�� &��&Ĭ2�'���_x�=F�*�'�
�&�w�~Ȯ��%�7'�"VE"5L�U ���Yu'����U�Pm(���u<����?"eĮz�u��U����m4�J�C�BC#��,_��X��΋C���P�6�ǡJDz��Py����F����0T�If�9Q���1�*`0
UK<
U�ِ����P�ΐ� 	��(T��G�:��AS��$�R>r��q��2�m ���^���V��Ph��#�l�^�q��k	�2��pz�זF���r{ҿ��������U�B�Q
�Q���
�2��6���*��{� ��MD�!��= ��0F�Hu�@漨@fc���g0$�I�	}	�O!��!��!h������DO��ǣ�وG��������cm�E�z���H&�$F���Q]���Ѩ�}�������Q��je�:1�ţQ��x��q!b��SD�*��:uAT�2��OQ���T$�],*	X��?�d6��,A2�����HT*��>�|�;CR-:'$Ս.�jI�9�!����4�(;ѡ�P��(5?(�]�G�cΆ:W-��T���2:�V/�"����(Hm,,՝FX�a.p��k�fD��.�}͈i�5��PU�⡪R�+T��f#T�f����BUm4��PU�0��j���PUO��	U����PU�	���0�BU���CZ��CU��Du��E���r�0URta�"�ƹQ��h�)�J��2��(U$���3��4��+qA,��������n�Ru;E����T�(U�*/�jY��g*�JCd�l�y!��q�Bmr
pm���F�ږ����J���X����9V֬��1�J�Gq�Ć@j^CT5�������-��a�(��R+��/�S��>��p���`��R�i�.y�_���T�DQ���gy𳼍r3}ҭ!�Q��a{A��l�S8�)�U�7wҙ��/���|)��<r�H5F-B��a�^�OY&8�.BId	i��Mv�����y
2�X���?��c����
q|>�9�o��/vڅÎ����ذ�p�ۧD=d>�(��%�2Lg�[	�����s��xj� l�s+�6�4
({tH�b���h8z�鎿��By?dZ%�v���ڋ!��Y�6�g@R�`n�9�mx�!ұ�Hfy�j���j9�R��qWU	�7�	@~�b�{�IĻC�o��
2l�\�T�s��(�eӑ��&~q
I�t�UVd�����,�#�`�PP��x$x����ad�7:DT<5�0�0�x���
I��$&1���ͮ��#xT4&!f����1sF����
�q����|V��]]�]}U��Ч���j9�{ͱī���՛�M�qܞ82�+��>�0vJ�M#�Ҿ���3�_����>�%��CF�.z�yޘ�*��~���U���>6��r+���!��îkX����-��3�m�-��Z^�4}30�-��X�ɀ74�;���(�[����/Z2&�S���hV��"��d,e��H"<%[�3�X�Go’�
�����[_w]�/+]�so3ي�x;L�=O���-T4߸���v��{�ѿ).E#��_��o����:� ����]K�����	M��z�j�����xĮ��JC��@��lݴJSo��aT�O��i�v�麃���W�P�W��4[��)תS[u���T��~��n��V�_V)�̒�G�ۖ��4Ҟ%)C�&S�N#��U}���M�ꊿ��Ϥ�&��K�bHuy��{ҵ��VO�ט�a0��H�u|���;�� -��
�qP�����z~���?�)���D��:�Hq�)�*]�2A�)��L!qk޲s!5\���:�M��T�>�N�
J�K��Io�XuL�n��
�e{h��8QJ�����"�'^Pͱ�yZp�4����b���D�fT�"��#�Rb�K��#�f|K��J�}a����:=^##i�4���,%���gLv��KH��n:�U�t����Q�Fi�-����5�un(�����]tfL,u�ۊvs&��f���S&��f��8o)���G��r�,��*����Л�P7���Np�Jm	-��	%��`#�P�4�mej�:���ɻ�S��"��^�.��;/�qP�"�_�ɮnzfN��xj�{�;�v路T����?,��ĖKo��+�������.�T���ں�
�h�1K�=� "�>���ˬ�6m�C�C^�U>�Ty-8�U�F���0���_އ�wm����_D�r��YQ�nJ�t�,���şA�5Vi4\��x�-بo�c9��ʋ��{}�~g9�%�Q%��^����GP��G��I9u6�{t��qEMb_�����j��_Ǔ�Ƿr�B�8��j2�>'Hk������K�es���3�L��o���ޔ���%bfy|�qG��&��P�ɏ�/��#銛�R��g�r���YY�,���D�g79t�
�ɾb<d���j��6z7JQ.vێ�!i�0 /�ӟn�*�ю�@9�p;VK�p�
!
*x�B�2���O�_{���L�c�i5��?~��)K�V�`�a��m �%��Rz�b\
v;S�}�."e��S��_C�sWv�_�㾅Ki����B쥼%B�/\V���!����vV�u�}��T����6s^A�aAK�8_���ݨrSI��wz���)2�d�u�7�)���Rь%�/z��� 
���`G���BM�Q�0R8}�J���Y��c&�N�%���d(�l�rI'F
��`j@e�l�l�����t�z<��#�_V`�0�ۗ���qS��L��c�a7y���M�J~Ȧ��%\�~�H�]�xc����nT�}M$����G��Wӗ�Z�W�}#g^Jh�b~�M	}u1�U`��X	
r�w���Zܽ��%@G�3���u�(��%��Eo�z��nB����n����
�Vכ+�'�C�:�5��	�����mƀ��m�9a�8\cI3N�s�3O\V��Y�"�-�&iN�%���x�C��Z�ި�ܨbxB��0���J�!��Rh_�L^�.�J��0K�h��v�^���4��k��_�� �'b��o1��.(D)����%�:W%�a��V�BS��.nۦEBɦƄ���dS�q_���Tbm1mW�<��N���K�Wq�#����@721�N�L�E:�t���\n|̈H��X9&ዑ�]x|��_�g�j;2��C�U���8�
�е�������T�u�$�$�5��8�g��(%��J�Ʒ���$�����?}��8GQBl��~�!g�Q:�0J�;}��Y���Ty��E��GW���tcl�8q
�|��L!����)xwE1��çoԇs�
�A����&��u���{��O`aJk�ōb��^����T;(!�Rc��T
NP�8���`C���wA�ǵ���R�~��m��`�}�~��>��9�VH����A�4��w(zc-�*��]tN�g��RbR�ΛP�'�#���D�(}`b�وE��'��a��a�j����xz>��Q�q��B!�t!H	�pa[��IB���tܣ��0�;j0ߨ�}�V%�o��I��P�;$��Q-�\u_�e%M�y�F���~�TH�WBw���,��7DR�)y�nc�Q��1�T���ih�	�z�_N���S�搚��%��`r��i�F�n��f&&߸�*\ؖP�/FQ<�Hї��^�~��t�]����L�F*��'Abз��qIQ��/��?��Q���q:��Q��lG��6����ήy��q��_�S��
J�0��c�>����wJ	u�9������P釀�㧠�)�S*���A�C�̨%t��%���m	���ໍ�c�L�V/rj��a-Y_�Gz��
xrSyɦj}�h!UQN\19��B{���0�;bG$��5A�«�5#�/}1���N\d���-�P
�"��*�Zi)�޶CJ-N`b{�J�&�w �SI\��N���t���)b_�ԂM��x�8M�q�Xl�kY�/�zJ+P�>P\�����ߓ�4��Ra~h��+�A��B[���EtJ�f�RW���J���;n�B�i��e��r<-���fIC׎�e�6�v1 ���'M��v�
��^�	G�؛���(xy�'�^�rΩ�zR�����[�f��Ŗk�ܤ����UK�x��R!���L�1q1�j����Xt:�~������8Q�9�����sh��E�n:����ӑX\��j���1N	]7��2��SKZ_�t�.�@p-30-?=L�
�dG��X��d�Ւ�J�~RU���t���*k#H��2�t�rV��P��ní�u�<�����2遡B��K��G����*5Wl�
Ɓ��l.��+�x�`���T�24J\�9<뇻�8�2|�OH��)�KCC�f��񎰤=D;NI/�n��qEZ�4�T�*N�2�g9�(U��AJ�Tk�hNyO��$��3f��*mw�q�>$!�>
.#wψ�p��lu����ET����˭�@�{����V|lݨ�@�-B��c𡸾؞s���M:]a}����޽�ը�{����Qv��/������U}$�����.鋋�Z�qy.Ζ�,{�j��M�Îû��OP]x��|/]�=�ޠ�?���
�D�~uzZ�O���c·L�`}\p���4J�{���G9�Qj�E	�ғG9
M5,J|�In�i�90J2�Z��"�爿6%�Hz�49<�j*3�dO��/O����E?�q���6qI�a�T�4;<\��[�S��xP#H>��u�����
:j�s��rH������o�����*�qB�l<��Z2[u>��(��f�Q�Vz�y��OF	LJ|<0�?*��wR>`����Y��1�
�NL	"]�l7���!�Q���<�����8ۿ?"���U�cab`�^�
w�W^�sNv��j�9#��c
�L1�Cp�A�a*��w)8�ˤ�j5_Ǵ��
Wܵ:�
w���'LLq���_x�b�-t��o$1t/�_��8V/ד�� ��4I%tS��fs�1���\V�@��w���P�����N����~�it�<��>��B#$j�������K�k�PT���C��yMNq��G3����`,��/�0- 7b6$A���4�MJ|���Tű�|�bڽo!?������� m��L����>'2�g)�޶`�R�\�NF�?�5��揄𜏨�(���茸�y��J+�m6�A�f�A
J��\�u��B�s�i��DY��Z ܜ�&q�P�M���b�_Q��Pj�@�[��������_������vm0	[r�P�>���$�$��b'y�y��4%JI�.%H-%�a��|�Iz�,U��q11T>�݈��at�8�T�.]���!ՙ$�:�U����$�h�É�I��Q��]��ϘzV���Op��n��Z�lE@_\��N�D���'�=�g�ZF	�q���Ԩb+�z�	��Fy�P����N.���ʧ�ߡ���t-N�U�O>A��*�lc�����A[ˡW_{�Y#���27��?�C?�L�����'�-�ɧ��q��h�]lK���j���L�]�!.�t4b&��
{�
�m�&Z�E���̱�kǩ��\��e�|��Hp��k�U�j��T�Nb7����p;��ܸ����G̸�a&K	6<�JqNRm=�<p��i�����M;�H��n���M��j,��i:���8��n��
x�)Q'D����S��0LsJ���� ua�5w9m��4��a��4�,blE�)��/'l�)���PQ/8�e=a�8�9X���p0�᪤�Z%�݅� �w)�;�/U���Af)/�,}N��qocq��";�����6F$Gf�� 5$�󟋛��\$��y�
�-��ʁ�P��옎m����㐅�+\���[�v��pW���,��b�H������.�л�]���#te8ѳ\�:��$'�6#��+��c��.[��@��WRN)���xr�#L���#� 7@�G.�{�=�U�q�kyc:
O�i}B=�������*�d�aK���VZËx
'��p�XNY�N�Q[�o�!%�~��l�OgOm��ǣz!��Z?�~�ccM0:H`Q({�Wn�*�b ��R-�éh�r�a��B��@�J�FԖ��f5T�A@1���`?5n�r ]O�-R�Ja��XoA59�ɯm[��c�u朅�4����	?���k�>L�3��	��C6.
�c�OKϢ?�kA�;���Va`4�]��n8j�A�z��ўeL�F�F���@��-TM!f�i�9�J�ۡ��=�;V��S�V�P���VI���N�$����*��A�4��ӴU�� ��
֏ɯK�1c��9'm�p!,��R�x�VO�ҡ��~�ůe�u��^M�~*�����C�� }�NF;���v�hW�v��/ZCX}s�О�UVs��� Nq<���m:��:yR
SR%�aH�<�!yC��=)R�_�bq��e���$��0d��)CR�:�dʧ#W2�&�Őu��\/Y��3߱�w3{���ؿ�E�\]���ݏ���t~�p��d��$��F��p|[�d8�G�����p<'0�q������,�GT�_N۩e8>�#a8>�#�g8}��w������x]\��p��m�#��F���;������p�+-/bx>����9��e�G3|����x?�?�x�"�e8Ό䖥���_`8�Z��^��Y��A���x�U~��\����2��0��]oA|�q[A�g8>�.�B<��a�/a8}<,���71_��c����:t�p���ZtY��E�_]B��������:��C����3|�2������߃xßG���{_�pT#g/��C���
g��u_!60��?
1K6��&����f3��,��&�٤��RfӺXM��-�n}Kx�p/���b֥��g��0�6u��/�&lN2�'�M�a6��&l2����6{�M������Bfc�W�M�Y6/2��Ů,c�7-v�D`Y�,}��$�,d�?��Fw�����x@��ϴM#?��m]r�F�eG�X�c����$~�Vc�yl��Ϥ~�ݶ�wnT՛�*w�L`�i�t�ؾ�5Ӷ��N:�X�	D�Ph��i�㫲�����ߌ��}F��-���<S
9�x�|P�>[<���
�����UN��&|u��rT�`f<&Ƀ���/N�9�ܟ�Z�<K�k�w�*%�"��|^3I���$,�s|LJ~�\��3�.�] ��qx�'@y�X�X����0�;,T��A�)��!���x'p\W�G��}U�;�0��ht}R@�����@�g�w��3�`��V	X���� Pc�L�mPg3�:��CE�v���4o������c}A���pnT��چ����� r��Z��tL�*��D�:�pͨ��iz0b��ye�V]q�hEcI`+���R�|�Q�4M����.��\��>�B��)QM���o<���o<��_"����Oq^�7ZqT�7�bO�8N��uz�O��g)�	>2!~��>���z�s#�1�hΖ�P�1v����آ%�kB2!o�⫵A�&RQ�<�	F��1��yD������NԳmb�M�^xLQB���
�̨!�W)'}��3�&z�;V��bE�E��g���N.��/^ъ>	����m:Ӧ���E��OG��:�IU��H�^"JAljR���`:w�$�9�{VǞ�t��v�jž��0�ZG�CT�m�p��|O^}���K��x�r��g�<�{�(���G<eT�wzI��=/v�,�B���a
�r���=ϖ%M%4�
����g׉�H7uT�c7?�o?r�`z°tfա�ޢRBK&P��,�������0�7j�Έ��z~�d
����c^S&`EՃ�/5��@C�c��>Jy��q�R���~+�eƗ&�@�Fs�Ѽ���qhׂ~Z��Y+��ڃ�ϗ��r1�>tͨt����v�q�i�,T(�Bi�����xZ�]��DN*��g+�tJ�v�G��1ʷR��;<�~���N��/�\�T��7o���}\k9�ε�#%���Uryѽ��?@_�h��gs�� �)��v�T�G��9���uv���T��>¨��P���0���s̽>IuJ�u��o���{7�.���+�amց��.��=��μ+�媿[�QR�=|sE�S��^^�a��bg��[�˗� !4l�K�F%T;�1Nq�!$4A��-t��H����W1t��X:�'|W9���L�q���෡N��@#M����)���k����0�{衄�r:zE�=�u�wH�<�d��Lf<P^رy<|U#+�����:_���7z�Og��P��Eɧ��$Xޝ�&��k}�F%_�i	�%x�3J��'� ��i% �/\*j@OA�I����Eσ\��-T1_�*�	�3x�9�El��WFIo�L�3����,�ݥ��,�!s�e��/1�d�##�D��\x�fj4J 
�ᖈ��}�>�O|L�pB�B������y���8���(Y2��X��,�\��y�
�I^|l������˞���Wf1x���$�b��kw�r�w�

�_���9�>�7`{΃�p%��G������
l'd?�A�4 ����xYQj[u�N�|�G�����
�ԯym�y���j{ˠ����.����NC��s���}9[u�B��|��NA|�J��#�ǥ��B����<�<�-q����u�:�b(��=<+�a�:��=Q�`�q^(
���{]+;�]b蠳��KE��ja�Sl�W�z>���ņ>x�0�*��1�$�}�����dj��l�20F^ik{� ��4^፝���P��c���U/c���1<���JYd�.�cp�O��h��m��o���5_�TIu ?bl2�u10��.�Z�܃�?w�<V���8ޏ-�J�DfJ�z�ׯ�9�vڗ�&�/��-�{�}�̉Y
��wVBg�a{8�P�Ǣo\Q����J�p
,2K��u�bpI�pM��"��Q���;�Qy$pp7f%��X��W
��^�m��T�5u�)<�X�N���Y��1y��%��P}�͞ 1�h�}I�W�YP�Y�9?3�2�)����	��)��p��Ѝ��t�S\�ǭ��f��uOo�>^�f;L?��k�E�i؎z�T�c�h@5�^D�DL��(��G3"�t��'j����H��.l���Nb�+����H��]ĬlJ�7����xi�;�B�b
7)U�
�3�s<7�y&D}�Q�����G��V�:ʍܼO«�q���r��XQX��rM�RM���\^ IL�w7�c+�6|�l�%��uJ�3�6��l�����D7B��[.S�~^k��m����~��7w(�'�z�q�D�K�qx���`O��F�P�����t��a���p�rd���[O���+ۼ-��@;��.Ao�����Q���I�6�ô�+��&��i�`�B��_	�ɪjy�U,"!�QH�J�����ӎґ���4s����@�}q�Z(\���*�X���W:<������F�0ԯ��Uxd�xSc��V,��K|%,�J���u	o�\[�X,a����Fw|�~�-�L[�F�/Qp�F=��
~~ҵW��hlͶ�jl�6l��!����~8�P�T8R��5�#�
-X$���+��y��Jw���
�#}��E
Й"*�PG����+屭[�;Ab7܂��P�t��cl�~�'N���Ŋ���~vI�/�,�敮�ZSW�~߆��q�~�fz��֊}��f!��zJ����y�*�����A
�.��X���
:2ĉ��M���h,x����)�Ô�d�K�
S�>�wKqD9r_Ʒ;|[_�09�æ����t�Y�t������Y����5����u�lg�5���T7X���LI��n��<��n�����R��I�]����)-U���
N��i�/;��D�pgXj�N�z�U"~UCһ�b�"�*V�'/oV/ՖS/����T�7+\�R��� Z��i��|���G�D��e�n]� yl�	����
���{�c�C�����W6��+�6nwSW��n�(j+��ʂ��_n�����-�o@U�
�}~=�܀�����<Z����A���XXo�Z���T��IU���!�z�oE���"�}�l��9zȯ�}����>ﶺ�}s�ٴ!��}�jQ��2m�N�sdA��E;�Ϫ�H��Ƶz�_ߡ���]�3W�V.xVO׿^�[��
Y���d�N_4����N��0�+x���Es�����9,⊠�{A����?�z�����u��w�z5���:�Eש"�v��g�W�Wߩ"���A����NEз")�w��΁J��"h�>����"�L�7E�3���A/ۦ\G4��e�cHU�AH�IEЛ�(,�H��P�rw�kA�9��O�߭�7�:ݕ"�Z(�v���߭�.��C��DLU�d	�kE�v�r캊�~�sE�Mn���4F�ߥ	�����=o���!A>���bh�$&D_O1��z��b�2��$R�#�N��a-�u"�!�!�����r�
�'PL7�t��Ǻ��7�⪡�r��7q��=�j�n\5�7W
���:Q
�洢t������7�:�'W�4����=��z�܊L`j�w��Nw��s�TCӎSUL�+���~U5t�/\5�j�/T���TC�VUCW_O54+
�@�н��D�gs��w7�ߧ�j���1�s!G�\,�X��ԡ�H�$��}�&����Xz���:`ԃA��\ʡ�F:U��ʘ��:��o1���2�p?���������~����^����n���5�����9{����|sMY`�#BE���~�f/���u=r�Њ�FT)}D��/�x�]H`�0]U|8:8{�A+�����\�'|@3MǮظ�[vнsh�"6p�o�&ˀ~B����D�Qk�%Qs��O�����-���B4�!��Ğ�1�_9��}�G�)p�'^��Z��Ӑ%�|��a�������M�]�^G/5�*���W�|f��G�s���&T��� �_���n�"N-�2�fw�[v�v�ݨ3Jhe��_���
��E�u�cu͟ߣ��Y��+�3�>&6���y7i���@-ͺ��M�LA�so@��c��ֵe�k���s�](��:�s��~�؍�����w�ƨ�.��+�Ps������ya�	�3�VLQ��+E0VD�,)�+��;H	��K}����h\�?�z�%�^�Y�!�� A��^�w�ն�T'~��m靨�K*�7�}`b�*0�&�J�W�?Q�$�P�ӗJ<��<S��H�_\",�ș��Q�"���Y�/D�M�:���H����Y�u1�(��R���S(b*����)NO%��B�
5�+��dQ��|�NK��n�'�$
�G+$dVdt��Ҩ��S�(��	]T��5]!�j񬗪*�L���ֿ��,¸��/C�|Z�����S�pg��"zءZ�ܬP-~�T+���!��B�K���^�f0K�x��"�Oev ��q�~�)�,���T|��!@�\��V��-�4�t��B7�L�&�k�|�	��Vz��E<ze��*�|���mq���K1���j��]��-;���Q�
�	$�B_��]\*��o۸�I�����8��'��b����w�}1no�%��w�3b+��ĭ��x)�nq�~� ���$������oj!�bX�����|:$I��S$>^~���(]62��C�}���]>ȵ�͛�;���֊I�B�7׍�/��Z��4����&�-T[Jb�
'��Q���P��p�p(q�z�d���1%�8�ݠ/�K�)�ӿ��7�oBC6�c��=��>g;�U�1�������DO��ߤoLҧ�dv7o�U��b:���?呔�r���)Y�.�c���WI��J�}�T�/�y@i��"�v�R�U/TP}���*��m����;��ky�ͨo��-�%��6ݧs]rS�
?�i`"*O@UY���<�#��dzVo
Yb�F�����4n�*�$�Ũ�Y%Ď�L�\��4,�w��1:�\����R�R����Ӣ?+|�y�*�I��B�E�g�s�%>T癤�~�o���P�uBɸޫ��4�ˀ^�W�ьq��?������
�\�Gl���ˏ�����O�4�����#ݧ	��w�\*���i���dgJ��Ül\569tYC�0O��Ǚ�Uh��C�!Hމ��|�|Ԗ��-zMxI��:+k�b_��$�o2O���/z�?mb@&��Ǩ���0����T"Z��T�yw`2�����~+��fA��D��W���쟈�F�� *�REς����TRG����\	5w���Dܙ�[V���gg��v�!'wg�rB/�XJ�"�%��KpkW-�����Kgx�V�w���e��-Kl���)�o�)G��E�̴S���j _����f����D��m*T�xK�߬e\9���vpO��P�-��s-�8f�3�/�E�2l�'���>�gϗ��,?:[�N�YɈ�1�dI:���/�*蛯��`����c��E���΀��z'
��a� �#�V�p�gl,����1X)��=v�w<��?d�E��;���
�5H���Ӑ�c
�ҡ=iХp�(u���H����Y7�Z���_���~��'XM�㉨C9�t�^膯0��t!p\u�T���놔���1F�z�����POQ���ё� �B��{�&�9�� ���O��L�
�a���Ώ�ˉ`���O%��~��S
��sR~�f��@��=V�������/M������X!��f�x�Gz.S	�D1T���\�Q�9�|w"?�=55�����i��\�7S=�
(�Xp����
�WЭ
3�ژ)�;m�I3]���Σ�X�9�l&�۵��?��j|�E�V�^��g8B"j�C��o���A�|wZ~:�)3��8#;�o���00it[�A�{�kb��?v���Y���|�o�RN�f+T��8,��gZ\�҇��>{�����h�rйU����� �����`^����th����2˵�7+��P�Eӡ81P>G]�a��(��F�]r���P����e8
��f�%�¤�0p+��XX�Q�^�v���a�,,�Y\�&�a�09���n��(:�?�QQ���tt�;d)B��E�
J�y@"R|x�q늿���$��'>�u7@&��Ԫ��[[ś�T)���c
ZT�&���>0m�
j��^�鑨�U��@%�� ���~o�^29"���AA��&����m\���;�j�n{�T4i�Φ}��Uj�(�w�V%9�(M^�K���vL� 8q�R�CVf(
U'?���
D^�-O���w�n3G��&�z9
�h�|�}M��P�M
�Q="Nj�l����(����!L��g8�~��ԟ����>�m>��H*�-r��081�	�fde�k�%�.�P����ɔ���v����ݥ�U���e����c��雂�-��C
.q&v^�A?zr���T�T]ȁ�,f�]�˭�������ʐ�Ґ[�ь��_�|�у�'�4�C�/=�\"�K���.���$�!w��k;�`lp�H���4:��iI'�}��(�|Ast�D{�_�Μ���Y�N4T��S{����u��-�maV�$���i��zJ�-k�9C���j�-_L�QI���m��qŊ�x�ژ;֯&�XA�!��u���M�D��	��pS4A�P~|����\��p��C���uR���R�ܱ*����%��"'��uVKt�b`g11'�.+�N翲�����:�v��P�,��9�䰞��9��`?c8L�0�Í���8<�a�2�-E18�Ú	��E�8��m�p'����p(sx�ðh�s8��;9\�����g8�����1¡��[8ϡ���9��p3�;9����Vrx��/8��C�x^_�s�a�s9���ws�2�5����9�ч�[8��P��s8��a��/���TS�ڻw�+��)!��c��q;�ʛ��mp��6
�e	B	��3HC�t��e��Ɠ��`�A�I�d2��$1<�<��'��{>���I<�ML�V��Id5�M�x�\���b�<�?��f=�#�~4��mI������3+��
�,���.��H.YӉ�l�-��j;�
l:�4Y_��o&��<�9����"�ܜHR��F2�y:�]6j�O*��f�ʣ�_ͯ�O5_j~�|��ֻ򡦯�����B|pK�!�a���!��+����_:-y{�d��n���q�1���ݜJ���U�S�W�S�Q�_	�V����b�t��0$�π�z�1�'�NO�I�.F�2&k�u�r��!n�]��<;M�E�<�MT���<��LG6�o�#�V��f��:HL����ٺ��H��635�!]L�Ǹ1N����1.��c2/Ut��Si<��Y�d:�y.�˚�cu�Hv0Sbn����0U�x0<�A��i8������G����MܽGHh�^a����������:l�ͷD�9jt䘱Q���O��8)v򔩷��ś���3gYo��4g��.����K�޹,%uyZ�5cEf��U٫srmw��Dǚ���o�{��[H|�=a]��d�M�b�^J���X�(�l��v�"��j�7�k����ď���<�s���"?��������l�=#�ՙ���E�(�C�����b��'��hb�}�hK�N�2h����L(Q`���d��7�7:hɁvo��Si�����B�,�
���[�m],�,�
� d*�-K��9h��p.M�l��
�b.fZJ�j�ͣf�
�ey�ra��4%��O.��@�˦�Y�Ri�*�FҲ!-�O�>�@��X�&;��R9!͕'wz�vJ��G� 6�i^��B�h���̢��X�c]��!D�9�Z+��H�a�x��س�Ҫ5�\V�Qԝ����+�um�[���$�\�s)��m�;��#�"]�P�ү��wA�� ���8h
/�T�5��O�8�&�����������!צ���s�g�5���v*`��$�m�Ũ�����J�ќ���LXsj-^��1d�u�;R������ݱW\C��z
/��ߞ�0W6*����Qy��q�c|~%�ռ̢-�NcOw���LG���)�S��v(�[;EZ�R>N��L:6��lm�%]��H����ƣX���Y�4��n�w��d���s^'5�����g�:b���X60g�tt�Q;5��aaү���)Al��S�ٗ��Y
���A��؍�������ss7���@f�f7��f7�����W������3�M�<7P��cf��7��|3�S�ͪ<���q�Un�f��[|�9��};�KP��X@�8�׋'�g��n/QZÙZ�<�ϭ�F�?B&�yV.��\��
Ʒ�r�Z�*
�1�W+H�Oj�$����!����9Ǒ�
�7�� xzo� mBB���EB\�����GG&DF.L��(��R2S�����|���u��Ň���k�����u��O����_Q'�}��in��=�V�?��S������wm�f�ws����F�8@��q�m���Z��/��M�n7\d^��-o[�;���!]�����E��f[�viG�o�-��v>���v=�ȣ�{��=O>��3����_x�|�O���_y����?p�7�z���C�����>v�ݚ'O՞>���?���s��������Ͽ���o����b������?_��K��O/�t�sC4���N�߾@ֵ��
���[{�f���w�̮�,���{;��:���`�����f|���Z3M@��>��aU�f�箝'��Y�9h??�j��|�5M4�d��WS��<p����41k�5)�氹���$B̩+��rױ���<�����Q�R���������/����{��xy�DW\\����O�����a1I�A^�.)	����oˇPĺ��L��g�Ͷ�f�F�Ý�����p���l����*[���&�I]Q�s�<=UL�6X�\�!+ǐ���I˴�'��QOv������1אk����i1uy��s2?
��3��Rm�1��:tTvkj�!Þ�B�hĽ!#�L/HH,�f�rȟ�
w9���Y9+4c׸�YE�͙��P�t�-;+��P]��sb���t�T:t����g�"�c�4�&�G�ʲ:��
�a���];nm�_a��Y�!-7�j��0�Եv���km�Y�i�v��i*���\�%��Aa1���xW�Nj)d6
�{by���`���c���2���Y�5ϖ�f5�f�V�a�hG�}���֜5������05�e��Ym�U�m�X�rRi%C�A��w9rE�x�C4�ez�5mc]���<o�[}&�%��_�%f"�䉩v7�K֭iy��N觖��K����w������#�6?y�Ș��g��a�T^
�)\��0(cvv�Z�Cw��k�uM�.�Ͼ�gn]=MV����&�����[�ƙ)2
���bfJ���չ|Koo]�\��Љ���I�o_>������?h�-ߺ�IKp|�[�*i��p��[���ږm]���Kҳ��%��Q����~wp�@zD��s�����1l��~�_�/���?�I7sp-�3��-4%$�`|n"�s\��~4~�o�wd�ѓ�b7�+=� �(?�w���#��#w��E�k�_���_C��$�?�'!c������l>)�I���H�#���0ݗ�֑�sCkռ쿙T��G�o?/�oZX9�1!��u�2>��\�����O�����ɾ�?��l�^���z-�G��XF'��M.|����H�4,ٟ�AY���v/��x��t����
:���n�=��\�����(�M����N�������o�,ߣ�2q\[��Կ/����O����:���	&C1�C2�����_c���ڞ�!6M��/]O�%w#�����
k�Y�i��&z(�ʢ�ۖ|au�TB��y�=
�~h��׼M���9�ԃ|��j��s��ǃ�h�� o$�� (�؀r�����;ҟ�~���&��]i�Ѿ�&�5rS����W�M��$��� �`J'JW5��9���M5�t�6�I�m)`x�!�o��R��-�`䇱�6!�����V�*o�-&$�﹟�O���e��ڠ�1V�
��O�����Хma4ݵ�{t �~����IC�ʛ�Up??V���mu��B^J%d$���H�7}雜D�F�&}53	�h�<h���~b�R/��'��NB�{����Q�A���t�&�dž�����0�m����^�JB>[��{�~����/�M#����l�^�K��
�T:��H�_�	�<��
.ׄ�Xۇ|���Nä�k��xaE!��o�w_?�C��nЗ���O˖��P6��Hw��t��^���{������K�=��՗�R�#��׃1��¸�wl�FFs��f��	y�-?�|��}\��	�Cyà�a`u`���|�l��KQ�{I"���W7�W �+�����4�� 
_ZFV�PGP׽�]�<8؛C��m����a����i��aC l�\�Ի·�i?$s~���6��m��<�m<��s�|��Ԅ�����$��>�a�=kCʻۂS�����:5�?���C�:�=Y��n��`�k��:�cj_S���X۴{�4����=�>���v�_��޻V[���������AD��F�k�g� �Q���E���!\7�ٿ���y�nc�"UsGؑf�VB;�d8��^~�� +@�kn�F�cT��Մ�8FȬ��۬[:�q��	��y��,��7A;�߿޷֧�˦M�L�Ti�{�?}��M�ggc��/�w^>�!!W>l����:�6~dcS:�Mwt:6U{�J�_�˗�dr[�d�������^
��LH|��Ѵ�����w��6r�W��l������
}�S���l�)I�_3�C���j7�%u!o5����� ^�{��A;8���j��r��mUy��];���GS�x�uj��P��>�����飉Ԩ���o��e5�@��d@z�Q72�m|K�d����@2T�J��_!C�&C5?��P,�2�h��ږ�#��$�nL��
�vy�[bn���v�s����+��h܏q�jfX�x6���Lz!��γ��^R����l��*����l�<O��V�����@Q��n�I���kaj�8=�>/+gE���]
>s�v�����m���	k !=�1//kE�!9�-I���N3��n!ͯ0M,P|n��u6���&�;��ӳ�����F��y���NK��������ɹ�ҭ�v� /�˟��U�<1]���΃�8'�R+!�H1�b1vr������K�s�TӬ���%X�ƎJ��V"H���չkh�٬iI�f�h�f(�$��n9�62O�,4&�i�=k�m��
�{��F\6!ߓ��j��g����yP"\R'��k��5�6VV;�]�z�����I����F�ϴ�s2i��֥Ym�B��گ }�t��4癬�+VX�Ivk��P�\1{A�]t�f��Y���\�v���U�tG�.
����%>�&:��]�u�H�����8=�9P���
�l�I�g�ʉ�u@���p�-)7�F��3�n�)e۷�g�f��<jz��a\}"�^�'9��ad��!f'$"�_9K��<N��L���(S�V�M�T��h�՜�Tu��w��br&�ț�j��?cb��;,��t;����Z
�I��h��@!ʂd#��\��Ϙ
�!w���[R��lXą�P,�*^�X��y�V������'	)�Aj�=�BNibD��U�MVh��	mK�,t=��^��ڞڰ�Km�ɹ�vO^`�C��N�3'��~cI�J[��]umO�ͧ�_�'ZW'gA:y�2��{y?���Ӓ�
�g�=վ�x���\+��=����8�e73(�jё���Msdd��(��r��	4R[��ꢭ}��hA�=U�T�>;�Q~�G����,���^�b�s��t�˷�s^��v�ȯ�P��Z
�ܿǯ����?�����S��اΏ|8��K
g2�*��;�WPۛ'�x�Ϯ�[/x���>���}}���q77��<,B=�7���9��C���~7�9���x���~�y��󴳹�j�'��ˇgh�<���>�s�[�{!w/��:<�87?���O�9n����$w�����0Z�4������1wC��{�[~]�b�]������:����DR��<���x:蔭���Ϟg���3X�D==��9������6tA+�q�v�����O=��S}ȗO�O-�:��ORl(s��y�@��[yn�߫�����B�*���.�{&�8��a��Fr8�C�a�8l�f������:�rX�a
��ᰜ�79������ywq��â�o�P�0��q(p�a$�#84p��ŋ߃Ѷ�����a=�u�rX�a9�{9��a��8L�0��#9Ρ��0�8�qH8l�2�ȡ�a=�uVs���=�i�ǟ��6S88�����ë���a=��9����3�g~E3������-�v>%��w��>�yzI�����d�����Z%��k��K�k��������w����������xt�y���;��9T�rގ�7�)�?����p]ڿn�/x��1��c�Q��Zy�Ffyy�K*R�����3�Q"�
�Ƒ"�
�%7kH��z�~v�����Ճ��BA�{�S{��8��� ���&�6����7���!,�o��`�M~����	�$�o8n�J��\?�����������x�X;����A�\e���'��C���]�p��G�3|?���B�A����3��}���x?��n��d�W��*�޷��7��4�|9���U�y#XD��C?#�g��A�!{~IH&�7�6���|���SA�?q��ee�
�5
��$��UѬ������e�����$�U�A.������W�Cc o`�g �L�x�5��಩P�3�r+!�U�_���.���ZpM+K9��8�!.!�p���9`|u�������_��X���N������*��$�����m,�~_���d?@�lF[��s���?���o�?҂� �)�y�o��B�^�0��E��p;��?�Kp=|���6�/���h��X�g����
a�a�RB7<���W|�N�W��Gw2�����ˠ�/cx�B��/��2�V9����*�З����ܹ����!d7�/me�����
��L�7�m�j/��p�c���h8�V��Y�Z�h�`�*^^��f��Sдx�໫Y=~�x�
��A��\�rY[k�ga!~�w��3��XZxv�ӻX�h����<	_#���0nx�҃8��������} �g^��-�{na�|b��%�������P8^b~b��|	x��;x�|r������q����n�G�6~.z��Q'>
sC���݌>"�˻m��o;�~_҄:���,���qg��'�8�~�a�S�@x�i�7����J��`��Y��P�,K�d�#����s�'���#�����5N�|x@�^V�{*{y���_��מ_:���Ox�U���}��a�q�0�u�?��J����!�"�>��z���x�p�g�� ߀�H�q��fp�F�|��G��`Ч�p����x�+���*��U������}����8���q�s���|��#>$q��C��'��m�d�"��N�1�S�W�~��&u
� �����G��x���8�6|�x��7�`m�M�s�du�p�W��`P���W'~�m2���k?2�%2�'BM�
d���@S��\yp��2�A��]�
0����:/1ى|q��3~�<�C?r��Dț�@���A�/q|/@�fH�,hf�O�w��r��5sna�@�B���<��m�a&�r?����8�9��{�#��p<;?���p�z����Gx����8�#�`��W��,n�p���8�W8��$���w���cw�=��p`�n�����6����χ�S��=�O����p���FP<��}E𔏓�0��w����ޔ:��s�N��έj��ua���绰�߅}u�u]�˝��:l�랂~��������1�9�Y
y^�f.��?�6��W�}H���#0���}��m��4T��j.j�n�A�|q4��7Я��5�̘1�,\��dee��**?��]�v��{�8p�����?������d�O=��M�ޚ���Z��5�R.^���v�ƍ��Rs��R��U`ց�"��ڵh�O���P3��࿋���vc��V*�y�)]��ȸ��[�ͩ��SU�|��g��U4C�W��g���������S�̢���gfH_Q�S5�5��]=u�<��Н����5Wk�04��]bW�!~0{�y,���5��H]�K=.�������xl����؁��]}�11�5��8�̠?�P�����d���=k�ɧ�kZ���/��O)�/��i�J��?зaw�B�)�1
�9��t��9�iޘ3�m�?�L�(�R�+����>M>aM���swk���|���>���
P�σ8���GGG���D2o�<�aÆv<^VVF^|�E�ꫯR��ȗ_~��sYѶw���ݶ���3�![޹�Nƪ\��(�E��spª-���u@�<��bE����ؗ���'����Vͼk����L�\2���-���6�;�[���|�ܼ�P.�d�� �
���Χ��៞�	iG�t��
C�!$22�L�2��Fb6�)��̙C,X@n��v�t�R�9}:Y�bY�r%Y�z5���شiy�q+�Æ)�ͱ�pEٱ*���5�G�q䍂I�|3y�`9ٷ�F*�Ej�^E�����2�R!�Qȸ�
�|R!KN($��Bf�SȜ�
Ƀo�g
Y��B�����B


HII	���C=D~�a�{�n�g������޽{�k��F��7�|��wx/�zI!�5*��ѣ�رc�ĉ������ٳ�ܹs�O>!��#�}��O?���ECC���7���
ill$��͔W��1Ƈ$B��ite ��Cc�
ؠt'S�1d�2��W�"����k�_�Y�ڟ�?�GB�)��o��+ �:%�l��!�� |9�?�p?��A�; ���_�� �i_��?��
�"�or?z(!IF�� 7��v�o	9��i0Q��nQ>�C�+��G�ƿ��-|�ǵ�H?�'Bx\Ӏ����o��A�?C�
����$h�66�|!��@�~�Н(S!���?�_�]	|M��?�jhK<�O�4�)�����ͽA.1�5U�w��C�D�(
y��P�ܠ�{��L)�i��`����TJ���]o��9�:�M"<���߯�g;��s��k^k�u�	�od�:x���G��6��W��l�+{X�(
��P�����/p)m�Bk
�wR�����'ÿ��I���+~�og����L;�������ЃG��f�+y�|�4�p�6)W[�r�/)7G��K)��!��>r�?��-��~Ïg�Y���W1�z����{�8�_�W�8�$�?��>߄�[0|�g��?��W1��?��/٬j�e2�Ìf�gs�ƍ|}�ts^5�Y""�f��`0��-��6mܨ[��rs_���l��7�
ݺyk�-��p���7
aFk���v="2�h1��&�^�Z���X�"i����)���V����x7�x�b�0X�
�����|��vC+��6Y�OթSO�.pl���HF8Ƿ>��:uzt7��|�o2��Z�A
���1�[
��^K����yԭ����~Ò둢�%n��
�n
���X"�#�J�כ6�E�-��ȮO{>�݀��Z�T��Mb
�5k0n�'�o�9�Yn�D�$���u(P���]�֩S�op^�������Ow�*P��n�U�VP�p�9����KѠ���NF�3�kU	4X#����οlajf
xĭF/�xa6:�[;�W�ͭvw�(FZ�Hw�;�lS�r��D�ES�r۶&���Vk��w�U���&+F�0ߝ�j�-�;?Q�j(������u�,��5{[M��άk��_m��kw�42#t�1�Y\��;�1u�(yY��̊ޮ��e�̚c'�ˊ�d�t�L�7��V��'y'��RJ/5�KQ.�\�y����'��n��㽤eVl��h�IY?-\�]��t(��\�äD�Qs�$>.\�PY�t��l�2%##CY�b��֭['�?�P�
��S�r��˹B~~���_���왓ʙ3g��g�*/^T~��G��ϗEnp��
�Ν;J�/����}�t~6��]tl��q��ȁn�UJmZ����J_*PFS��FǕ5t��<�>��O�`;�÷g�P��0�@���3~ïe���n��3O�3O�����0{zz��XO���ӣq@@���������Os/��5�f=���׸q����k5{��=}6m��v�
��W�6�hP#�6�P�'�����/�~Ok_x{�5�V�q?�i���Oxz�m�X�j5�W��x�Z�<yԳy�Ǫ��^OVu���֠z��7�Ju�챆5�W�g��i�T�|�A�9��_��M��7e�y�����}�}���_q�L��g(�����q�݃��`���?��,n�.��V�ɟ <��U�Y�7ڃl�_<�����W6�^�:{�'F�n��=��ـ��j��q���+�#��{����s��z�������{�\�t�O^�~�2�K�?~|�g�}6����?888@��C?���5�_�4iҐ��U�
�z8�О~�����xM;v�����S:t�6���ɓ��o�u��8�~[TT��zz�����ܹsJXXXE�~2RWQ�\ �Z�g��T��kS\\��8����1���
��:th�/���ݻi˖-���͛��Ν������K�����s|�a��Y�f�M�&s�>}���			����>�W7��ſnݺmfϞ=�g��<�f�ƽ_��]�F�ˤ5lذ�0�…������={�o�x�|�|��):v�8M�s�#��s����bֻ[<f�o��FW�^�v��-�}��I��W��t��֎qH����rv�/;h�2��K:�g�]i��qvv����G�?���,G_։�a׮]��ѣG�N�>-΁#l�mXE�m@8Bn��|��Ȑ� ���O����o�q�m������͛�aH�PPP�1:�ꫯh�֭�2'Ι�
�����.:p/((�r���4�@�`'�p�Q�Q"��Dm?'
���'Q�<�~����ݸy��m��=1��}���F���>��%�!h��9�
z �ϐ��'D�g���������#��Q�~��{�:|IԦ�i�'j�44���C���D�o㩊��Ͼ�ف��R�?����/ϟ �v��t��X� z�i�?Lt�6ѐ}D�۝��
��/�@��i�Ɨuah`9���=����������k6�Poƿ�1���D!�k'���M���B�F۴�0+�?�������]e"�|�,�W�
Ilz��]�#����D�����*
]�u�J�!�m��."���?��ƍ�c9����[J��^�~�����8�}�:�6
�%�`™��KT��3�%e�믿Ǚ4�.�(M&��q��-ڷe��d�%�
�pT�@b��D�}G�Q$h�F�g֙`iϟ����d�j�-��6����N,�g9�m۶�/���z�J�z�J���=:��zzoB0e��B�&��^�����>'�z2Nݿ��3h��|����|��ͪo�6�4�}}}���1q��"HY�p.i��(��d�L�&t!Ӱ�i@�f��"�П��iϠA�3|R�Ϙ�5
��-l�b��Kß�����T�C�9I��4 ��[�~r�T#�֙����LC�X���D/_d���?��3|���]{
ҞA��g�$��b�_\�!�p���AvW:J�Iڦ)i�N��jgz?�i߅n\�@�Si�2
�3
:{�h�l,T}R�Wj|�>�)��pk�~I����v��r�2��/��
�y$-��V�e��x���Ô��1�#�a����Löţ��*�l~`:�X&AҞ����񇿐�ߩS�&���W�
܀������M�*�6��ӂhӰ!��N�L��՞��>)-�HsG�ѬXMj�)��4g�:qx��A�c��r���g/��I�G��a�[�>^�#��F�dzB�#�a3Ӱ~2��{
6���
�A��0�9�ib���4��N���'��?|b��իW��n'�E��eR��ܹs���M;�w�mS���uL��=�'e��ecBhQ��ćҼ�F��4��4Lc&3
h�9�?
K�?��uA�?���믓���T�I`����]3:PӰ�i��4�'I{Ng�����Jo1
�L�L�?Y��Ƙ��IF]���b��K��ܹs��f͚����h�s�6�޹�>�k�Ӄh�f�ku��B�a�FÿX�RGiv�J��18>��켈�_(l� s��i}���������G�@rr��A�_��	��)�5Vi�p~�3ǀ=��ٳK+7���}���!z���E�\f���4~�x'
��Q�L���'W����R�LY��4����;�iӦd�Zi�ʕ�����Hcǎ��s�
����o��A.T-���
��Q��`�{V��ۿ�z#s�Ӟe��X��l��۶m�8��Ŀe˖�?x���G�l6��ݛ�}�Yz��7i�…�`����4  NH:��
��C�B̑?�L���7i���ws��j�{�OZ�	��
�9�ú���v6lp�
_���$b� ����C��|���\!#�WR���u�:�����r���.������VDy:v�`���bsk�L)))E
6�f͚�����w� �+-��)96|�W�^�m������&���P:��F�y�F!˻��-�3f\KKK�iӦ�0`�9R�וB�@�t7��J� ����Ѱ�G`��#Av�����z<����'$$�|��~��?���iIC���i„	B�roG�|������G�l��j������}�����KS�N=;�X,4i�$!����¨���{�4��k1���{�#t��u9�g_�F��_�~�<�!�&:t	��xa�yܸq�~M&���R�V��p0�t��[�6�z��?����r[E��{n���}��3`�}����!ۇ�!::�z��)tkŊ�<�g�
;�����M�?ȵa��ƅf��qfxxx���m���E�Z�ZQ�1�>��|E�z��l�s<U,��M�oB��c	#��G�S���k�RNN���|���OE��^�9�q����TԺGE�7"C�����s����Ͳ��\"..N�V�u��k��Ra�K�z�'��!|Ƹ��x���
8�U*�����uX��
tA�`3g�$�Y"N�p�0�3�Eh���Ё;�Z�|9��+U�t��;�?�{h�~�4:�o� ��b��B�-eO_���u�=t	<�
-������>�5ƺ҂#��_|�Ez��~�.;�.A�q��e}���e�����cO*�1t�~��:�#=��ƍiɒ%B��
��n�7��	��Y?`��^�ʕ�ܝ���>���6��===]��.�ڀ/t��H�9?]������ۗ���3�<Z䞧��A6�r�59���Ԡ@p�9�ϔ��~�G��ʓ	�{�?8G]��㧟~*�.x{����㊇���_���~¹�;����A�;�c�9�{�A��B8�χ���5��k0�w�?t�<=/K�������G�s�PIJB\�|ȸ�����=<���R
�&�V���	N)��z�O�XY;�iG�!�\��͛���S�#�G7�XY;VՎ����v4h�)ڑԣ�%��<@��=U�^E)'W�~�Ϲ�tY/��������7�c�%&&�/�f��x��!�~R��)���h������QSx�c��&:tU�R��~�*U:��n4�t1��7���~�G�KG9?�qn;�s`���5w_�7.=��ɰ�:_gm/��5�=?��?�3��<g���.�5���Z�;�k�s�o~��Q3E�u.�W�'��؃׉�^�P��~zڴi�,�ȝ�~@|�_G,��F.�<��m`��z!j<�wbO��ɣ�v����5h<���=ֹ�y4x"�<ț�
����zje믔�uQ�]v�1����g�įK��{ӣ�>f����%"��n����+���#�C�3��`I��BL�k4�Q��0 ��g��8���`����qA�{��&��ZkC���j����-��#��z?~�����n����:'�$����}D�����~���>�j5�Pc�>���9?�}�Ե�\�r��D�xu?���4��8@�\�Ѡ�L�h��R���:)z���Qz<07�G4�۰�����7��pϚ�߈�0.]���6����WL�81~ʔ)��W�}�
��5ek�>ԙ�
}D�	���Z}i� �/�+p���n��u~�Z�k
��9� �]�aO{�R�/��
j�ƥ�?ypW1W7�>v������͞=;��wމ�-b���t�����n�z�U���r���@}�”��hz�ڭ^�a[���j<���>�u�v�	|xq���VQ'��t����Bg�3���dS4Є>�/r?�KI���3�!r~}�E_���U3*�����V7�qH�j�������̙���F�6�|x�u�|nx��G����mΫwm�4}��Z��9��I��gΜ>̛7O�=�]�>���]����OgХ3��&\�q��Y++o~��s`O<��mѹ��Z���,>I�CW�������c�����0}��ǯ$珊�:m0ľ+jӱ����o��p��@�J���Vt���A[�ųRm���'�ųlj��BBBڄ��N��ɣ^y��iĈb855U�]ȵx�#�/�m?\c2���n����l��9�{�D�G]�%γh����]e#�|����s������9���Z"��#""�+p=z��;����H�{�R8N�9r�P��DΑ��n��ﵦ�����
�)j<أ���@}�㲳^�K=�ψ�#Ǫߘ���X�y}~IQ�q��%��1r;�{��A쥣���� ���~>x�رc�R�����s�FgddD�57��J���ԫW/�����!�����%�]�6CQ�
i���L�>}8�Þ<b>|j/��1�.p/x �x�/�����ix�>�v�ﺇ�ߓ@<3f��
xVU�+B^�5�O.,,\u�s��1��K�C�k֬�e˖��b�F�9ɚ��-��<2�B�@��a{�.	�c�q`�iӦM�9���IE�@�g� ���\��%��lE�?yІߚ�?`�}�˿��n{�N����-��~����NQ��W��w��e���Ы�k����˗���l7�G��r���Z����q8�y�QYYY�{����̈�������B�2�A�lӇ���ܹ���x�S��a�XC_sx
��1�9(��Kψ�6Ix��F'�iS�e��5���ִ��D~� c.ؚ\�s��K�x��?���7�7�����}��m+(m����NX?b����*��VZ�x�֊59p��c��#D�s��`K��c`-���~X�a���N�0ȩ�7��0��{�C�.�R�t���5�9!�gP��.�-�{��k"��z���l1����^un�0��T~mL�"֓�ݑ�c݀���nb�gO�f�,]�T�xFu5��⚋�ݙ+�Ƀ�97���q\~59<? c)ښ��p�P�k�Ɗ��K�C��롧�e�~�O�!��l�vZ7�粤����A�o߾]�j�y�m�\���|F,��?���$a,�Ȉx�uƆ_��?E?
�1x�ZhB��~`��F����/��\�at�TֺRN��T�z-|�TU����۞��57�q���Uo�ƛ��
����G��@�;�MkU�;��{����oY��G'&�Ľ2r�wR���.����wJ4,&.:�e\�1�G
�rШ�Nщq�Ʒ�������(�
e�֭}C����<v̸D�*+8Z�!c�;v�v�ߌ�=�g��gL�ؑ1Cc���Ó��g����#���Ĉ��FČ�k�?6��wH���ߐ�2��NP��%p
p����!}�}�fsD�n��k�<x��a��w��픭ȦdV���?Sqw���#�E����2<2�2�2�g�����1+cQ���G2�2�3��<lx�m�{z��e�g����ڜ��U��7�H֩���+Y�Y������a�����A�P{w{{��a�{�=�>�>߾Ȟn_mϵo����{�G���v�Q����px;��� G��������e�0G�#ɑ���X�Hw�v�:6;����#�S�"�G�Cɮ���������={s����l�������9�r�sV�����0-}ܔ�|H�%�Rl�l�m�l�ն\�f[����ٮ؊��3=2�3�23�2�>��9,3!3)3%��,��g��k�PKEePQR�(g?��pip/_vendor/distlib/util.py�}}�6��l�9R�L;��[�M]w�kb������.KK�͚"��K_��?��x�$���ӯu$���`0������c�_ߴA�7^�z����d��c{S��iu�ާu|[-�i��UC��,�������C��4�;:<;9������)>�r�l^�m0��٤ٸ��|/�l���@��fYW�l����/Փ掫^ե��ӏ�	�v��Y<�䷟���ߋ�:/��Ϫ���ɤ���BaP�oM5��ڍ�~���#7�F�0��mp@O�뺪w�`3���,�
�
:r��T
���*;���y]M�F��<��mZ_i��ln�~h��t������Y:�^>;9���1Q ��<�@>�6x,bY��ڧaT�k�i��BQ��'i�Y3�.�a��,ڼuz���|��S*{p4$��$��d	��4բ��E]T�/?U9|�i�9`5fE=��W?�����۳���EV���&۫ʫ�zQ�mO��"V�fe�ʷi^b�	U��u��>���A��Ͽ��W
L	�=���E�r��`cY8���/��Y���EIR��,I��&L��Py���k�xbc8�sq�|��Pv��ó�o�Op��b.Du�C4>�?��.^Λ�`��Ӄ��de�/�J{G�ߜ�'G�n��G_���?�����~�㓋������w�'�ZXm�k���k�����U{޼�K��Ű��/���o��0��!����޾](:?��;�w��d����b�����o�����ݿ����?~���?����Ͽ8�_ ����4���ʒYZ�€�?	O���gϞѿ�X0H.p�u�.�^Ms��i�H�����*�ü�Cœ@������E!+��c<��φ���yF-=���UU�,)�ڬ��eZ�D/	^�F��:�A�à��6q�Fb.ʦP; �8 }��2c	+B
�Z(�0e�:-�!a�Jp�} Sw��yzYd ���X54�Ag1P%���tÁ�� ˡ�u@b!��3�*>&�fO<K�ɍW�ˡ�]C0%E�g�u]-�M4�\XE�D�}<��r
v��Y�H���T�{�>HjEᢄ��E�	Ђ�* Q4�Mf��h�a�
|$`x���Y��AyI2X���y�
�S!?��y�N���0��{�k�ӳm�������{-�xDq��fQ��T韏��b����S2���n;�����yC#nC�z@P?�t>G��>���#�m3���d�h�t�h�|3��$�\����51bz��/E������<�ga�*Q�nC�Y�Xh*z*{h0z�ў
B�,A�w��۝G��6�CK
H�"��F�+no�ٰ�/Nw��չZ�&��Q��C�b��c`�-��O���z�� ),7Y�7+xp5���`X�}]�V��I3��J9[=e�OW����K׹~����:%��/a5w-X:�	|%†5}����'�z:�{y�o,�ɡ�/HDP�_�й�������8���c!HnΦ��hm���>Z��_P��.�����Y���4��Sw+`����
��iX�'����`�
H��<DBh����iܠ���@�h���->��2�s>ƺ�k���(�
܃2����o�L� �<��LpyƳ�QHսg���MK�|2wn��:mw�,��wYݐ�o,�\z��+���z��U����c)>vְb�%��^��6ւ�_h��#J��벤���+*�ao����,��[$㷆~�}hzD���YG�A�FjO���I5����q�3�=]bL��!�=���U��)y�+��Aކ(�>��^�?���{W�%�4��B��ۯ��4��IA�E4}A��y�,@���8�?���N�aЀ|�Ο�im�"9/s0'��4�i�r^m��y��WC���g;����ʚ2����}���tdx�kB]���^��T�b�ij`d��ݐ��g�7(Q7�XM��m\fmQMk
�A��*��+�t��`���:k)�#����#��+��Q�o�
���<��s���y��+��#2�k��4G_�tHx�|��j�K�q���SG[����?�3�Ss���a9V/z| �Y���L�6~/1���z��#�F��,9�j���l��)D�Q�+Z����`	�?HUA�ΒO��M�P�]E���"VO�؃�
�A3����/�k�f�гe����-�����Iz���e�ў�]>�w`*���Wu�����u����b��ސ�2?-����#���!,�Eu���r1�Ɲ	-�/�	j����ذ��XV�㌖��D��2����p�u`�B�L�"�
T�OęY�g��O�7��/�˽�"�I�tz��ie=�m��Z�b��%=
�1
q��x�5���/�۹3�ϰd�a5���7E����5��Q�]��z�B�s�p�i볰u��+�k$��I���}z>o�H���q�~���;��w��B�bEP΢A�:�l�����F�HM`??2�G�`��4�}���n�#E@�qDK�L����C���
��М;�ط�:XE��FT���T��ӓ)�yڂI0񫱣]�)��3�MS@���j�l����d�Obio���Ȣ��q����PFh[�|��ę�vuit�a���\iؖ>Qh@�и�J~�M(���m��L��e�`\���*R9�"}G�y��k�(�%Ƴ�Au�!��I�)�����!Y��7�Y]�g
1��U5 a��M�o��"���=��H��u��Ԑ�E�f���]Ɓ e[?������C�;i�1���<2�𧬍�+v�:*��I֧���~�k��V�ll��$�h�%B��S]F� ���KPʻH�,P�&m��5���R�C�S�.��E
��.@�6�ػB��#}7I!�����Añ���5t����V��I���C6Y����ܤP�$9����O޽�p��v�$I`�)'�ks��G�s,����,��?!m��&��a��ٴ�ˠH��4fY��)�d�]��qT��(zmX]�N���S�\���"��4���2$���C��������UI��@{?��t��xd�f���98Fq9p٘�Gf}c�"orX@q�"��BA��[I���B����i5��C��'0�5��$�r�R�U
��h�0\�~�|7d�H�h�-ef]�ϼ���L9E���kY*�4�XàK��Cq2v���ש�V���5A����$�Pt���ҙ&mr���f��=$�D���b�!�3P���)X7��-�P(���.�O}� cx�BxJ_|���@h��*P;0�9Kg]W��:�qU���(��Ъ�=EL#�R���x�~&-�ѽ�j��u{����@6�� �`UmQ¥�ߧG���
8���tr�b�Ȯ��#RLB�|@-G�"X16!(����w*�??	_c�b��P�q��JR�Ëq8'�|,ȉO�WCY"�qH�C�c9$q�f�&�b0��N�*���WaE���5=��.#�!�	=�Y�B?�NC���ȍo����jrVD��]�_@	�n��a�3��|�V~M��`X��RU��!U@u$�h5���3ʮ�%�_�U�
~Ll݅��ZO�R�,���$��y�H�|��-�>�`���2M�
^��*bP0
�c���j,Cw��z5�0L�,�R2I�W$�Q��b�	`��Po�4�kU-����o���i�8Yq崅�1�o����wJ�-�W
cj�G���b�]b��#PQ3��T����N��N��v�@ѭii��)�����b56%��敕\��us�X�7�����C�UG��WEz�Qc$��7���>ZUk���Y�2��0�7r�b�Ndm|�B���YZ�`H'≬i^K��S�|J+��N�O�=�Y1���
x`����I���Y�N+�� S���~��8�*|�!/e)?F�8�[�,|Z.�Cbh��U9mF�>�„�R��P}ey��l����E/�{5)@��)*�s�k�Qu��+�9�.i��I�=�EmB������t�2���TDˏj!�&ɬ�.
�kZM�!����Y�:Tv5�$��!��I�"\������1���!l�m^lF]�P�00��$XC�Բ*K8��&��x
)I�n\ V�.�����%���?t�G9PE�B(߄�QD�p���P�UM�4Z�耹�س��D�P�ۭ�#�X�9h����x[���Q�k>\PT<��,jtY����R��N֪����ܭBMҊ�
]�ͤ�A5�A�e�,��`}(A�7�#�����t�
b��]E5I�����e
Gg�=�O�#�xx-�I|4
�	n��=ifH!<<�m��M��)2Dqx�=�A�[~L~$J�����\ݠ{�|/��E�V�P��V��e�׶�5�u2zF\�B��vP�l�b�f�`
S\��z����	-"
T4`/�l���Z�.�큢Q+�N*T�|�3fo�
lZ6!U�
�a��~A;��ge�D�J�<��zQ��MA'�e�x��>3_�u���)ɖV��%7�����.b��X�n�_PB�Z,p�$�y�i�o(�$PJZ
3��C�I��2X:�w�Xf��j�{�UCe�~'.O\�lQ�5S�,a�s�4�'�k�4r���v��_jk�b`�s	��`6����P�@ر'�\*�VC:S�J��сL�p���e���U1>���h?��c�@?��E����,�cXR<��l�2P�1��Ф��aՊ�H�FJ��#�	R�vY��e�� e9jN����=y]y���6&�*�3b�-���� zF;L����&H(G�|d� 9i-m;q����,xh��#�`�i%|���P_�P�L���(�j�(<%4Y���}+P6�Yu#l؜9��V�+>G��0-m�׏[(���`ѝ���ƍ�41���.)�Q�G	�d�O F#9
l�9�Ű�8�;�����\�b��Y��D=]��˛"/o�=Q/���9G�̰����S��Z�!� �ܓ74�O�U�:�^iMه��6��u�ʎ�_!.ȓPB1t��!����(H�BB�w���@_>T9���[K�4�Ԙ:+'&	�M�!2�J���珳���la�&_���5`��3�D�*�5<~O�A��l@�Fc��m�=��Sd�����1�4�������3L�R�zHnX[}Z���<m4��o�I��J�u�H���a�i��d�r�\	���G��R��R�3�S�6�\w�b��E���"��茐M]��Y����U
�c��|b�߼j�U�H�Sz���O��EvL'Պ�!j�Q���MGl!80Ƌ�lG�mgwv'�c��	.�]��YH~t��B	PD �������I�XsD�#��U|�+�a����†da�8
�?>�<}�:R��Xc�_$�"�]Na����قwv��>�l�T�A�6��F��ұ�<s

�X�
1�6{��z5��ыLy
6��b������5
Ur֯Ba�{Oo-g?�hv�My�y
Yݠ�Yz�� =d
#]�T����3��������q7i�~T�J�J�A>��d�ҊR�س�
�n1���*��:+�ְ1C�b�W����'�4O�Eo�{��b�'�Q�ZҘ
���f����kgQ��3��a��]�<X�'Z�� l)�6;u�$CB��v�c�x���w��$oߜ�5Z��I��o��3$�o�xa�3 (�B�@�U��f2T�b�l��jŴ�K�ZtV��,���h�].����"[Sy�q�)H�n6�f�X�V�{Z���J.QF�:���@�+�zU���8�Y�CTj
�A2C�0˩�����q�����L���<0�3q�Ș�G5wr.@�މ��+L+{�9C�ޭm
�Q���u
����}�͍��hTM�0l/Y�E�:�|J�$�܈���ă�yk;�u?���eЬD��0`�ؕt<�qmnE�e�*��i,���Cw�B�rί�]n��X9i���#O�z`q�U���f�e9l�\n�Qt�q.ae��[�m��P�yVߤs:�aUO��#�Y	&�EhV�:�h��Oާ�,�a�YZ��>0��Z�	�
�>�F�`
e�thJ^j��1����7��-�L�jQ�(��hE���H��>v�B�M��8#�ƃ�z9��ϫ4/���-ԥ�-�P��>��2����&���ؕ ��=�(
D��x5�j��.������&������q=g]"�j�i@fY�`�
�8�Pd$@��vxpdG�
!��Ł��b3�K��c�yWr����),nզ$��}���8H�rވ,<��]/�a#+��^�譑�m��v0$�e)�����	[.v �����q'u6�E��i�5���E��K���%�3�	�s�n�G�x��>���`䁻Hh��Tb�3����UO\�P�4^1
���L"��+jI���[�J��]W��7IМL�
�'0���N�'9q-�a�����/��_�[�ˋ�˾��͋��U&�P�ƈ�^���y|��^,���Em�������}
�|?��|�P�u/�~�����~�I�e/�l[�8� 	7��1n���v�/�@�����!-:ts���reF�����y��*���9)���q�	�T;!'�c�o�-�B������ࣞ��L�E	k�nh��d���T�����$�;�;����W}[~�T�����ɕV��\A���U�(i^�ֻ=��8�:��ZVwtU�+�P�_�}zA�a8�p���D,S�z�'��^ұ;��o�J�KD9������G�#=���>�&8��sa��S�C<Л�p�8�Јpf*�0�r4!>>�VD^���q��
c�H(���@����2�[^N�{0K�ػ��7�����
"�d�w>L�!����o�Ō#�,@��6�lr��I�yG�)��$IĎ�N�ε+��K�������:l��J�]K["TOv>�4���x�G��I��D�E�ZíD針6Bm�2�s	�E_�V)̂�V�q����C~��	��;���T����o;�-o:�:�C�Ьg���t$�]Z7Q�'�~+�NC�
��k�{���|�`Չ!_Պ�
�uO���
)t!K)�~��P)d�/��OK�0���$)���X"1
`���Y��hhV�yI���z	5����Q�/���~D�7�oD4��BE�I�.�6�Ӿ&ɝ@�Ko3t ���Ψ���&���G�|x(	�s:�䀡SF�j�S�{ȥ8�����Bf*!�(�P�
���x[�
eʼn���M�VbuQ
檲�����pfV��R�e�+���^���hr(-�+`���`O��p36=f��GPN~�Q��i����D"3��/���V(��yu�	G�Ohg��9B�y����ALX�\�3���u_ȐM�Ƅa����%��;Uy&��À��e鐹���P��r�)x	E_gy ���(\>�b���/���۞��
���[i��07�`��Hn�bN(옲�����W$����	�?G�}�k�U}�dr��ߖ����Gqu;Yv�#͵:%Y�m�
�U͉˜"�H�g�K5'k�G��JJiڡ�b,Y`�<��/G�b�z����GK�-�]qZ�����Ҩ��n#�3��$ӆ�#���Wj����F���?�~�p��iU���'G���w��y���9�&��L�D�ӭ�w��+�x����\��//[�����,�6�����ѡ�:ܚ?F�������=Rğ�< �/��]/��	���A+�3�P���i�Ru)��*P��'MX ��Z��|�S�]pY�md{�Đ����ӠR�+�$�t���r"j~ٲ�=D���p�_ǻ3�Έ���_t&m�0T���et��#Q53�q�ɞ㬙��̩Q���00��?%��R��Mם�9.9y�:ٿ�n0ut�w���YY��+�����@Gƚ���S�HXd'|2��@jͰ�lSR@��6����X���:{�Ax�|��KR9$���o�,�q��k�b��y3���?�}	�c��.2d4����)�1�e0%��.���'m�Y�T\����[|���1�8f���B;�E�]<u8�ТJ.�R
� ��� z��׻<���98�iJ�ljJ��ܤ�`�y�{��
�bK$���e����ysR������$}�ҥ#����/t_.f�*YC[���a���Z
��]��x��8ۋ
�(��
���"�(����Grc9|�n��:�ZRks�'>��[�;�(���s�`�΋-;$lQ�K�����P���V���jR����I����w��RYf��A$E]P^p�Oľ��o��@ī@�qiF'Ȍ�r��i��E	^J�^��Q�,,-��fc%hX���`FW	KWƐ,��$T��Ah&���E�H�O���>�����8�6�!!3�҂6����iA��&���5ֹ-'�&�K���L1�ݸ�spi�v��E0c�5�!/ۭ3�Bͽ�v�5>�c�l�oc�$����]
U�(�v3�u�R8H&�2��Q��DR؀i"��pI�*��d=�F��I�j���t٢�
#����fh�$�:��-�W��I��4>H�� ��0ȼ6����?O�8����fw{����0ݚ�TG`{�8Ϸ�ր)�[Y��Ѥ���ϛm�O��
dL궘�y}��"�(�2�zp��
���3���8B���f�J_���Ko=oVt���;{D��G�a�{Ì��t%.��@�@Ͽ�X�ʒ�ьy� �R��@$%`VEũ�!�JH�R�1�|p�Z����ڗ�FEYO���9Po"��&w���"t�b���M��y�J�>�ƜP�Yt���A��mXe �k�P�+u�
b��`��"��Rl'�'n�v������Əu�}�L��!)�ѝ�f
_�����uT�����wzw�R��g�T�#�u~�qA���ѓo���ų��
����;��In݆�[c��Ɏ}�]1U�K�PK�a���I���|ih*X��R�ڛ;��9[�� P��k',�@U�ck��{�ҍ�j�Gd2���G
��Ïq������oC��0�!��TE"FX+�E�a֘��ЯGLS���t0_\¸�l7�KLds)��{-�!��8�Dկ��UUe��mwE�«�9������=�g�.�+D�fWWZa�l�+h����)j���݂{��
�a���C	#h��4�{7��
''�yN��[a����)-�&yN'��
�+,i���R��)y�X'��ɘ�P^WԜ�q�b���|�HJ������7���Z焉�WdW�QW�=l�é'�~���Y���W
��,!<�4,��Q;%0�e1�R�zI�z�M�}/���3�-�tE��uidA�p��p��6�ҕ��T:�%�UpO40T�&���qxDN����1��}�
p�}R<g57���8.cJE��+�O.����T�Iǭ2�ی���?.NV3Ln�6{�ͺ��JO;�
���c�	'O^�<ks+~���J��*G=L�D����;+�@��TQ��x�O��9�g���宕N���!�8�z���>o���{�1A&W6c,-sSbc38e�Fl��]c�BA:�����9:��S�ஜ�E	fJ#}���z��9�"���P���<π�ld�!�.y@�v�A�L���9N6�4S,�p�ZkP���Hk��Bw�o��8��$��8�T�,�|\��&��;�2Q�I���5�6�*�g��q��Ʉ�#i�S"�p���;��0�
��Ʒ����mlӣ�#>��L��<:d>�[�,�R�FXf�S`�j݃�wH�%Z�j"=*ړQu����P`
s4�D׉�e��e��e�����U�y�"�ֲ�A��.nmo@��EjD��}Q��w^��J�A�˰g�P��d8�s.��W7*�ǝ���B1`<���;
�b$�l�JH��R2��T���e��Pޖ�})uc��T�h�ie>i2O�J,�&T>��,1�4qM>�g[Z�|�7��B�uM�Tx����I^Yܒ�z^��Tt#�O�î�zGO}���IV
�fVqS$+���=Չ*�-^A$rK�)���,��.W�X/W��$�d����ܲ$v^VNڰN��5C��WŏG���ɴ�<��P�Ko��3'�F�rN<6m]��	п��0X��&n�noC7���|�M�4���m��}��?�����p8U<J`xO5���
VA�"\�Y\N���N!�V�~=f�b�hc��=�-������Y�^���\)��!ꑥ�pƋ$sJ��-3���z����f���i��������gJط��~�W�~��,�����]?��r�>UK�9����TY<J��f��h0`Ʈ�խb����WWV8Q$)�rlU�&�
���U�ܻ���'BM�Q����3����̇C�S��'�Iپ��F��L��F.w3�l�.09�5�5Ճ�to��g��q�;���(G��u�l;�"ju�:+)�N�������y��#�,)#?���b$�#*~�yZ�KY���vk��vu�G�y�u�AV�j��_��I��k����H��d�BDoWNc�w��g��pZ9�a��$�漎�5�%��Q�����抷�"���R30Y���/��k��K�^��0�4�}��o��z��e����C�q�9%p2����9eT�?�?ßK�sS`l֛�����'�?�?�P�SL�P:������?����_�����R��%�m�Pԅ@4�ĿI?�7����P�&'2�I�/���ލ���|��w$1O�Ѯ7I?wc�s��?s�\ܒ�i�v>�P�%�|�f��E�b�\P#�[[��5�n �V<�+� ��0j�|!��:OÃ�g��d�iw�'<#���[a��Ku&z�
�Χ�o?\|k��F�zW�^�j:\.m�I�n�<�[���V���7�E/[��7�1[�Cw�8e$���A�\������D�>8v{O�w��f$�ґ]�!�몼�N���1���j�
:`I��n�����Vz�/�Q7V���"
�w���Mw���ʙ]��ϯ>��;��	-��+�����Z���ծt� ͋�!����{ff�w�8a��ŠTS������&�C��Ź���"K��>�T�a$m�ZP0_-)FX\aDأ �n:h������d�7��˗!�-c�f�T?{�7�� <��J@������N�Ɲ�}`)Na,���8xe�}QzP
�N�����>�i���E	1'��J�Z�7�%�<����W�Y˯N��t=����"��>-n�.���I�}�(
;��2�����c�ٮ�NN�o��.��,��#&�py�w�=EP��q\�5*��XG��;����5�g�q��������B,* i>~wx�ð7�tF|G;�,�����qw=���HP�O�	��tx&�0Ń�B)�����4��8f��eE:o�ݎ�b������� 7v�;�ͮg�D�?�2��N.�u�[!�eF��D�atޛ��"@[�hZ�¦�ڦI9�)�Z�2�]:�Sr�����/��v9�����Uak_�p��'�>8�\��F[���[g��N!׺�J�l1�ɰ�m��gaE,�ԱJO�o�J��D~�j�5�B\�0y���k��W7��K���NwP
�w�A7�[j���@QW����O������-�r UXwJ�xIơ0�ʟ&�"�g�'�M�n���}����]��#�&ѶkJ?��iV��ڥ��ѶK ���i�+������>?���\ӅU�����2��ٛ��J%���w�	�R�
�b�u�\4�O/���	�{tq�Ҡk��V�Dj��.�f����tىo�=_k�4~�����v�|����jڕ�Z(�j��;@��%NY	���OӚj��m�eε�>z��:��u�D���v��Ԕ9yZI�r�s2��Q����:�E�m�~:Ί� ǚ����R�E$���Eu��<9�{��������_���]���{2������'��H�U��}~>�����_�?�����3h�t�̮���_.^����/��T*��p'�^��:�B�J�Ǘ�WT&����$����!�y�>�-�R�y�(3=�m�/n�	B"x^�B��O�Уg/^<f�M�JF����6�߅�����p��
����������)�-|:z�=\b���Tp>�I�C�V��vc����g�Č�e�W���C�]U�C��ֲ�0%�i���/W�=a��~A�P����C8*��/���}�;A�)����.q�D��C��N{F�m4�g݆u���4����HI��ȳ$p�
���x���B���W�P	��='�.l]Q|�N<^��U\2�"<�眝"Oj�v����έ�a7�	�����}�af�*76p}mD��Q%9���Do�ΎO��z�|�6��-}�>�MՐ�sI�=�ǜ`���\�ܞ
�\�e5��l�IW�٦��ᴚ��W>�P��:E~[�5�L�d�q�yR�e\K�"�e
;������y�ݕȞZFJ�}�*�"�)y�eSz�)M�/a�W���
�Y�r�{�0U%�4E
�? �8A����c%3�� �w��E��m��ͤ0i��Y`m+T�3���/ �EVd�p�ʻ��E����w�n��%�|�u�༑:��g;�J��#�K7E��rJ��pp���S��/�ã�����u:Ox�"�G�m�W7���~�ϴeh�Է�e&�b{|rtv�w�.�a�{���C12�b�r��1W2vly�t�)�m����1��1��b\Q�V��s�-�f?��[cU��M*�wco��۩���L�����Gy����tB��I�h�"�ˆ^�T	��oN��Ã%b�$�8�P�](����));�NK�(����H_<._!~̅5R����5�I����Oo���k�TdFY@)�K�z�Ҡh��Χ�}�����`�o�v�G��h�0�Ƞqt��D����9�n^ȁ˹}�?6��<�e.�O�T+�B���4�siEO0%�\���g�G��CJ0I	��R�A�+t�@@U�1��1x��霣ÍF5�a��Urb��c�t�.uЉqOgL�D����8���S�4��_f7)�T��
��h��1�XxHv�JVr���+./.��`��t�P�g|ﳰ(%��C٤W���Ra���;(���KIҩPT�.���#�C�j��MUa���:�vUI��;���V���\���`9m*z˛�™)��?8i(�u_̙�H1��$�c��9�n20S{a����	L+��F�P�oX0?RE6�K1`��0�VS���`��-��L�,���A����>!�Ӣ�s�Ǿ�W3�d�&�
��)��F��
f�䚘$�D9��1���7��F�>-�ʭ��lK|�O����(B>�e%E��]��)%觤Gxva`(�b#25�۳��dt
�G@0���脉�ECD'�/J��ɤ*LM�E~:%Fh⢰�j��T�FlP�շ
�/o`�)���XK��[(�.y1%�P�4�&����Z�[�t�Am�=ZɅ��h�Z+.Rf�df���ȂG(��w�	R��)�dQ���[�v;^�����ur�'rH�9L>Tb)�*�QV��/ȑ���a��o���rmg��6�_Ehm���7dj����	fY
��F�v�m��|�{�^Y8פ�1��E�U@���(*?��G�����#�?�8��G��9�1|=̊z>A��g��

Vū(u_�Fz������M���[m蠵`\�tS7FZ�7� ��>�/���V,E&2��esI~-%�Q4�]Y�T��ܬ�\:�m��x�p!��K�졙�wvZ�
:���˞H�W�mR����:�_TR�ϗ��̶ÙLg���=��4T^��,�q�H𲶋EzD�;���밺1�Bd�X�o�ݑӫ^���+���݋�=ɭ���?kM+.���T�cT7���=�ڋ:�.\��߸$��S��T꺵�7��[<㳆�!&�L��΋�c�m��D����K����80�0�o�B�x���&����2)믠[�������,l'�!N֘�������-Mh����)�B��JXųk��HC�kXm�;�����Gݹ�2kSL>_07i�DY4M�vC�2�?�V��!o�̉;�҂UdQ��n�Դ'�{G'���g�R�C3��_�|��a{�Ug��_��f��2����
��:y���z:0�K�^YKt�t��
s���{
u�U��)z���4�J����|��i-Ȼ�z��e8>�}�Nr(�Yi)RM�Ӭ�g��-�%'3e_(I_����2�p�j��Ϩ�u*nHW��	�(�ԛ�X��ab�]������x�y�M�P<e~���3<��&���B�mʼ����B��<�3��"�	�G����.L���������NvIߤ�bd���1�QkԽ���`]ET6ߟ��x$��k��	W�;! ����uf�*u��;�#Ҡ!��'�޸�;_�MJ�"�
u@�����K��9h%.��a:��V�
�d�(��:B��9%���}熼7qcO�&n��́�Ք9r�@yէ�x�������19�c�1��սt)U�V��:�U�r��w��<TP��=�)N�`9���A:�Q�h+z %XA�4�W��Bd"��GŘkeh�L �rSZń�յ��ӵ9v��.8�V�y9������&��D��,#",��	��t:W��R�87H��4Ҙl"��t����e/�ND����QA�&S�	_�VƏ�t5��t�wK�^va[~NC8B~yF�w�dQ�.6�'���[c�e\�Kc|{���Lf������E�2+O>�p{�{6�����9M,ROd��@����=F�7��c��ɽҀ�s�]�4-�pG����4������ȩN�e�=q��шL�QbF�C5�.ƠK~���	��j�+7
���IB7��}������MI�eBJ��CLd�}��n��P -��Q�٣O�Ц��\�Ц�Ă�,_^-��*(��/��+���ni�Xt��v�?{�L^:��Jr
�w����m5��X�dv��H/�Ȇ�����+�/��B�%U�ޓ�9T6�H.��#{e)��DW����ť�Vuɵ�*/�Rd��2���v!��5&��L�Et��%/�9w��:+#�L���o�kupx���	M�>�J&�z3��x-����A��PtO�"H�,'CZ�*���A�_un*J�B:Ow��<<wD�G*��:Г(]�A
U�#�NɎ�z2\5�N"#�y]��{p���`�N�^�+�h��Q�����|;J�tX���8��Vq�iu��Es���6�����D]�����'���J�DA_��$7�04I�I�˃��h�ө�Y��W��� _�}�g�
SG�j2��N�.>�0!є�!�Iվ���v�^���;Ç/���y|��F��X>��'2Hh5Ţ���Zbď�q݁L/ۺ�J��K�&���M%ź�?��m 1�KO�PW���N�"
�����v>�f3Я��Z�2t��mϳy��v���j|�Eia64�,��n+�/^��"o���t�PKEePQ�h(,N_[pip/_vendor/distlib/version.py�<kw۶��+�9$c��d�i�q�ܬۛ=���ݻ+��R$$��H��d+u��wf�I�v�=�6��`0��ޓ� �#�*�/�����go�t������o6��=���]\qv�)����'����8�*YŁW�I�B�s��7�ޞ�����M��8`o�;�x��o�_|���]goo��n�F|��z�d�<6��M8�8[�,�R@��4ci��À
Vi�d�';;9�������H�(��2���ҋ���`��@'\�(Y,�P�f�әgɒ���y�A�i�Iy.��0Rթ��|��VaF��t�S/��Sv���i�-�(�ȃV�i��zL3��V�X���o����񹜧�\�w�>��,q:ɲ$Î^LݭI���LCRʅ�o�̞NcoɧS�����lT�/ZqztF�,��U�3���lUuS��"a���%P;���B�
��M�aө��h�e���,q�ba9���kj;�F��֫�TJkk�U[@�Ú�y��ܦ�]L�F��Ǣ��^�~�DY�m�ya��iR�{����{P�
ưo�Ռ�c9�)���aZ�9PR+h��s�<M�{t,��*�.�Z"�{q���Y�8�
�8��cf���5�?��TE�AqѬ"�,6�X���p1�:��s�nr8
FT��(�܊�b�hƶD�p�H��D̙�I���50�/���
MrU���� �s7%��&��i��<�鞂��I��}!
ԕ�_M�j�@pw+���E1&��4��s�qn[�a��)^��iN����]C���h+l����%h�$ɦ���42�8h��.?�Z䇒<w�J�K�a
Z)��LA<�&1WK�F	�✇�� �|��aXj(bH���3��S��W$��������[������t�ְk�J�Y�Zۼ2ڼ<nm�G� �jnB?���hu�f�l���VQ�e�s���:v+p�����QKX(�,�%q�aER�\^T�,����+.=��dd���N7��Ԟ`�����٪�A���1���\ڦ�*���y�p�
H(L)V�^�Df���h�$���
v2�0I��С�u�2z0�>��+�(��M��Bڇi����qҺ
u�jM�Ǐ¼@Cv�#��� �9���.f���\�Ч�l%�h�8$)�$���
�<�k1��>��f#�0I����]ڥ}��y;�/a�K��� ����D���H�.]�:����ZE���B�g�E%��]�b�!N�]_���8�`�KЊ���	��y��BTH�f
�A�����7�t�E��[���
2�@��ߴ��(!�UH�vo�Z{7�ģ����WD�-���'�ϸW�W����Ҩ���p"5'�;]��X7z�~r�4f�md�
���'!�¦��@\����P�q����-�
�Wʟ��-��r�%Ϻ����È��7,=`��C2JU"	Z�z�s!F��#"��_ҿ�WK_}.�\����֜��^W����"\�CH%a�t5z�ּ9�\
R�6�3���dms*�P��W�\�y ʬy��2G�e�X"�X��ۥ���xL�ˮ(���u��v�1
ش#^�g��-�v���d!��-64��b*�j��9�a���0Dg^w���HSY:�O�|����j�Z��>���K����GʁƷ���p����OV�B_j���~��簃��>�xO�svrvtԟ�p��w��'h�r��������k�28x���҅��Ƕ��٭���;��;m�̂�v��*�]�=��A8��^���^DG{s^���&:�<���`5l%����JTp��M��[��m�S��kV�H�6	r�%��Y��Qb����2�^;���(�DK6n�Faִ%�7��t��C��
�ƽ�7W�B_�B�#���Ӕ��'U{�&`'*1�:U�Ȗ]V �Q�£��BH"T��G/&�u�U�?Ey��`VW5��,�݈�KB_cw1�������߀h����\l��V��vТ�T��E�N�\P�����%d|�J5�gE�v����y��nX�G}5n�{�`C�����ų�Wz&G���"?Yd^
.P�y�$jp��v%��%��h�e�U#� �aCѮ��6o�ɰ'8����B��A�����%4m��@���̣v�F��w���B$V��Y��Flw�#$���/���U�n�a���=M�e0c&Kh�{�g���(��ԗ�	ٜ��S��Qo�T<��V��~%�R>Z]�VA |�q�1PQ�8�z%�W���wA�I}B�A=�hn[k*��7��9�]
��=i����*�y�[���4���@��#/��.�\2���Q�w#�ޚ���T��t-VzG���	n��Q�B�-�:I�jnw��?Ƽ@ka��d*������o��;��V���ݣ���n,kOnh�����<[����2���jɊ��:�i�U-զ���Gl���+o�"E�� �`L�-K�j��rj�G�땰�9:�`KD(�>�,�RC���}�j�p����yk�,�#59��P��_>hk���\-�+Ӈ{)���2ň��]�
�o�8Q���;e$"�dN"���VUX`��U�/�S��}@���p�a�J�M�~�1%V��ŝ�?y����������$�5�_>���7�hk�c 1�o�Bz�4)}l�tՂ�6��/r*VԾ鲍�b^Ef߈yn���97�,�:eQJ�0�qT
�n��Wn=�n�*���f�E
$oi�K��z�U�Й�X����k��UZ���j�]�faԼ���^�U��X��?Y��*U�e�K���J�E���y�^�#�)i#3>yG\GX�Pf�{��ʱ,߯���VJTzZ8�iC�����Z���q�ܭ5}7�(�a�+�<���2�:��
�"���	^twG�g��%�"�T�j��eW��+iw�j�1:쌸�
���7�� NjiU����N'��ҫc�e=�����}u���Ɯ������=F�
��Y��mҠ'2�)��Yh�A��_��/�Ҷ���5��I�&��0}�S�ӟ˯ҧn��~�K�ϣ���F����[mP��t��h�»�+��N�u��&�<hE=xEv��J���O��w�\��_���[Vi���~�p��tf-����`�"���V��S[��z�͛�'ߞ�^�?hSo[;;���Ao��K���~04�L��,��*���,��9v'�e� ��껗�:�}�b,�<�~[����Mv"Ua�	v#ui����L�Ն�����`ѫZ�Rj��̟Ё��8�H�=�e6_o�@p������_�hn;�0Z!Ƨ�U��{��m�˙�Es��K�<�rF0�^J����G���@0BJշ�DZ�����9B��^�rS�Ƴg���*[�|�e�mr��W_���=v�?ǣO�v��/gZ��=�_^Nv�z	m_{�R�_yY�O��)��f�4�|��(�t�@�=���-`(��d��59��ۓ���N�ޟ���O|�s��45_-ԕ��SeaTAg�{��Sj�9k�:H�%��*Uߪ̸r-RZ&ub�����b)��Fʊ+���P�i��^�DI���+.j�=[º���W3�we�qP#�Zz����,�:U���:-
�+"0c���
���d_�1���51�Z[iam�_;�.���"_�E�����q�*ZT��q_��6[�1,�+eQS)��d[C`�6��B���
sI�&S�gmJ�%f���hW���ݰ�G�	��lnPBvNZ�⎡4ۥDO<�*�R�P�>9� ��<�"�%�����"����X��1��W{�f�…���d=AP0^ܘ�!�)"��������I���q�6Ю̳�3a�ЦtӅ�y)8�vZj{�+�׼r�e|OP�ݜm���\�M�Q�����]�D��c�(�����c���;����u@k�1�$ژ��X�#�ک$I8q�7G]^T�UC��z�x�`N�%i�E� b�]6�^���,�ٺ��*Gϙ���y0	�P�9{粯	�ǂ�2�.��B�����l�^����.;~��c�X���~v�8|,��Z�Ҩ�P��/�gD:g歊z���L�֦���1����?*�_��r��@ƪ�:��_���4����Y�5H�u|����rIvXo���+��g�0F�rSY�v��UE8H yX����Bȁ��Ŷ�,=�%�酙�SƁԴ��A���)g,�D��cA��Y���m[�$�C@�����e:$�w��a��۪�犾)�����M���J:�����8t�uLjx� ZJ�(���~�k�t)����4���ʡ�K�Ñ��։�A���Z
�.�a3��~�`��ڃ��L|���?����A���H�V���ܛ��{�Ş�ƒ�b����0�Ҙ�?�o�DW��]�_v�8��0���
�	��w{��	�m�/{�R8p�l.�Cs6 Sz0�^v�|��xw��d��;
�����?�2��=����6���-�a<bC�s��0ta�n��L&�
�~��St.��rZ�`�}��ȴ�������j��x0�pJG���*���(�Hi-��\Xi��y���1I
Wo	u�(�C����ؓ�QQ�S>bϟ3���;����2�}9�1�׏.g����t���"N��Av������.$=��\v^~�$�\e��S��ۂ�������>߅-b*�H2����Um#!'[�Z���+�����[^�hྶ��-��t3d�����a>���)�	kDw�0S-�Q����	����1��@K���?�$�=����P��&���W���^�h��RmR�;�|�@�@b,��rwB�ZLM(�rH!���Q�ӭhOs�3��JVf�OL��#��|_���-,����#o�f��ܶ�ʲ��Z���ao�|8V
�L���z�L��ڸɐ�m��`E��*�hΘ�R��>侬���9hC����>Ʋ�F)šPo�.¢l����cvW3P�ʆA(3�r�}<냔;�)���Lo�{lpITm!fk�y�F���1��}�P�D1��?�[�*C��(�!�t����)�i8`v�|��
�[	��g$��Umc��Ӌ(�r���쩋�afn���}P�f#58�P4;�yeO��R��6���}:��)=0�|���c!�#�U���9ЯS���y�~�}��-L�� �AML����R)�Q�a�3�|�Qe��0�z�FR������[�V��/�;��%���N�h��,�/Q��ݚ�Z��N�+��Z�<Wꤠ��i��.JcVX�p0�0�!�|�^X�q���y���^L!�';`i�^����w:����<!���$i�* E#�q[��L
ޜ���qQ=���#;��TN1M�ڝ�����O�V��D�	�*�2@�Og��w'_��Zc;���[��f�����ðh�v!��v!��yS_w,m��F[��{���{���{�q�A���+"(j���_(��i��r�I�ܐ�4ZU��L3޸~�8�R+���2��
��9J�U溙k��sY���7��k/������.h-�c2"�G�����oZ�Y�9y�[��q�&l0��k�'��t(I��v��Yy�S�4ݝ_��W����wI���|
��*�&���g;�@�P�{/ʫ��ܛ ��J�P�w�������
��R�/�Q]7U'ꐵ��19�3���0�z��sʄ*ѩ�+�����;����g��7}�ê���'�1&��\����U��*X�B
�lC��y�|"OF)�?ǎy�\E�%��%�Ɨ>ʉ
*�+�Ah��8J+�M�n���7���*t��w\^z?�����?)��Ryet8��h�UB�C�.�
	�&P�ȏ��#��&oJFB5Rdt�
��xLr8�"H��R��X���[��t�QJuT��P����[���u�� ���O}��V��9}��ίb´��~~�C���vqX�r�4�eoZZz2�K�tj,�;:��&���
s-��>�[�v5��}�CB��D���l$v��_�J�O��B-��?��}.?����x@�ǁ~���Cykg}{4�g��rC�`��ܑ9(����o���\�g]v�@[�M��o�~���y��W�
p��}Zet�7ֶh�?;2�q�%����w�5m���N�$�h,a)�؄��n]��5���`'Uǖ�0"�U�F㉴w����G�GP�"W�;c
B]���[���:V_��/���`��aͤ�PKEePQ�7�`pip/_vendor/distlib/w32.exe�}xE�8�󑤓L�$�#
jt����$A	̐���qt]6t�;�i�Qw/��z�z�,����]��|�
�0�I5 �YA�nVk���@B�wNu�$����}��y�yyHwWթSU�N�:��TM���dLØ�OU� ��s0���>�˞�l��7�>hX���+}�n����4������?��e}~��@�������֭�!++�@���G��ş�3?�=�σ�
�>?���ߥ�7�{�~9����=�O�����0}����>�we�]N�YjHa6��]��n�h�4d0̫xV�+�V��ԩ��F�Ia4=�f�(�$;�) �&���g�g����y�
D}�����L�����}������7����~�Oz�����a��

������z�o����pP��
��6h8?�\膆�
߇o�Vh3��#߀�a��?@�&J��e��oo��ɿUr�Ƿ�3��.�t0r�.~�b&&���*H�U��[K�'�f2���Y��}�bV��3j���V����j#_G�e,�� ��M�7��ͽf�av��Ō�5�9,6��0/贺T���O��Cw����b]d����<�A�e�Z�ö7I-����!��p%E<���8�
��	�r5뵩��aw8%���q-'7�c�Z>�e����`��*��d��a�m9���Y���U��a���M$R���G�P����v�}!�XN���~�W��S�z|�<�a���$e�ִ@Z�+9�h�Ij�d�|��#�op���H	%[�=�_%�FLθ?��`���J�Ke�a�fy�c��/C90A�|���PJ�'�s1�E��j�}��}�{*�;͐�^��hgo��ߟ���ӣ�vq�\�c��3�VU������ɴ�#�/��9�N�SB��vy\$��˙�BP�� E��SV�:�4�B~ƅU�]CHq�\r����]�d
��P��z�2b����Ӫ쑍�+&�هH" �eg_�ں�_-�
��I��O��kj�'�y|�-�8��0X�+H�+�{}�
rB���E�'kT�^B�*�>",	:�#E����A��R�A@��s(K�ۄS��6P���aP֬�۴�z�>57r��0~���g<�ʥ殤�<0 X��r��
�
ȧ�/���6hC=	��O��CK�7��M��cRKA��b�9^�T^0U�]��t��.�xmq���j�<�2qk�u��H�5�h���j�c�(�4'��@N�j
���_^��y^��2JF�/�#;�?��vA�:�l5l��^�l��+-�G��w��=Zb��x?�����&�Z���>�D���yT�uAY��9溼^`7�W�Rjn�٣B�Fb��ؕ˃;�m�r�ׇ�;Q�t3��|A��y��/"�Z1F./(p���Ps‼�����=U��ե�"�
z���\�zC�U�uǡ��C7ɥ��*rO��";�,�R�S]4C���'�YY<N�t�����dȒkY����boB�!�V"N�r.9�m�EAW	u	>��H�L@���(�
n�K��y�1j����up��z�VF�'qR1�DT�X_�*|�'�$
`m�z)R��F�3�`��J�����͟�pi�"�^����3�k ��h�����k�0�jx�jmF1b�
�9�����7��Čz��3������b����6]�5���k�G1+��o&"3�
Z�TvZ�"�f���s`Q��9:V�5C7׋f�f���)��5�]d�9ч�����6S
���8,���!�&��,�9>��P��<+�;0JV4�o?D��(?�[G�nx�K��ڴ���a��
�A�tQ��q5A��
��oػ6���t1��4]������P��9�6��h��A�mo0���Ֆ������/v	��*�l!��y�3�s�Ժ�E�L55�}��/y_I^Z��`�KӅOi7��U�y���7��:+?�!�4�ijGB�\�ے�RE�h�}Y_���.����X'������>�־���12�@wn��K��T�!@�m��G0Ћ�R�E�Υ���Lp�r��B�ߺ&X���"Y`<!�(��:�Kȷ9�C��.E0�s�bZ
���0 G�.c�̊!c}�C���艸�'�Z� �JSNBJ�D\
t"KP�z��.Sn��h�
���Ĝ~c�����瀿G+���]��J�T݇u� ��q���p-r�k����o����Y8��H�k"hV_QP��fs�Rc�-b�!�=���Q��t	)�`���`�Ji�'��)�r��3�\��9A�c�P�K�B>!��#Ag�ˇ�!㯦����
����a���:Q�QI:�_g)��D@����&"�TX�����"r#|�mJ���Am�
*3O�F��
li�v��5ŀR@��^/��(l��u~<tw���/�� �u0��hHܯM�W!�Ҭ�8�t�X�v(�#���ϒs3����Ԛ�!�f#Cz�&x{���5�>��Y0��W7�jh�*g:x�zBl3�KCo�Ib�������7*�qP�`T
�q�&h�����Rt%h��VA�����ݐvx<j丽m#'���)F���sbi7�������/�S�$�53 �"	��>�[�4�*��
:�F\?��WI���)���l�>w8��d�-6Z.�,�d�)�#o@-��%�v��>���!".5��j�J�]�f��5�AV0LI�w,Ro�l�	QR�����(Jj�
)%�.>��vJ�.�U��T~u��
�{����q��2���cV>�:�wR���ݣ�@c�|h��he�k��ո��܍̢)�γ�)�F�m��k�
DE{���ZO��d�c�NĢF�g���1�'z��!�e(����5>���5�E��^�|��ɨ�񚒞�!ӧ �jʟ��Z���`��ا�`�!~�\�F�a@�+q��������Q%�*����ϵUX���k�U��U�K�r�OZf���Y-�~���!��
B�3�R�
�=eK:$N�!S2�%�ހx�;��`rĪ
F(Ġd�,`v�1���fF#@��5o��ʵ�@ϓ���I���$@���"@�%������/�W�FX\�!w�l����6����i�5F����T�K������Zo��#���������a �Ns��Sq��j�
���3s�s�[a��q������xφKk�t$�D>t-���[ڌ
�"�*�`R��g��*ߗ�- p>.<-ʾ�E�ТN��k-
�A�Nb�:����°2���h���5�In���7���K�!�D���2�d��Ey6H��f9�b��e�-�(��p��RW�R�|��Lʧ"Jx&��4�5�/T?�7��#��!����6r|�?�[,n�����vf�]������Oܑ!5�� �+|&s�x�<�+k�_VӇʔ����ى�!|�&���3loQGF��.��T���Qs�G����w˷�~R8f�O|������5��m#k�y�>��VP��"a���>T	�g<(5�a�|��
����<(7_��XO+������Ũ�ٝlC���x��9��]+��j�O�iT���py!�_/Qͩ$O��-�(�v�U��`����T��,�o"��u�Ϳ��v�Ụ��8�Jv�33V�ic[���vr��91nl�%X�Ζ�a�y�F���~j�9�Y�"O��Q�Q�!�Xr�,R:1���#�Y˱�^uC��<:-ǹ)!~�A�O����u5 �ιI��Fn���F[�{��������H]S�fqH���d��ZS��	)���WԱ�?��C�rF�㩴��ɢ?�&ǍV �T;�j�ؘ��9��\E��M��qy*D�0Y�Qb�U���gΦ��!����`��K5�p��l���1g��b�.���yV�ȓ��JZ�ُ������@|9m g)�%J�!{W�T��a��W «�G�\�x�6�a��1^�!�k��ƾX��
w���?�eT����lJ�ÃB�V��~D
�*�T�ٻ6��9�y
=�!;;�HО0r�*���v]�V
<���Pa��"t?:Gu�[
м;T�Ü�����r?'�*ʲF��c�hsvt!EN>���
��=�P�,�r�0��-ƪ�z��%�c@zJ+c���_W"�	�S�`�u9�ב?<!ّ�'`G���7瑰'j�e�e��.]2��r�h*�B�]�$��d6���G�0'!A��]}��@���Q���0+9a2>�:��bej~C�ɺp�z��X��������
�<�\vZqe��f|�]��]P�-t����&����G(`�q��q^�~n�,�l�����h����E�>�j�C�8��\/�0R�0��w`��3�;pfnأk�3�03fN)tM�ahH�pax�kJh�sxm]RX�0$a����%�~/������@C��(%�CA��K֚M�Z����!"���^��D�B&�-�4�f×�&���]��j����-��S䜧��
�'3Ÿ���ln�鄽s�U�k�n�`(��~��+ȃ�.L��f�-'�|A�'�{���-�Tc�^�{��LqY��MG�C)PRp�3X&X����Z�>H��g5�A)�˕ �YS��޴ C0�N�a7�����T&�z�>`Lr)��(��f�|�e ���`'�$W�т�T3�(aJ��-;�M��:ԉ`�=�#�q+�
`�z6�\oMvL'G;F���G�
���P�����v�K�Ɂ$�滽�3~�;k��=Rm��ߖ���E�׊��J�K+��}��
�r��Q�E:�ND���7)	D���꭛�v��[j�|+�O��ݚp��Xjm����{d�mjuϖ0^Z�Tg�2 ]nRrN�(�fbzMO$NM&���S@m.��ʷ�pτDb�U7a�j~�����ٴ�������_+����"����>�4�^V��d昌~��
�T�9��M�����2��O��01>",!�bQf
�d-|I��r�W��.�JK�� �$0�T�&6=�wȵ�+O��6��Q/e#����Ns�/�6f��"@��WZ�jG�x�²G<�g%څ�����A����6��E\oej<�
�
KMK�AV�e�?~�g���.�E+�p h{ȋ�tv�I	.\��n\�
��j��E�:�
�_�5��[�j�*c��∁OG��{ب{S�Q��[9C_n��Xx0K{RG�B�q\A��������f/��
%�}����{;���[��[������!ܡe�:-���DH����������rj��pK�0΋�D��*1�sb�YNT'Q灎I
�o1*�@�N$���t��	p��@`�Gp٫
��~�?^��K��l��Q*�
V
��7�X�.�����a�Dp��o�}��l�=
l�jfB%�D�h�Lq{\��hR2*\��D��1I�	:���7���xm�/��Vͼ��*�Tg&q.W�(!�ě�������N\�,Fm�7�)|���)Tó0�L��*��!��B?��3���S�̌*��_�!�ʱ�����q��lÅܳK�MKe�۪2^�����.�/_����[��(��a7�A-��G�J�.�R�GK�*C��,(�gQ@�O!:�!ϛ<L���qT��S2�_��p�T\�R�MS�u��LJ��4I�r�}�sP�EPF�s��ۊ{�%���B���7x���<X�=T�Rн�OA6��k!|7�t>{9�*T�y#�����􎭣d/ap�<,U��3tmE`�S����Vr�蛈�:L�p3L�
���T�ۄ~�po�2r98�Z�b�1�"�w����7��`�q�)��0{�;��|*hs�ɟQ����a[Ȇ��J���GHu�k�T�C�Av�ʬ�.U�u-'Sq����y����-?z��TDf�x��5P��x�i���{��|���s�T|��4����:�+k}M��W���f��u�^�x"e�d'�{.}�w����1�{:���.��]��{.��)��L73�hJ���G�m)�Yv���,|��?�.�@@�hQ
.���]����$�i�"�x� �qk�d���o+`��
�ǭ��:�4�)����4�m7���.��jv?w
����7{�bL#_V�MH�O^]F�ˈWIم�(��4q�I�bf�g��:���|4O�����3Ÿ���4�X`0��td���Bd��Z[�.B$hYS).��@ �[�K�XY�L6*�h��}
3�G6@ٛ'�o��/��a�r�
�y��i�(b[>�_Y�,���Ɖb��"kP�:-�U<�>��wiYFsЖ�:����|�Eݮ��ah(ET�A�ky����E�r'�yh%3��]�,fl'ݨ�v/��VťU}�	w��E�<�{�"1�����#)Iiwm
5}��Aɲ���
J�+���F��u,��ĵ�������m��e����wsO�+�lmI>�2����WT�e"��I�H�\`�U�88N5�8����5�w�T��8���h����F�}{�&���t�:����13
�5�E�8#�I���"Y�O$ټ�
���I*��t���)��, ؛��GPl�c~�&;;}�p"f��g\��
w��Vt�f[�b��Jډ\�,5���&��k�~)Y��&���SV��U.�>b[�(�`� $����!���>�Z�0J3���)����9��K�&[1��(3�i��|]2y�ؖ��f��T,l<�ǔd32�T_]ӳ����Cn�r���R����_L�,r�E�b�H[Xi�T��JW��V_Nun@i;CwA8ЍH�Fũ�N�
|���yoI�
Q�z�.,V\����0�.�ҥZ�eg"�:o��܂+�54,��8@���<�q]��7nz��R��`�V�?�#�2߳��
�j��9�A�	P��47u�2%	�A˺p/� �E�lb����\Z�J3��S�;��	�d"GG�6#��P��U~A����C_��Ƭ�ʵ�F
�|��LĖ���$��=��ui�u���t]ҴI:�H�nJ���|��Ϝ��N|:�N�=��`/}=�N_�c�|��~�*�~�D��κ�`�Y
�kA���3� ��dX
��pJ�%W[!�֥79�9��lAZm�6��&����WWb�U�����,�H[>���U0�y�F򚶧�l��I�b$���A۠5ժ�W�}�/[ȅ�HT[�J����n~'6~�b��
�U/�ۜ��Z
f~s�{.���kУoVX����N��ԃq��!�D԰���y��*]^.��aj�W�-�%7|Mv�N-F�1���*�_`
�_a����r�s��KZOT!�Sg>�:����|��o����5kqI�o����y'�.�Y[����mN��d�!+��|���lz�fY@~�!�{�E�`��3v�s�&��߃�����,F��^qh�_\C���`�#V�ه�M���]�EA��@h�c{���]hh��Ԩ2|��zy�ӫ�U�.�L�Я�.�����\�?��K��U�|��_��&�?s�*ЧV�L��1�b�NUJV[��>�(����ߴh�:�"�Z���Z�|@��*x�D�;��m�Z�T���}�,���$�Htc[Y`��Α��Z�Z��li����:i��E�j���&�,��o�ċ#�����6�U΄���π�(c��N�y�9P��{��EbF�yp��s�x��B�l��W�=�<u�E�`�=�E����fHƃ�YhX�Z��S��?�Cru��ff���?C�&�IۀMUO��V�g�992s�2Th ��U���x��
_�"�{�1tBX�^���+��|A٧�e�^�q�Wf3�nӂ����9A-�y�ɀ�T�#[߱�k�"bD�s�ꖧ� �a��ʋ*?A�f6�Y^�/y�J�du�<����Y
���t�L.����O�Fw��y�!pB#ׅ��!U����s�dno
yd��n�2�	˳�}�A;Σ.�Λ��C�p1]�	�d��M��� �m�.�.RZxt���>D�nN2�TۣdJ��4/y��\�W���kդƎ��A�e�"�d]d&R�t����::�<��)������c�n"]j�TҠS�2L��~)4}:��h$�A#��	���I�9�ރ��w��1���u�@��� ��7`1	,h{[C�}S5[goL�d��#m^A��'��5��P)h�י���s��XS�g��-��A�B�f�\�]	��0Vq>�U���wnk�7�r��\����o���
Ը���AոR�T^>�uڅe�al�.|(�����u���ui���
��㦪�[H�ȋ�A%�4��pA��C,�-�S�!�0E��n���Ty7���;�I՝��u������rV;��x9�8|�h���l�$��,T��%��cU�Y�}��Rj�+su3������eSn�B��g�9�:^��]^�q�3Q�T��)U����e������W/�F�jqh�́��]	O��ug�,������)��Մ���=�I�K�0�Vم�m�.��3	�v�Y���*�ӳ�ێ��E�6��8�ۋ���4)8��M����k�\�g�r�m�i▵=rpAY���D�,r���M>5�$:c7bG�q=t+��!��o�[�t?���v�	Չ@�P@_��� �Ȕ!M�#/z���B9N�a�NJ�e�#� �J�WM`���G�T�������ꉏP/��N��2�*�*������t���u�ێ����a���:�6]H�3�t��%����
�q�P���Z�}-4O���j��rh�?j�r-���B�G�U�݄�`�뭋zo��|�GM8�	b�Y��A�ּ7F�z�^z�G��m�C�Y^�:��K��TN�ڝ	o�x+#���7���W�%��RUdg�}�/�^�o�ѾU�XfC��t2��ﮍx�bt���}O{�����c�q�}U4Ю4@��X��\��b7�����Yb�q��+F�pdQ�p4DS0㫷���ܱ[B8 w�#�k	3���y\�i�%�"�n?
�.��r��T���ոM��64���2ȋ��ЕߗK�}����4�j��Ĩ.O�󯾛����]��S���_��xn ���s�n��%�hn�ބ��>���i��~�{�:r�+�b�� ��{U�D�{�ƪ����a�#��=�ѓEK��;�O�Y!v�����7�U�+8�>���V.��{��=껻ie�,xмH�`3���/K
��d�?o5�Y���:�y�/a@���|�hS���l���y�TB�#�������*�ꞃ�}�0>���ɺ�ʈ�sj���*ɱ)ң�
�:�ᓵu�e?}Y߀+)P��M��t5��I}=�*��yT>z��YR1�Zhj�,�q{�?N����Y�ə"7Z�*��BC:h���؇2nCs�%��j�hėd�l�]�ݻ�^vԀ����%�^ᗶjU��PZ	����Jh).���eߕa2c�S�6$���؜�QFW�m'�q�#D[>F����!�X�嵾�@\f8�Ć�)Iͯ���]>A�w�#��z=]���L�t��؇����h��,\B�z@	J�"
�h�� v@	x��yI��� �ܳ@��h�t���==���s��8�ጜŌ�]�{�����W��t`�o���q{ȆD>ޒX��B�i�޹@X���M�y�]��;QP���7�����q���J}�N8����X-��̪����}�d��q?�Y����<���Ss��s�؃��ѯ�:��b?σ��m�����RX<�X2��g�h�7w0���Ls����.��f=F{�vum.�l~q���J��|.^���>C'�0�7L}�F�+~M�=�]�pj_gq3
�a=ލ�N��@HT���l��}��Z<����|䎡����<~v��(T�f�F~��|��f�����|j�xʒ��PXjԀ`�\��?S$f�*�d�*�dE�����dž#Ǚ�S7X�}�ǃ�S�.��D��h���6�����Y�Y3�m����/���\*��u3��1�Zw
��G�!�14���e�`B5�NM�lhx�r��6���nh2����q�6����;uأ
�;�h[#�[B|Q�/ �����7��7O,;\��Y���_A�׎��(3�cKH8
ݵ	O.C&(�e#��z�[���!�o2������r`x,��:9 пS���cN,f l೛��N��x,�*��F>��1
�>��S�ZA?��G���@�_(�:����S��dc��3��|qh�挦��Ӭ��J�xq�f�˻[���
x�vC[b��->No��E�+M���z�~���~��J��Zj>quR-��ڋ6u�ト~��'	=�b��>��ɞ1�∦*z�
�I�>�BC6��>��~\z�����.�Z��3�z����a<�##��h
~����@��v�w�ު�Bq�0~,H�(gđaa<��9̣��1̛&;���.�mI_��˖�-T��u�$��CȖ#�O�8m�p�	f�lJdz$?Œ�=b��oi��Y%�P��٬�跏nrE��꥔�Z<�
�$�{tP`�-(�q�˦z\�A�ʓ���Cfi��d��1��9�|�J�/vd�tp-m8k쯀��{�����q�����Q$	�?<���R�����Zn�"nH�u�h�
�l�}`3T��>��_�"F脎S��b�04��(�-Z����M�T��J]PjD߫�o����0�s�.���S3��/5M3;��M�~��p<�,��2^��IJ�%���L�A�*�Y�$mdu�����PT)�.)�~�+q!�]MN
t ��Ɓ0=���*Y�%���x����}N~��N�^f�Z���0�F\��
��Z* �e�c�!!�^�E����1H�ٍ33v�,��6�>J���Rm��HꛨZ��ri;Ug*6��g�/�����GK+��=1�̻sp�)cw�ѷe���x�	tT1��h����Y�%���h�BhJ)2Ac֎�yS[[7�aBLK��+%Lk��>Q�MV{�ɊWNJO�8��nbDqhAe�����l�F���!-��\��ȪO�H�Y\�͠3�i����]�%��_"�x�)a�3�~:������'?�V0pplॱ��h ��u����P���IOE(�G�j5+�S��]�:=�k��@�r�j����Q�@q�2t���3�G�Э�'?�U����<�{�#��U��"�^�n܏�Hf��y�2�U��NP�S��t4����j�#!-c9dtȏ��8�]dȏ�v��a/���HFu꡾D����:���lh�$˔��c��6����1���AOoKq�F�qrT"*��T�v�/W�G��0Z�R�F=������];�2�#��9^i��PG��C>���EL
N�t�&���(F����tM�	�ί@'=�5!m����6����71z��,�z�6�܃���̉%�̊qmEl��CjTM��\6��s=Z+���؛���\ˣ�_�^��^2Ԏ+P����B.44Xu�^�0i��^;K��A���Y?�ܶN����}
?W~�8�t�%?�jx��\Ůp-'_�+ț��~Am���]7f���k��\s�
�u�H�&O��r��q��r=u���7���Qd�aYr$��`�\l�l����.s8��q�]��o�7��h}�k���ƿa.�7�9�������[�uc�?�7�$>����B
������S��`[�"��m���g6y��)S����2���>ºP_�%ц�#_�����m�xʚLf����p%3��}�>H�	l�4L)<��;@WK�᜶��<���-l?�L�)��؟\x�������E+��ԓ��^��04�T7��q�2ԍй{|y�;�X寠��1��:��6d�e��="eK���ۍ�
R��x�H�K.tB��>�B�N��>!OY���M���`��%/��D�~YyQ�� e���
�K�ef�жi^z@���.�j�=JEP���T~�xa��(�����Ŕpw��L�Z()۳3s>��7���I1�g�Q<�	�<J�QͶ��D�Z���1X\ܛ(��q�O�����h�]�8M���%�>L2����H�d�#r-_0H^.�)��|��z�ClGws�v��r5�Υ@��TuS�����uiԏ��Z���ׂn�t��aԕ*,�=�i�a�"0A�����!WC O�R�@2�t�Q�tJ�Y�i��\��‡�4t�ˇ9d�g�͸���
m�V������R���k~b�UYӡg����<�;U^Eǽd���V�CL!w̑��IvVl�ȍwlle��-Pنd�8.��$ 9�&	����44͋']���i�ORw,-2�5*������Ȭ���"޾y�T�o�kI$`�r�Kо�Z_�����ꌷ:G�á*����T���N��#�*+�GxY�O�XayB+Ix?�y�̗�� R��n0IN<�H�g�p
dI8����X'!w�OV'�f�t���B.N*Ϟ��ze�\�3�5��\%G���X��t!�o����W��M�#Lk����/I[yvJK�g#�����ʜCˁ�F
tv�0��^���)hN�L�5~&XM�C�\r�:/U���M�-&4�H��k�!|ګ�ܣ�0.�P�,O50M\n�B�F�W�|F�=CHib͊�)H����B��~{'�`������\��!�0������c?���U���y��<Ȅ�� �͔�@凪���&��S/�����P�u��j��Ԩf�/�����j���e���OH�	�B?��	�;�4��eP!<�p���+�imw`#�J�T^�:����\����p���-[R�b�P;�V�‰q�	PxC��LG��!.�����s�%:�,B�C~�ü�O����Kq��@�MФ�e�+oJ�ƭ�;&�\����eb�$$Bהv)����V�M_D���Lv��� (*����3c��#�!a^⢂ �n�ս�sO�#��9{A:q�����D�-_e�G���&������6��z�3u���g`�����ŏ��2�~�=�G9�_������0bI��%�̐�Ϡg��Z0��jԹĈ7�}���\�*�%s���x�?����	9%����c���V�zM�rrN���3���Nah�����&#M�1�g�R����Jz��h`�) �b?CE��ϟRgo��㮤���b~�S�?��Ï��L�������{U�!��^# ��Х���+��#����ڧQY=���~4Z�x�TN��	}^;)�q�ˋ�b��oӎ;�SB�M�t4s����7Q=��$w��뚗���B��r9�n��w)<���,���/]�sU˺I�w�k(=ò�ݤw������:z�,&}�Խ��n7�l(�4�,��۔**1'���0�C����ڲ4y<yCc(�+�1�#&�\��'�N:$�+,�8��k�(/`[B��拨<5d��[gS���P"�������xK��41jca@nw��0���z]��������g���Ӝ�Ǘz�Η�5~�?��Cʦ�Vc6,�����8��N�n?�q�J����Ce2�*|�`2�WC��Zu�\LOƆA�Ps�(=���[_R�	גM�7���~��1;l�FH�h�F��ʅ��y^XC�{����\L���`+͑�&�N��&���M��6F�<�3�r7�|U2����h8)F�Z[����˦�lk@�I��|�\^�zxG:.�W�Y��aͧ�TΗ�0��M�р��T�9��i�0SW�`�%�"͵�‚Z��θ�Ruۇ�>n;#�G�l���^	e�6-37)?n�07�n��X�d�覬�ʥ�1�EU�o�~�7Y7�l�E0�š��d`�O�ku��B}���5�j�8d����W��jnw�4����@R]���Vh�*�B��ƈ��q��(�9���$g���w.r�)�U ����'^4�����jV_EYѩ1��w4���;cE��+E��$�|�en�Y�m�j`d���}�w�UP��NBP�犤�pX|���e��tn>�9�ez��1D����'`�����}r>K|��C�R&~�^����w�Q�-.9B�
w���Q\���x�u�1�B�6\qA���Ӓl+�%����-�+\�s����c��_��}��L>/�g�>�賟>���^��D����1�$�a���$�dRP�愪6
A
�^�����;�9`���\%�#���y�>�N�nx��Os-���Mc��t�Y�+�9�Ƕ��ۺ����w�(��io����)S\��ҹ�-E��g��\'0�ަ���4��,��>߈#Dbs�M?�ޮ1�')�Nǭ��"��Db�����a>\`?���C����.����o�߆��w3��Y#�$�X>�ŋ�	�2��D�`E@I������J��i�}���r�S��� ���,&v}�����x�)^J���b�#�c��Z��K@��}�C������\�8�hJ��!˻�~a��
�j�Wl���ؿ'��c�S�ib|�0�^�n�'�)�g�~��q��z���<�⑲؝4u�RA?��ZJ�Ǐ��y�C�Z
���e&�X͵L�-��8V)�Ei/����-)֗�7{��MF�<;bDn�	<*����V`��i��\�#0fţ�Q�M�I�j��Xk�#xﻥ�C}�;p,��&=n�MX��U���X�t
t0��;ČM��x�-	�v�$���׺^^3,=��r-�(q��]�f�YL���Tه���=>ڳ#�&�4����?��EvޮO톊
�6��>�v�Κ��C�?P��)�7I�Z�^$ӟ�HXdH�@E�~�:�H��p�l
���,�%��#XEu��j�n��n�J���}8���z��iZ#5���>֣c���T��ڱidEv�0R���.<:��s&d�N:�>��K�4t�_�M��N�o�n����K���c�i���?�U����b���6�KH���$�C��Ex�Փ�,�"y�R�R��οFB�R/��� QX�S2E�P��4'�
 ��$�h�Z��m�䲸�����ƃ��ո��^�ao��j�Ano���S�n	���m!��/�)�G��u,�帒�!Ì�I��#��IL.�;G;]݇#�;|T�ןd�� ���R�)�'�S~�"��W��4�F���y��:lMM�x+�!����$Dӭ�����Uj���4���2��4�K�H6r-
So�j8-�E+�;L�w5��/-p-[у�l�q$C�!��=ņ�� ���(
0<:���ڇC���)V�܁�᧕��4 -oz�ʓ��O	��~�Vs �q�`�x�|o��z�OBO]���M�)�h��E*���hh��T�C"�Q!�j:��
�9��)h{*B��˔ O�py���.
I�<���⅒m�� �5{�r(@D�mz�P�4}��:t8�ۚ�n��_�r�&�ژ"e!|�%��>:���;���j
T�|!M��m�xt�4�h�8���`�������B%u�������K���Y�|'�B*0Q=����P�L�&%�6+�Iv|�e�ZÛ��}�G>�z���):�k��ȣ_%�����o�>��52-E��/�pˑ;��+�,��M�O~�NLg��#SƿL'$�st�A�e�-���h�n+P�=G)K�G�#�~U5B�����{�� -X���h�E*��D�h���ѨU��j��_�7�k$�_I2�J#���Rm����������)�Qڈm@
h�h�Qg��_�������_}���	ݤ�G���#��	�v۽����;�:����^��5���7����M�lg�.��G×��W^T���z]����2ykQ�j��'v_��q����ZȈ;Rj�YS{ٮI���ɺ�F٪M��R3+,x&���u��v=�쪙BU-�_7Zv�����~1�������3�'$O?/��d��^�@3�#kl'o�V
'�'�U�����X��ƹ����{�
Vۤ�FV�A�6�EnԓS��,�Jp�Bi����=zr�>ZH$a؍Gm��5�qǛd�Y��k��m ?��6�2�1�`r��E�-K5Ь�0�d���|�u�^��	�W��m�KB<�����T3��)�DGa��{B�F���_�NP:�N���Ul�i��+�mW�r;��Gیw��x�h;�w��;.<������`Eo�*�
ra*��na��3�U�bhSFoS���:U.�S&I�s�d�vF-o�˿x�ꇇ1�D�n�!m���F���Z`�W�Z�{�U����[͝�xU�bPt����lg��a9}X\r).���.�[}��"�b��E^�[�j�t|�*�]~U��00����X���%�^�d����tu��v���
 0jEV�x��׆��d���aд���J�Y�� _������\�%7�ӭ�i�#�@��z
�R�!ȇW1����~����wO$�Y��ț�w*,#8o�(��R�� u6~2�,&�r<�"U�fm]D�wS�)~�u������0�l���Ͽ�~�q�"�%�<�*����]�\m�`"� I���,�kƼѵk�"n��유��~2z	��(��{��]tij� �4!�L��kꀣ�O�I�V�����z�(:?��]��r�n8��
���ݪ�{^��U�V^df*o�ܰ�BfԮ��[}�y�
�Y{?��p
�]k�r!l��I0�(��-�U�z�B��M��(Q8�d��oX�
�_��z�=Zt_�����'��Xr�9Um���F��*U�R�y�0����$�u��I(�9��)�:��-�_٥3�V�8��ۥ�CLxB��O�]@	<�]�v��k���ew�l���+��!K�e�ϱG�hӯ�F�v�=U
]l�$�_a�/��n7�b=4 ����-��--�lB��p��_P#o�K\W‚~ji�����]f�m�Jg����X�������D�%)��4�U�J�5ƫ\�e��D]
�E�O$¸��P��Dx����3�� ��K_�p�qMݴ�Ϫ'k�m�@�.�@��k��L�~���z<�
�gR|L?�t��n��7�-!�`肅3�t[G@�v��`��Hw�v�=X��;�V���W��a•2������,')���q�X�ɱM0zA��h�Ϩ������E0�������<�	�P~�F�ep�[�/�Hxd�VH��3g>*Ũ�t݅�U����R�^�&���w!T�פצWW�/���n[�#��_ʫ,Q��+8�t�N�,M�٠i�L��t�q&�3T��3�4�����F�y,;�s�#�
��2���4\���ڲ#UuZZ
P�r���^K�B�P>��4�.�`2�ݦ28¡�\K�ah����Bj�r~��W�ЩO�PA�VA�j��)�k~*7-�������6fл~-�
Cӂ��Y�S��h4�p"s��%�p�]�A�:�s��A~�#U�ca:_8×r�C.�E^�Mkd֎Th��85m��J�t$@�*KẼv�I>��� �0�5�M�Ac�� ,G�0�zY���d��۳O鿖rx�d<��:m����$�Y^*f�`�Ƶ�y�I��Uø��v�I��8�T)^.��v�ľ�n�M��?5͜=�0�E�<���4� ��K	U�{��,&�Z����6�ꉙ��6`�@���ĦόE��X$�y�R+ޟ��F<'���㑜��V��/p���f�*I�ǃJ�*�*%�
���‰@v�3*pg���<Ũ_ͅ;
�8e4��ȲO����Z
�eV §v��ݔ�l������a�Ws�"�>�'��h�^���C��9�l}�A!��Y���-k(��nkf�D�f<-c)��Q�݄�����
���򳸾�j�wJR���7���O�<B�F�D��}h7��mS%�$��5z	c���"W��1�}�&������'����-��:�V5�h�g1Jn��AM���Q��˙�!'��Mk��n{)�m�+�AjB�L��;7N���;�3�Q5g��/�ڛ�/
/���1�JU*��<�z�A���1�<�Nk�G�j϶֎H���v
G'�.՞js�V%#�<����V
:ϺH�b����s�M�G9��A��q�1�C'gysS��$;�b��0�2d�ϲ6�eU��*>�,9�^db�J�H�t�G�$��O�W�@�@�#Z�jW�8���_v�x��-�w�M�?�H��%�����U�G��迥������]v2I��1Y���YG��y�!5{x���R�	���������Q��w�>�t�>h��2)8���@֣����-�}������1ujG���.U9�Qg����D9�D��Y�y-[���8����x���\ݏ���ս�p��7�7����ӵtV��c�Ӵ��lğ�xC�������*��t�w*��cJ�y��[�r����Z	$�<������݀mi<]��no
�����hy���~=�-�o��IxUݲO�dҚ���՛�"݉�|��Ł?t�%�[Iݺ�1 ��|	ۍG��g5G�j5�P��=���ݒ*w��3Fo5GoҚ���֥F���!9Xn,h�oj��Դ�RUk�*l7q-{�xs���o�݀�ć��	��-P�����.H��/U5�R��.]��0��N����Ʈ��9��
L�L�y�ܣԓr>i���B���
�ρ��}�^��h8�yvVTHI��*�t��pV���K���kK�����x 
����V����9GJ�
�.H�gT��d�˵�HO�B=RcxF󃣂aV�ǵvwB)�?������7L�{���cܔ-�͛
�x
X��=��#6��k��*.P�[�u��c��,���R�I�L3��ǽ4�g3u�h{�ky7LAg���S:ո�M�{���/���67�|��FX�����z�w�{�^��m����i��ىҹ\d�j`�"g��hK�Ҩ��3}JG�!L���P&I�]�HB<�V���x�F�i}?Y磠Q�/��<��(�d���Mk�Ha�,/���\����������}��x�l	ґ�|m(��\=���"�� �i��YC�5}�=��KL++\M��̅�ɌZ.s��$�F%ɖ�M��	E	��l�0�w�rQT�DI:c2P�o-$�|��x�|l� ϗ��
*A$s6���UU�\'�=$�_N���+�xt���u��noBʳ{�[
�~�JY�'�J��0�rfoѮ�p�K��cV �m䮸���c/��AnFA�%��^��4��sJ�5����#����K��^VH�V�砿 �]*���~����fV��(�x��Q�"����.��nO[�B��*ӟ�&KA9�Mܹp�}o7ӫ誆m�d��7�욳Bv� 98���_��
/�+/��r�G|O�W�]��+k���9xw�Z�����U�T;_0w��y�d�����n�A�]��[W�G�,a�8M�j�G���B�dn~Ќu��r���R��Rh�"��XaW2�˺�����}�U�]�kjk�53jg�_����"1�5��9��8�����ȼ�h��{~�����a�ɍ��O���#�X{�{f�@f���	��	^��)'~��G��
)�;0�`���TN8f?6�؆k�?�<�zW���b��`m�Ԯ��_�wC����<<���c�7��i;*���F@�Zi�Lb�"?�D\2
K���Q#B�*	��#�!:nBj�X��s����_�Y�όm(�G*���޽��w�����~x����0������7��h�LJ��Vn�Mq)RQ\@P.*$�����E!�{]J�����m��Ҵ���M5���l1۴����V��sι��~����x�̙�y�yf晙33���UunH=��F�.4<Nٿk04�U�5±G�z�R[���١�ZԔA�Kg���|�_�|/|F�^������W�LQ&UK�Lx����a�{t<�p���G����+�������~��\

!��Q��2���q(��c�v�k�x�`��e�|��˦����lEfK2[��O�?�~d���K�/��dz�.�G��빌ʞ��2C�� �
e����V��\�گW
�s-�txN�`��M���ݕ�K0���h����En�r��:���A�����M��퐣J�t��~���gd5��Ut��,��T���_��+�/���%�|Wi�e���V�ٴq_@͗��}��g�_Rr	�翬~'�B�ZR���)��~
�4o��G9���
��M؟��	��]%�O�����O�����*��}�ж|m����
��hr[�g��~�B��Цk�H��T�:/��bi���s[W^j]�ňL����n	��U9s��N�#RH͢2xp	�Ql���]���w�E�1�>���S�az���=�I�'���"����nb��6��gt%�ۧա u�8�Ů]u���\�d��N�9��t�at�%��q����1v�~������9u%`�/���?���:����N��ȴP^yZG&����R]~M/q�<d�ʽ�#�N��28Ɗ!�i�!Ӆ����)�g�V?o�>�Zs���{%V�p�
����S����3�/3!�$:��
��A�(k(�Ȕ�]|��̛���s��ao�wcL��FIS�EQ�rUK�S�>㤚*�[�eؑ��Is����k	{�~ޱ_:w�
�9��RӪd���	�&���<c�}Bxy$tB��D�iuXA�|G=����[E�9�{�$g��ڭ��[o|��sk�Һ��j;��	�B'��mL��3�6(p�qsǹ�U�z��5�Ox�T=��'7�I���c��F����t��x;cD��s1����a�3nP&�&̫�~�M���{}+�$(O-���C^ģ��~���2���:�l�LL��v3����ʮǔ+Q���)�9�R��[j=�񰤸����X�o�{����T!%-�U7A9���Zf�/�3�S	Aa)hg��v5R`��d)𯑂v�L)�
�'��������';�`5��7K=#2E�r�k~�(��c66�>�D��mi�ɋuf�\9��f�^f0�갩����Ǧ$� �IX�T� ��J{6����WLl�T|�l��d�U.˜nV��P6�*�ټ]9�f�r����>6�)el�(���lZ-r�Ey����5lUbs�R�f�R��(e�c;�㕩lޣX�LS&�9E�f��f�æM��L����n
[�a+��ˎJK����[q~�r�X����e+�b(
[W��%[W�![�º��`}�������8�z�u��*��e[��R)f+�nP�{@C+UJ{`ԭ��SJ[������Q,l��҇�
����{���|NGK�V1�l=���z��g+æ���ʗl�"��![�M���XC�Ǖ7�*��"[[º���`]�V|7�����|��:��]a�b+.�UR�k[{�z[C`��5�>l��z[�am�֡���Q�7o�H���"Xq$�R��1��b�xX���X��Z���:�ü���ec�����<����yY4���KP���e:�L��'��z�I\jgd*�D�~a^�Z��jJ�a^C5��U��a^�4�6�K�0���Wui�5Js9�`s������5^s�Pu		���\�T��0/����b	󚩹�V]�üfk.�T��a^���Lv�>,�O�F}�C��5�N�V��q���x��1NW��fz�3��'b)�N�"o���fZ�����ܱ��o|�/ia���q�\�W�z��B��oH��Z����Rė�Q�7��.�Əըx{��\��o�
����u��N��n��T�n�N�O�n*W��G��[�c�vU8vz6>i��Iٮem�w����gdZ-r'Z)��D E���N,|�6�;1�C�������t�ʅ���k�S2�t�T:X��;�[�f��xI�z�l�l��]��2?�vl��~�?R���wI�?�5P�D=�"l�r��<HM�:J{3�29�����x���m�*t����O�圃���t���SRR��V��>�U���n�_܅��5�~گ�m_��m_��]z���뗴�`q���+�	�a�ߝ��D���7q���b��
�}��U嗽�Ox{�m�Cܝ(��B���R�1�sEJ�P;�[
M�Ӡ����T4�l�Z�l�K_6�/���ߵ��3�[���BD���/�ش�D�X�me��n++E"�2_�28c[����
+7-0���>�n,C�k�
�g�q������l{��eC�j���2����`��x�ew�x�7���.����{��셿�f�ݱ�S-|gAu�6`B�����/�8w�>�}��}`۵}`��;�@�����\;]EK�%��,����:)��_�k]��[t�oY�V���0���� XX���(͑F�jV<��_��n��'�y����\x�[o{+�.w-n�+n�	���O"�,�N�i������SQ�vSQ7�3ME�`�1��{� �b���/��eg��r=�P/*�0��up��J��*�~'��D[������-UV�)m+o-�oJ�R�moJ#��j*~Ƌ��Mi�/����P����@����1Q�����޸�����Uڽ��q�5�?6w��na2��q�tm�8�{@��-J�5�*��[��QgAx`ͫX=#�����T���d�:�Z=���3%���'(�m;���^����bѐ���-NG5G5��[�,d��j��n�����ж�+w�h ���Ћ����kk�qFi���W�cpykX_�T�]�&��a��]�m&����[þ�a\�U^�m�-K+l��QO'��j���&�8�$��7�A�0��ZK�kT1���nNڢ�	[Ŝ�p�\�,�%6�]v��L��h�^'���Q��Uw;��k��W�/���-���慿M�OR����CَmD0�qb��l�s3��Q7���9���%�k/��8����y���Nm��^ߒ�Bx�.).BS�܌Z��Ww�mh1�ζ�Vl8;��Θjl'����
�O�7����fa�ߌԍ�)БX���a|J�qW��{�l�@P)��5���^���g,4j!�;�P�E�sĞb܌���c���	:UE��\м����\�Η�m�T��/�`���d6�zee�#�
f�@�m.��ӪS��e�=]8��e,t��2�T�ˀt�����Hn��;�@���,�_�Y�
�kgX��,�9����*UR�*\�'�����H��N���d����1G�{�~�ρ,��/Vv�om����'��B{Yx�*���c�!�uju�PQ`P#���U����[`�6�4W��j!�;�kr�ֱ�S�wr^���ػl2ߩ��`x��k�k���۠�9�p`΄�X����+�h�]�zR�ېOek5i�`��T�:W;�o۸�T�f/.�;͹Ye�2��޲��L�Ҙs��B�8��+Λ����7�]m���u1�8�f>g���ر��*;:�n@Y�F�@��8�ơc��fx�{iD�nՈ��kߜ��5�64D��e�{��m����EY(�%l\Y��/:T��g�[�`�1���W�V�n��uӴ�f'�Y�W�[��Z��"x�`7Acr�"��N.��׶�¡����;�*�g��5v��}�)J<vu��@Ee�6��V��\��ar�4�?(dž�7W~[�o'p�u~Z���G�|�f��[�7�%(�/�~��
�#B��&
���)���$�7c�(�p�/��lo�,_�n��^��.瑊u��L�0/m3E�n�+���*���Bi8/�U�f
���8�fۓ��fu6S��u�����/JF�l�|�ĕù%�m�r�m_8GW��">���k��O�����k\S���:��
���9�<���7v?��+Kp�b]���.Q��sz��W.'��S��x��/�Я%k(ͅ��[���ͫ�W7{g����D�&��$Ż&�gKIy���>�i��2��E���{H�$e��v��J�
�}<ME�q���GH�-Y��C�R�h�\M�'8=do�O��fx?���B��d�a�LE	8
�� |G��Y‘��J�oSb�Mt�B;n9�>�H�.�L��&������4���)|���1����%�^8���_��Cv.�����P#�+���R���G�p�%l��'�����SP�ҡ����$#R�6�-Q
�����ALRdz�Ɵ��VZ�0#�}YZlu!B�3g��
j����D9�N��o��#;K!-�%Ő��͈hZ|��6Џ�
�!M|�W�螘sMk%�2GDH7��M�y/F��S��W��n6�pw�-���������8��q/��JJ��p�d7ew+brz3�T�|8Qw
Oۭ�M�$����H������Ps���z	�Q��lQ5��Q���f%Ѧ��3$M��!�!�u�Z�
2Cھ�4�UI�'ٺI~/�| Bi�P�
���HETd�Z�o��MT<������-��]�-���Y�F	����e�.�c��pn�z���0��
�!��ea��Ʌ������H�x�I�pW1��"ۻ�|�ik��<>P�w�m�6�̦��KZ9��c��f$�����{왷
�ˠ�?KY�ە���աl(��C�u�v�$;kKx�3���FV��!��׹��{|Қ�D5H�3Ԡ��OJ�2�)�@���
YZ�d�y��,OH��`�y�Q�h��i'2�$��A�`��،�a_�W�v��h��x'����	4��1q�܌�w�+��U�:��f!渵�wp"�Y�m��-���P�������ub=�����z/D��S����tƱ0�
/4(� ~;�?�@=bk!�dD�R�So
�[1�/H��������q��zd�b-�4W0^񺖝��:2,���ȰkRn���#�X����k�Bq��G����%�8ս�#��wo$��[ٜ^<K#[�9a(��u�z�����yLʢtd�Q�A͹N�qy)ב��+�:%�݈zK}_$� ?L�&����0{‹��[��m�$e؋�
䲭C�b!��� z�9��ݹk�% � ��T�Ź$����0$t��	�~����LE�sB{^�I��jz�NB�]��y�g�m�z.���%(���'�|���	��WU�
��=g^�$�h�����fڹ�͈��%%(M7h��}C��T�>����̎���g6u6�N�7��{eS�COn���7�U�d+$_�e�ύ� �Qm#6[�����"��̶�C'��Cn��2�a�l�,�eؽ���T�:���f5��iK3
e�x��M[����yNsp�����NԼ�6:����ΑįI��d��z�lq��g3�a%�r�����/���(_̨��w��|����5"�����pNe8T���t�����?�7��
��?V��	�O	𙕲z
���u�W9K��l���	�W�}B��
�9ͱck�&w�@>nRf��ƷT�x�'�Q|Lf�sׅ4r�����p���'JaW���w��6�o?wᬳ�B������q8�Y���g
���
$���ZN6_��]8v��p��<��ܽ�_�.N��?V���#��Pnu@c���L�h��a��~�C6��[$f���M���#1�<���OI;��q�7(��ړ.�vܵA�Z2���f�k�8$:�1�����j���$mA��g7�g��6���ϛ��ze�<���.&�uZ��J)��v���E������\�dE!I��Wn8�K8�����k4�A�B��U3��CEk�ծ�<�n_{���ʙbuw�[_q��ݣd�I9�W�C��Ԅ���8muT�
�K�CF��1�������E�{���c���ۭ��+q	�I�6�Ef�Q��Oͫw�4Qz�'���9�Si4��ې,��)Sb?��d/>9���x��=���s}�=�0T�x��Q�	vk{%+�h�\遣V�#V���Xz�_�J7Ҵ�MT	q�T:�s�:��)���Z��#�ks4��*�嗽��ǽ<�J�'��c֐�۱g��w\W&�RK�8���y����v2M;�o�c�_����[�e�T�e�i��9'UI8�8Ѿ��^^{ 8�
��UO���o�W�
�M����tә���I�D
�;��+>�~�7��7�H����~�s~rKK0=�~��C[?��r��f��(����C��ߘl�;�?/����[Һ4�3�~�q��潰u�P�o���r��c��಑�#�o��g���q(%�;��
V6�ׇSm]����ˠ�UA��u�q-���շu�շ�7]���VkPm�f��D%K��Y=���3Q9��p��a�&��K����zR�ڭ�{�_:Y�D͹�)@J���vU1��Mq���c_9T�i�]7�Jy��pC�p�S��ґh¬�����^��c*���7�,+�n5_��Q*��|����
v�No��f� ���kk>P�<>q�	�B����"����*u/�y1��y�Xچ���9�=-�Pa��d��LP����c�)�/j��sU��p}���_�qq92��������k�F���N:���p�~��Т���'�f��U2�a_٬�HK����dž]����6"�,=t�;��yUӯ��җ�f=���\�#B�~��=�����!5�_���d�;[lÕ�2p(r��"�1��co�驼�[�WqҶc%A��~{�Z�^j��%AN>\��5ۤ�S�Y���D�]6-��6<�T�3FJ{�%�*�R�p|���H�+i��[�yP0#�}\"6�n��<v%(S�]<��<���%+�渮_=�rZ���s)x��x��Y�w�7"Y^?E��N*c��u�d�7�Q�/ښ!����c���s�@�p�!%��Po��y�(%�����sw��FQ�`*�F��	�9��.��״��R��q_�驥�FM_R�"��ե~��4/��	��T�׹�Q~��OC��8��e�����k>!�p7�}~�s�F�,�vi;8�Z�`��XkR��U	=Y)�ʣ�����M�K-
ud�.�ܯ���'��+��O��W�jm�H�/�;����,I��B�����O/I��w��5w�B�R��*��(<��w�7��Z��Uw���w5
�b��7��X�|�kH�2��R�R��'R�mM@�*�TőZ��a_��M�_'*��r��p�q.�Ub��rçȾ%|/���4�4Txwk���1Z�+�8��8K�㻸�Wi�Ķ�9��Um3-�}��agM|��[$'fR#:�wt�͵4b%�Q�5�u�K��J�)���n�1]�ٍ<���y:w�XpOW0_š0-@��J�>ӻ���A'��� ��z�T5n��P��������\g�eo�|?]���@R{X�-�i�)�{k.k�%�~��(��<���a�P���CW��Tu�Y2�>0�U)u%�<4�����U���)5�v��;�$ڧVV��\������xe�����6�T�E��%����4m/S�_��;��@&9����ٝa���0=�}@a�g��q鰞��~3��]���+��v�_��{�R��YPٴƧ��b��v>�a�.0��(�jZ����ڈYvWo�Ύ/�P����X��	���{X�2c���DA�w>6k�w�*U���&N�UN�W9wC��!�W24�r�I'�+'�4���q���%����r��̀V�[ʟ_��5�q���m�����������N�/-�q�0�h�T�nk꼡���鞥�����T���{���_swʄ]ob5?�P�#�;�7,���+��j?;��u�������7�}zSu����5��/��r�_0���֦$�#�?����ڐ��l��_��;cZ�����ʧ�
;k3Q�M����WsS����Ҧ�R��a��0+O��#S�K6�+֦������zO9�K����{\�F$&'e��Ʒ�X2��'�yw��e�?S1��
{϶�ĭ�
�.9.�g*�U���K�D��{�)?�bR*��L�s�?yB��~��c�&��.۽+����:ϴnq��zO����CYu�}�y$}�z��Ǐ��o�k�<�g�M�S���'���O��3n�q(n���:����0���8~f\�]�k�nW�ʬ�R���ZW�eU�C�$��5W�a�G�R�]�R.���R�S��wڼju�p�J�\
�N����8B9~��e�uC�|�KZUބe�jd��&T+�*�|q�\�*}��:�Rs�����TvdR2Ju�$N�n��I�{��[{�KJV�aՕtO�z��M��\���c��$���o���vw����W��b�wɝ�\�c�Ҹ��ѱ�ͱ׭��<���pw�W��d�E�=��ۛ�N�����5´��s��|4r^G�)T�)��ݒ8�`=�o�.�6?̙�h����[ۇ�7ه��F���‰��"��	m�+-���j;�qdy�N)��<��<C��-�>!�"�L�^���IyE�l"8@�
�y�B�@� �`"����~Ep�`���v��8��	_�A/�h�16�<E������~�
A/�A�	�d��&x��]�ONT�F����&L0� �7|�K�l"�Cp������6t%�K0�`$A��`�Q���A�i.��W�zl�E|9�"�%Z�o[D���_�Ѹ���H���ri<L,���~��k!�r�bff��r&Y��*��$�#���4�E�?�FgL�?
&F�Qb��&B����&b8��b��Q�N�.w��Hr�����M�avpV��<�f�Ֆ��eg��=2++g��	��6�A�Z�� ������j*�9�ҾS$ҟ1��H�
C��!��X�"�C��g$�DT�k7
G��N�d�	r��N����0���i���N�S��|���o>�2�x>�\�(�<����-�B���BMZ��`�T��!����{c℞>¥��$��jy�)7;�3�ù�/���\1���O,S��:�\�!�tU�A�����09D������*e���ΧnLx�Aa���Yt=�5�R���)�������z9��8Bz&q��1.y�bF3N�7����\/�^��Φ6��l��d��L9�R�IZ���g��R����3�Ѻ�������~GQ:��r�s���a��^�;�.A.:t�t��GAZ����m��۹D'j\���we}�%����^��՗_߿��4�/��Ǖ_.�ҝN��(��Ө���u�&E=���N�*f2�=4�R�Prz)^�Oz��Ρܬ�j}���
Ngi�?��rl��$�,� 3Wo�{�t�j�\׸<N5�����y��S�;UK]O����9,]���}j���[U���A��v�B�A��T~���/�P>מn*�N�z��W�o���N�2Pk�����{�4s��.y��c��I��]�Zv�·+���1���,b��̰���G-�4� ����i��>���d����lK��O,��Q�7Ý�d�����,�2�>����M�,27�y��	5r1����"3��F���A[��z�%��L���]
#�D�	n�b�k|��B�ߐ�d5U�{��H�^�����M�b\5�N;�Vj����ן����'�����7�f��,�O�{voYƊ�jFs-V�.�P<�	��u���t�%��\���"Yj�܎��6a�ˎvC�;�5�,���$0�L�YO��y��5.*�:�:^:>:z�z�j>�\y��y� �T�1�=Qq��ּC{@�|�[2הl� t�Q���@M�D���ʴ����i�����񱻮�ԩ��Y8���O��Y�ii=fq&	T���I֩�\��s���wN��h͵鎑��|�?�8�8{6ddn^�aj�$.?��<{j�&5����G�Hi!�A�f!
�G\���6{^Z*�18/�m�����5�dkZ�U{eWm�9��h��T�"�#�_��{xzy��6j�įi3���Z����[�nӶ�M7�7�ҡc@��]��z[��ݺ���+�w���BB���a�3x��ظ;���3a���Q���nj�k�	w�ܓ:qR�5}��{��f��N�˷٧Ϙ9�gϙ[ ��?�+�������o(�0W�+��v�y�?�k�3Ɵo�s��?=������+�t����]�SK�j�ܯ�F��D?�Zҟ���w�$kt�~�Vzk��·l��y�E�,XX�ȹ�t��e���z��+]�z�c��]��
O>��3�>���^|i�˯����-[_�ͷ�޶}GY��]��ٳw�w�;����G���ώ}�ŗ_}}��7ߞ<���J�w���㙪�~>{��.����՗.�rG�pCM��4�����;��W��K��&Z�x�=5��;.���K���2�}������;.��
v���HM�?�b��œ3��rf$�Rm�C���|kޝ3��l���9yS�#Y�3,5�9ɖ1ݚ��k�e7�]MF�S�����rf&�Ѥ�bf��xW�1�U}϶ge�V܀�5b��-��=cbb���	��
�C���~AA�	>�ݘ�D�{��C�3sg��K!���%×�|t>x>P8��2�x��-��(���b*���„…�k����B�O�$$� 6s�…�KP6S�L���;#7�V�XN�5|j'F�ꞖEJt
_FeL���m���%cl��rd�?����G�㚢����R��1yy9y�l�T{��)Vě��N�Ȳ��m9�\k��:�:�nK��t6,�K��3�f�Ss)P���O���&Ϛ�fN�˙J�9��xƛ�D�P�u�B�i|�˙H����<�n͛��=ٜ�]�o���"ߖF��s�2&�!t�#f��I~ּ�"��zf�&i�L6vS��xd�/ԕ}f���D1����]�y<�j#g�̓rҬ�ts���ԝ����qN3�̉�rm&	O��\�xjjj�PZS����J"�t�N����)։�䘕�m�o_o3�dج�������t�5�ܥ�=?��Č����]�u�FV����ɞjͶ�2���5ojFv*"��6͞c�����$U����ڲ��s�yb����(C�j�32lS ���<��eg(3�US�t��eL�V�4+���l�Z�G
�re�]:v1�j�CRj�\]n�B�ee��@��]�+�4̇z�,o���o�j�N-EF��:5�6�֫�3�DJ�T�c�R��L�j���7Kt�jKW�1�����`g�������щ�?�e�ܟ�c��u�V�-�b�<����IT���S��.|~���,kJ��~�O�ȷ��A�wn�Dc���@���~�U:̏4S�����YS{�U��ru��]��nW�������������"Z����N|%����������b����ݠ���0�R�+��n�cj���u��p~��/����Y�@��ī�<���tu�&_=��v��8���t����4v\=��]�����?���4�����7y���!o5L��m1�+���+��^�R�	��>�����Qk7�>�h\�vCèJ7y&Z��&�ڦ$�i�fݐ6��x�D7|�3,cbf��Q��ڬ�P��Nٞ�G]��ۯ�ɩ��9y��5gY��&S�lkŎ����ɲF��b�k�Q)������Z
�rjw�
f����5�yQ�b��fj�N��9i�,�`�e��NE�'=F@Ӯ����,[ƠY6먜�4kԔ�<�F�+�LҐv�-m(�����6��i��12--��	������R�WS����Ts���H������3rx�0}��(���BLg"I�H1n��<��%z�s*�\�"q��ȄX�ު�Cj��.V,�Ɯ�lR��A����\�DK��v�s��yT��f�"�ud*R��%I�IjLR���H����֔����S��������K%�$xװ�Gl~�u�}�dk^1���5Qy6bmV"�"��1̚:�z�����䔚�q_]����܌�;���k�V+ϑ���٤������,���#��@|{�s�������}ۇ7�Wq{��q����(ƽִ��Iy֩\k���c����`|KüJcl*l=v'�d”�H��%��=���N
KL�=2*A�~(�;c�aoL<',3ҸR��<�E�S᳄�]�I�s�"x���Q�E��,�t��Mg�H�V'�f���K
�1���x�W��wͽ�=*�U���j��`�cA͞�"FY���ʘt��i���1u��|�u*�*"���W<���\�TkE�,>RkI��j�Q[��F�;�O!���Ɠ��坓7؊C�.��n���S�� {z:i�X/�j���gu�F2R4p-)5/Ôd�!c6Ҫ
d�.��t����k����fUj4|�������0�H���;��^�9R覺ҡ=���u�ҹ���߅����	[�t���L�)��+\	��8��>B����F��X�kb�A�Ӥ�믹�{��4��-�{�=R{����8#5�D�L���坥�O�W�����p���j8�����C�/��YN���Ǵ�u>����ܷj�}������Qy��L��ҽ!�?�!���Gj�m�E\�{������oF��ixQZ�ox����.��($x�~��黁:�{�Ϛ���ת��I՜��q���-d�
_���zs�λ����|��#5s�?���'ڈSO(O�k8����6�:���>f)�2���2���_�U��s՘�oD��k�x�`�Z��+$XLPD0� � �`<A�0����p���A�t% 0�"�#�$��J
���	N%8D���u��6l XFPD�ȳ�O�M�6�,�4����!m��	������ 8D�����u�M��%XA��`!A!�L�\�{�Xzk��#�#���E(��N��`5���<�����8�o}wW�{��'��x��4��o)zk�K��oz��5�:�����^��(����ӵ=f��6���u� ��fX�?���M��6(k7-m��UP�"�}�����_��?��͖����p���J!�\��!���Zr�|�N&�"�
�|u��(D�"c� ����#C�qG����g�A@��p_р�3
��ހ��܏6��㎾�"��r
1��\U������{��n�ߚ���nb�W�{�Q�ߩ��,z��y����{ּ_��{T�K��]��p̡���X�_��t��]2D$''���a��Ղ*,��B�b�
���O�7�xC����O?�T\�|YhU���n������~´wƌ��zP��.�1c�l8#T�.��^z���3��g��r���&P�3�:��g̮�"�=����?=�Z}/@�����ޫU_^�wJ����P�5}�=��?p������5�W�))���7�W}�ׯ��<���ՋT8�4�~y�X
P�E�ӻ��[޺��A"!��=�¼g�1)�
��Tܫ��)�b�˷��G{�����7t�x�����py�����Q.V,,����4z��j�Fx�o�ꋒ���HBQ����8�zs����-|j��-�ۗ�(� ho�B�64
���/�( �������D�^B�5Y�#9�ݻ���������%�˖-�=��x��X�?��q��)���b�e������$�Ͻ_nI�!
v�ّ~o�(�"J�!e�����{~�%eY
;5N�����?5z����z?Ofʽq��rs��[�eǸ�)�@�߱y4�{c	�/��6	���۾��i/���*������	<�0�|f=�:u���"((H0@DFF���X�݈#DRR�;v��0a���6XL�<Ydff��S����<n?�̙#��#��
��
��1b�Q�H�*�"ޚ�_�P+�7Ql]�+�,�CZ��]��wJ�s������H1�})�>��cR��Z�|���H1���K1�{)�͛'JJJ�����#�<"V�\)V�^-֮]+�|�I.�M�6�͛7s[���o�#�6��?I��J�w�yG�߿_��������⣏>ǎ_~��8s�8�'N�`������|'��U���*q���<�=�H›��w��In�PeoF�,�dO1N���4�B.����#yXoOEK�߁�Q��K�'S����XD�WS�)~���4��L�-�.�o��K(��'�?L�R��(����⟡��
�{t��,��4\\fb�C>K}�.��6�hO!�!��iB~�\Ȫ��<o�ߒ�w��A ŏ���VUşE�Q�5�%�_N�?����I�H���K�ƲF����T�#��	9�⏧��Q�G(����!�h&čTgo�D U۾� I~����]B��r�BN[-��W�|y����6�7S��şH�gR�%���o��{)>����W���N)�A)dP
(�')�ݔ�	J���?����)�O���r)~}Y��KW���ŏ��#)�$�?��/��+)�S�5������_P�JC|_��S����ߙ��N�R�1�_L�;(�1C��O�����E��%1춮�:t�<��9(.66::.*""2:�[�.]:�QO!:���?�,��)��"��!f�?.>*&.�������r;t����?6�E�W���� �?�۶�1�{w5����;A|J?..6".��[�?��B�#"9*.�m��U�1�����u��r}�-��9�-fď��o$�[���
�a�!��?<..&.�
h���o���k79�?�J�M�)`��b�c���c���
@�]n���G���G����Z��ڵ�0���Y�\K	G��~ϰxbq|L\<�9�'�S�{Z�B��f��-ZP�J_�K��`8��<x0����e�2�4����'.n�D�4X������<L^A)�)�1��t�F���ӭ�p����v�,Ħ���o����|(a��"H�j�#��	
n��{],yF
"Y��;*��?%eP�a�|���5*��F��� w�5u���?*��5N��?$`�&͛ݙF�&�1}���<4>��k�F���M���bk{��C�G� ����_�ې>�&6�oW����-eY�ESa�qR$�}���W�+u��)�>7r�H�G�Z��t��g3bĊ�(����ѹ��>�)����Iߨ:�L2~�a�j�*�f��n�:�a��^}�U��|�M�>.{Z�"}c�
�w�|��'��Z|��7��ɓ���R|�����ΰn��/��K�.���x���nhg{`CJ?��^.�D�,��RG��h._=�v1B����\~!^�����2ħ1�F���.�����G��Q�i�_C�_���)~M?�=�?z��zJ�
hӦ
/���Y�6�:���'��1�iӪ�-���o��f����v�ԥS��[��{�[:v�Ba�����#P��p[�75�ќ4k���v�t�ڣI�7kfs��z���u�8�^׬i�V7�֣��o�F^^~��Lm<���vS��p���z7�=�������ʽ�5�ظQ�@�_�tj�ю|)�M�N��k٥c`���_��-00 0�@��=X��ue��$D8&�<4hha����D{u~����A�Wmg���?��6������W�E�/>���}��`*� ;7jԈZ>�8�GQK��a���-]�k��{�����d�w�:s�̿~�����|��?�"��s�Ν�q��/����{�:������{h4���')�ß���u�;w�H&x���7n\D_z���O?]J�h�c�y��iI����O0A%���kI�o	�AR?���(D�?�����A����	΍B�D��\k��I>��	a�N�|������kǿ5� ��H�_�~��������7ސ��|����S�N���_�СC����qHG��I���/�<g�֭sHe�q8w���F/Y�$��j�σo������z��޵����t�,�gϞ���,�رc���N�����|��A��g�1�T>�;�Ǐ���9��&H�a�d��O?�t���wJS�����?�|��?~��o������R}�C8,A�?�?�S���_Р�D�ӡ�u�K�����]`t��w�ڵ�ʱ�Dhعs'��8v����'�8�NPf�ȑ#�(�(7��y��!��r�|��4>�;�Wß�p�?�����%uC,�!!!�!����˷�zKR�Kҙ���(����3�}��q]9z�(�A���	��m�QJ�1)#>���~){���1��^&��w�|��?��J�?����ۗ�!~	��(�����+�AYw�Q�_}���9�
|!�x��(�'��2�)-JvP�~��G4��6���6);�)�/����^�g���_�,t�+����C�J�1�4P�}O�^DC��R���2���A�]Kׄ�� ˋ���;�,�*�+h.�#�X�;x�2��@���Ҙ�����s��AI9�p�O4�!��=��qDʀ��:q��S�!���O���-]�W��
��Ӂ:9�ܣ^�&���R'�H���0���4Q]�}��]w�y��-^ީS�>TKP�ж�Gd�!���~������TGA×R�
1Dæ�<?<�������~��t:�+�������7��'g��G�Eȇs,��]��r�R�8.e<h�L��$3�z}ޯ�g�I�������j���@C�S9/�ݻwjϋ�?�.�{�u]:tZ 됣��&��.�����2
x&TH9V�!�k)�NC?3�gР���h��M�Dm�-DC��ն��y��ߡC��S�~���@�E����u�?�{��4���p�Ԍ�	�a
р'����D��c�7*
z}
z}F��s/�}�����
���8��ß�{��kK����t贀�
��G;�y^�|�0���$ѰΦ�F�{*�E��Sj}F��yM}
z}
z}F��-N���Q�п���РC]:�#:-x���Wf��/�&��I4L ��N~��JC
�0�4�`��qZ}�<��I!���&u!:�Uo���~��O�>HG)�haBf@t�����2����΀���P�en�|�hx�hx�hx{e�<w���
�s*�I�^�5����G{�����;�,t@}�
�봠�G{�q
�M�U���l�"� 6��/7�������!j��O����$fDI��(Y�-����W�b�:FwM�hj�Y�	�%�x�N��x�e�6ި�����]�mD��D�ks���Ϡ�	���
�@C� �`
ѐ-��0
x�&�7�}ީ_��f��x�g���?/��`,��ՓK�.�C���rG?��<���«D�KZ}F���>P��(W�F��-riV�t

�9D��:��G�o�?��?�uhy��ƍ��k�C�q�ïʝE�d�����h@�����&�΋���Z�?��%D�"����h��/�6)Ҡc�ZY��u����…]4ԥ�j�\�T-O�?*�Y%w8B�[Z}~�P�7h4��h��ђ{#eI�J�1�F��4���+��(s���1".;;�]��:0w�\��(_T&0Q�ꎱ�{>��K�@}.��s���G�:� �}�Yֽ�˔����ӧ�h�W+<h�^�{
��h���i�i
>-[����N٥K���"�|�I�~9??_�l6�x�b��_~�%�;Ѕ�x�o@[]�(�xP�>e�տ�xc�tW}�u��Z}^Fu����M�����֭[����촴�JjG��x�	y�w���DYZZ*~�a��2>�_Ѐ���N�0��)�}!��팖>
���w7L��1��:�3ڤGg��?�������σ���/�q�͛7o�:,�OΜ9SR��x��;XGx�wX�;pE�r����a��e���:���X���S�l}z�k����W�\�� �[�˲���xʎ;�[o�U�n͸�
#����L�i�m}�D�v���gU�@����(�������m������5�?�X�B�]�|��?�/w�u����b�Ӹ�e	4�^�N�:�҂9�Ð{�Ѩ+���8nБPv������+���� 2�ݵ���_�����grr2�N�m��&g̘��>C������_����&���C��>�8���Y��7�-�?�Һy��}�z'gϞ�����A��1c�et
��c1�א{�	2ڌ��
�-�G@@@��^{m)��&���f�/�9��v��QQQ�b���ݻs9�q��Q�l�uC7!Gh Wh�Qv����k]�`����}���@<,B}޶m��`ސ�Ӑ��*�
Ʋ�a����aިh���]�uu�
&�/S:E�Z��P�?�{�nE�k>>׊?�5�?:_/*[I��*�@�-I�X�G��z}>�(x����W^�/��"��/�����O
�m���M��$�B]����ߠ�������o0��u��u��S�r�Ju��7�5�o]QP/Q&���d�>;�E�<П���v��qw�o�U�e��.��‚$�Y�O�⠝A[��1����s�k���,�.�u���]�v�>:�o�A�w�82����9}�e��Xׁ�C��sԡ������F�GQ���KḺ�?^>��#,�F��p�%�:��w}}���5�����%�K�A�C��G�������v˖-��Gey��0t�s�Л������|���㿂�c�h�a������v�Z���_��NТ�N��SQޯ��P�b����H]�}�S_�C�
堯ɡ��a-kP��S���*��},u�2�~��X�@�`�ٳ��]����QH7���3��Oj'\�?�}'����G�;�c�9�{��>��r�;�|��h�hL��D�ߍ;�ٽ��7$�ƶ����!�$G�IGP��Я���qǃ�Hn�7�w�Q=��:�3fTy9bƌ�BDT�&�f�C3�4S�M�[��
�jf�߁�fJ�t�L���L�f����,�L��n0k��1����
��UtE��'8_g��w��ԝl�A^�H�
�>?�j�� }?��||���Πs_/r����(��o����Ɔ�`�)��%����g��j8��v^^^�hl7���E�g�s�B�m�K�S�t���'H��${zt }����:�B�����~tVʃ?I����*��Dm�z��q=]��D�?�t��g��=B��Hk�Xo�:�W0'��؏�Iy��kZ�m�vz����>�`p����G����VC���?��Sj��ƃ�N�ic}s�Xc���1�1h6�2��=ƹ�z4x��y�7���uZ]��Z�kU�M]�z�ԑ���C�o��_?�:&�v$�<�mp�R�|���&~�������CXg'���2�}
�_SI�M2~���\���r*ρa>s�z����S�=����xT]k��kTX��:��8�>=��4�Ϟ3gN�q�[�gaB�~qn�%b>��������:�h��h�և5&�c�6�}��c\+���\�l��'�OW�cϝ�N��6�Ǥ:����k�Xg���qR�ʕ+��x o�9L<XoÜ*�0'���?\3��7)���յ6�	�w�^1k֬삂�L��+p��	x���XkzA[��:�C!�Xc�چC[_�=I���g0,��j־��_w-��0ʿ|A�wa�s������X_���qi��I�y
1����:YIII��ի�P1އ~��x���n��*̫>��m?��/�N`}k���h��h���u��˦�?S_��c;�mxqN�L���^'���&m~}��N`�ɩ��h8�ay�|�|q�v���g�����,Ƶ;��֌��|��X�VWD8���
���w:���=�Xֆ��}\�7<��G�Ã��﫩�ɣA��m��cϞ=;{��S���K�r��v}���YD��5���H���'T'��cV�k��j��O�<�t�c���.���뮅�e��xgy��:��<��'5�h���Us�"�z�J�]�?))�DDDϻbm:##C.Z���w�Io��ޜU����+�pD��<>1k�|�\Yy�)�l�Xf���s��L�8qoPP����{yxɒ%<w��}�s��m#�Q�Oƃ4)܇$[W��u�6��=���c]kK�g�q��1�
�5�-�׿�������7���7��a-�Ʊ��<�
�M��|G{����2��!��@�DuVV�d��|ґ��c�?S����˦L��k<��=z�DY`}��e�z��ˡ���nR_���~J�q�� �-���t;�s��Ḁc]�ø��2@��x��@��6x�رc���5
���/N]�n]�>�F9�ɓ'��@9|�p�M���ׇr���.�W^����_Cޜ?�D��p82�������„	x��a��/�e��@o'V���]�ם�2�I�?����ߪ��(/�t�M>r��S2o��P[��}x�:��/�,׬Y�s�h1礯)�ż9���%Ы��{��$p��a��O[�nտ��y�迖9P�3h�PΛ6m���@�(��_}���/���o
>��#����{��=�ƽ��xB����}���}C~$�Q�?��kO<��yj�~|��'���SO�jw6n�x���y��؝�x�_�>v�ڵ�_x�.O�C9S����i���g���8N�w�cc��4I�\�*���U�pR[������3z�B[�R�����~HjMオ�c�>y���c"�.���:����/[�6�W}ǡ�7��9�n8I;a���+�
��Xi%ᅵV�Ɂ;��>;7�u��4[uNMcq��0�ø��wB��N��n���M�4�O����0f�PN��oP�z ��-�{��kB��xc��Nc����o�ر�΍6|8�{��R8�Ǔ�ݡ�c܀����#�k)�!��Z���A|#�u5�%䥮.~�|�s&�tn���~��-����/���܁��G��Cgp���x {h�!�(ˑ#G2O�N�,���|e���s��;�o>�����۷og]M��6t.��S#.��/7�?�������O"�G' m���㣝�H��ZhB���$��8}��ݻk��3�gc�?���@\�0>���&|���ϧ=��57���o8o�]�\\����<N���Z�AAj넓ּ��f>g�[i�S�|Dxj~�u�ĬY�S���t��e�ϟ4�:55��ԌIy9�9�n�r��O͟�}z�橩���|[�5/?#'{@��݃:l��l����֕kL-X�G1��y�Y�;��Y��)kZB^��,�dk����×�"ìӭY�,�萚�==�^k^�=#r.��!=5+��a`x�"�dޣ���{��5���hz��s`BdBdtt��!c�h����}���x5	�.�}P� KPB��AiA��**
Z�l��A�]�sTO[�=_�F��=W�ثQ������6�L���;�wR�޳{���K�����էK��>c�L�S��}^��F�O���s��g�f}��o�����&�}��}+�&���_A�5����2<� da�Ґ
!;B��4�:0��%�:�ԿC�����X����¦���%���·�o�:|Ԁ�r�7�`�����=�pz��@��-�m`�@��7|~�;�0�
["���ܕ4&hV��F�J�ޫ8��~��]�g�-�?"���.�x���C�T�/Ã^�,H	�
�Ԩ�=��ֳOOqnqχ{����;ߧ��3�_�ZJl��PG�e0���ٟg��]44��&ƢE�� �J�j��FL�!�L��J�&`���X10��N¤h��D��!)�A	q�\����;s_�{��y��gϽ��V�L����B�~���W�n\�kq=n­���q/��o�2��"�dqȃ�G$��$�ɋ�|��!r�� �4:&)C����~��Nd��	pg�ƭq��W����+��ρ�6�{Q+���T�w˛,S�#2C>!��F�-���)�v�|�^��m=�G�6y��l6e�Ms�4�nsɌ�;m����M���F~|Z��*j���<��:�N��թw�qZ�o����%hZ��ѳ��CQ.�<v�J܈[�_�����xO&SH,�A�%I�#����d�N�I����^�Dѕ����x��L����;�����c�6��`��Ϳ������N�䆧��1�Ο��/��5^������x'�!~��\�&���a��=�ݛ�;M䈟�߈rqX�+�D�{���;�5zߗZ>*w���$P��d�Z�R�`�����^�_ү�]:����`�M�Km�ͳ��o�?�f���ho���3$��|��	$�Zԍn�ux3~����@���f�OYD���&i$��R��^���Ox!�����gb��+?�7a<{�)������l���R'ӡȠ��L�(d��x4�����.z�����|V�����术�����ݕ��jo��]��e�l���1!x{]#7 �#�6�H'��F��u:�e�v^�rD�X'�f�8#.��BzA�-�O�^�K��9�~U��w�=���cP��ϲ�v��bK�v;dGmd�׍�+s*�:��΅��v��ӯY(m@u�0jC#h����2�
���}�o�,��l�{�a�v���ky�����;�]��Ir.�հ,R��U����R}D��O��?��|������~�����?���f�I7f�9j��~s��a3j��C��Ԕ�2[]Wi��;`�v�G���V:�X�E(e��hڈ�ж1'�B��ˏ��P;:�zPƠ���!=d8�?�!��\�K^1j�Z������J�Q����O
�h=C?c�n���v���`��S����}�b�Uw�\-�e�̓��B�A^���nEԳj���_�H��1-&�wf|>ə�N�o�x���A��n��t}�6��t��<zt��L�&�8'D���=��5y]�9_z2���l��r�B�lkT���<���K��~?�_��'��f��k�[i���N[c�a0�_�ߛvʙ��C7ї06���d��+��́���y��}��+w����
�F�K�Ue`l�����OC��R�G�G��#JMQ�@:Q%)�48E0_��V�j�*R%�LU��XG�H[��c瓧:A�ԩuڡ��Q"�y��B-d���(�b�3p|�	�xG��$�d�bRMZI/ ё��p>~���eI�a�	�˓Y
Kei,�d�,�%�T��rY!+e����d�����A6�f�*��v�ܻ�Yy�O����PS�2��T4h�Tǁ�����'��TP��g�,`
�!$��E)�(�@�Z�S��Nիդ��:��vա:U�:��N�:�C�J��:]�t�n֭�1_m�M�I5i��ɇ�n�	�"SlJL������]���x��x��x�?ƿPKEePQ���g��pip/_vendor/distlib/w64.exe�{|��8>��M67f�,�K`�E�F�K�fȮ��F@@QA�hJ+�4�V��Il��m�jk[�������o-I@!!��!�
��Y4($.��9��݄�}��?>dg���<��Lуk� �3A�������_�Q�	���qլE�_�\R��J��Y��G?zBq>�4�#���N����>6!33���m���ˮn����mlz	�?��M���sM_ҳ��Ux���?M�S�k�Z)�*����s=�~�"�/���>Ax��d!xͅ��a����&{!�Wq�����{� X�G�}R$LZ؜o��B����^�#M�D|Ykޘ�2��7�O���(t��[A�X��r�М�����V(���A�C8v��y���`B������m�N!��/�W�'�lB�\�� ��ti��	KxF#�UȀ��|J���;�	̍po����=��	�X��sEcx�|��{&�����E������i/
f��:g�/���m� 3��Q&Avo�C�\�ܶg�.̒�W�7<�pr��rj�\E™���8�`�v���EPEe]�z��r�v\8�I��#󄬕����Â��	��_a��,W�TkL�����W�.%��.��V�n8n�����ױXh,�>c��/c	Π�\GcY|8>�=�K�24>���4���e�'������X��\�M).���z�ɬ�n�Z�Y��r
��@x�yqc���h�4C�J6�~@�vJ�_�������?���Lq�ɬAfs]����9�O;Y2vc�4K�-�'�/��nA�E���î;�$�:\��s=��-�=,��u��"d_��V��� O��Jr�Ѣ�pr��G�@q��x�U�(�����~m�([�2m����~����조@l��ڴ/��v�(��le&8�^l�s.��s���Ln4da�Z��.4
��\%���m��X�^��g�a޴w�0�N�����;+�B��K�ڋ�к�>�j�i�\C�c����(4���pי}'�(���H�f�5�i��'�&z�7��L�V$��'�x���蠵�}��`m�_��q셚�.�12$^c�E]?p�0�	��1�<����\"囕�������\Ďђ-���u��?{(�ϖ��S����KK���o�04�>�\�<�T��	M�_�!��D;B/��n�.�l���C���Չ0��p'�����"ܜs�c#qm0� �ڵ΁P�P�^
�.^}�]^�X�>8̍{����!�Z�{MN�Q�R�T��^&��uM�:,���l���;��ޱ&�e��ʬ�p|~��c�ӹH}7��XG��Uf���8�Q�v�����f+���d�	n�9|oN��
po�'�U���d`j���c8�@S5�Yu˸�G�5[��*��,?Q�J��a1lW��Py�{���p��u��j�
���L_�J�VB~�c�A�1��J�t�L!�'�Ćc�0{ϝ5��!�ou�jG��� +k��Cf�\�%�di�����0��%��uP��8iڋ�ӁNtQ��P��d6�<S3fz�g��L�!�i��g��
3��3}�3�wc(�����{�14���s0�2���U ���	��+��8��	�;9�����g8��4e��C��չ�xCǀ�Y�����ݎ--��-�Bhir�h������\s`C��2A�W�9t.0ݱ�9�6��x��tá�Ӭ��Í`u����������C#��P�G]&�#|��g�F[B�b�T[	�aN��=Z+�}��Ҹ�Bٛ�lx��pL?/܎D2�o����kC!�T�A��~��TWua]0
HGr��N˳��~�dl�fh��*6�2���L�]mL�e��V�7Mf��x�V����rŧ�jC$�	~K�K	�����H���4 ��p�qi�Z�z���%�g4ϔ�Ed��#L�פ6%a� ��F/�F�|:5�,Q�9Z�[��X�KT�X�z��9ϻ9+�E����,��������rh�1�R��Y#�D.N@�s���0�a	Ê�^�~3�����)�G;�xdm2B�I��!���)��=E��%�u�z7��л;��Aj <��[�-J�Jl/v�����~~uk't���}N�	��'b��b;�
!��)P�-y��ˍ�"��aZ�K�H�B7��hmg�kc`ր��w�%��g�T�\f=��<�K���g*bY~��&�����+���W"�;i1��BႪ�]��Im�n�]��Q�}�^������Q��A��$���.�3�$�C�Eܫ�g��HEX)ɿ-�l��t���(�N�w�=��M��)��P�**�U����}J�//�H�c"���؜}q&�G��o@-��U�v�|t��� a�r8��8
�E��޳�[	<|���01�qv4�W<�pܰ��������~�+�$�<hh�ԏ"TF8�4N�mrq�~	+���؊����CĨ�w�_m1��p���I%߼�g�ܵ;� ����!,-s}<����sm)'�V�^�31p��/5�x�[�@�y���@8s��I��>��
 ��f��=�\E�]{
���W�WR"�� �L�d.`���z{IW�a��m��[��o��*��,�����.-��'%�U��:X�!�o��#�z�X��H��(��<�G�x��y����q?gj�QY�l������D�0I1^ʩm��k�u�(Q|���e�"N.��L�M��� �Z�����*���������#�����ǦBYZ1���jʨQ�HN��jY���O�9&�C
���f�����>0�>�"���7��bmBc�̢����5W�����V�
ǽ�H2��X��e�j�C��m��Z$��	�`�����y~��:�fYK��V�W��W���'�g�5�M�#>�P�l[:������řb4�$�[�M�.=y��Gّ��P����2K�i����%#}Kn�SVV'�4��
�ϙ����8�ƈ�&L�b�bxh�ar��!|'�j��cZ�m�eR<�~W�:�u4��_�fx�.L��D���-lt��7��1]AƵ{��F!:<�v�˺iM��!���:G��Xa�����b�Uc��k�!�r/AZ�iș�f:pw��V�G��D�+wq@G�`�؋q�a8OV����-{zJ�h�q�5?%����e&��T�]�C)��ރ5���Hd�L�x�
ZMy/���a���37�f�/�o`IF�%�U�P���21�
�Z�L��,La�g����������d��p��]��@��%X�;z�3q��kO����ò�"szP<p��l`�L���ĠC��ǘ��� ;a�x�%k
�_P�6��C轍�X=�ϒ"@r�� �4D�����p<����;!���=<|���b�f�M0���!Bqh��|��kw�����
U+�۪Qʂ�{�Okp�
�2[[� ��VUCoS���&A�ʚ�õ�C�۴%Lf�Z��4�Ц�Y��UQ�̹�-U{�&�ۆI�TCRp�Jy��L��ٓ��6��c��[dI�Nim
�g~���R�P�
;
�w�Lb���5�����E�{��(��ޭ��A�a.����A�;�.�z�%�9�4
~\n)Q�Ȉ�Q��RT���ec�RP����Ӯ4�7c���S�;��"��v��v����Ұ�Km�G�nȩ��|�R��{��\��8Fr��YDP:&i�Ξ;�o}p<��r��'���vl�\��r��AF�QuӨ��(Q�R�Y�����F3����M�"Vo�[r�p�JA��H��~� �l����\uQ�"��n���M�RN��a��Ď����>�BΞe΅L(q¶�l�u���' A釄�r��L�-�$��A�� P����K�+Ǽ�j�������
�kn𴿫�+�@kg#.&UJx1�̓�`�ZU=B���T>��!l��"��ob��`mLj^N�x�<�L榉�85�&������O`� ��Y0����G��%\?Nm��S�	Vy��G#�m��0!̙	P3	PSPKg��>
�>�϶�=��Ė��*��"��j@&��N�j4�t�T�,v����o�Ò({ꗧ�5�e�H�6��se�0�rmS��@"j�iFG�$|�1n�&�nFN��ڵ��/L��g"60!�Yx�@��qZ�$��CX���*=C{lxbR���|l+h՞?\��E�D;�i(\1XA+�`�`�1;b�y}x�8�Qs�QE��jAL��<��%�l�+O�Ҧ�1����
�0��*���C�~�X8M!
Y^�W����K����f�P�HfۊXw2��ȡY�%�Ê\E���k�E����8�� 9:N����XPX�~��j���:�4/�VV{�`��=���'r3d�c����/��G~��]S�2H@Օd/��ғ%��
i�H�H���#R/��*;��b*�������3>�3�iz�� ���]�-���v�Mb�ث��M6�`�/���9�9�{*�>V�h��|0-N��t�m��o��Sz�̶z�W�7�=
_=�}�o�z��'pUw��\ǚ�}@w���U��QCy��A?"��]Z�D=���T���&��hI�f��"\J�s2r��%Lxfb‘fh��U��xdQ�e9圏a�Ah�:���q?k�CN��H ���%,?;Ex�l�E`Y���B�Np���5����ޣ=�m_������{n� ��Z��� ��~�vOlOC�N����A�����jz�=
��%���	{��͛eu��D4���@����<���x��(�j@h)p%�9�M��"V[d�jR�`�С�����-ȏ���b5$��bu�8C�t��>T��@X+"Nk����&a���"�[�̆��2���*Y>�ɼ�: B@�buR��:hv*/B����K˙�T.H��mhp��������������yr�HN����Đ�t�6���|3Oِ�����6`9%��Y�[�l���n�63�k�
��r��XcdJO�@�B�I`_�<n��lV&"���G���Q~f��o������xzZY^Z0��*u��\z
�p�5¦P�g�)�]G���:7�<�{Lq���9Oً؉"v���_�c���GMe����OΑ:�Vhme|I�x��18���]��9މ&�D}驮�,4��pm�Ӻ}�ë��~�A�	�r�;�lJ:f�Ǣ��=����M�Z��- �5�t���\��D�%����s�׸$���~�+<�_%��A�`�0-����X
��U���C�8�^~������E�#��$#\��҃����6mѭDV&�6�a ���@�d*����&�6�$���k�eܹ,��׎X]O)[\!_{��惽X�xB2>D�ߩ���E�+@��Ue�/�F�צ���o�h�*Lļ��,�KK���絗L�-�_m��q�t?{h��q~�T.����p�@���>�g?��t2�Q�8EC���
4�L���9�W�b'�
b�V�<m˦k�@�s�	��
E��u��(���T&�Q�����=�%�{PJ�-V>����ȱD�,k@��>�h;�����
�%���~��u�X������}�;��*랼2ހٲ�;�I����4 ������_*t��s!�>,ཡ�B�W=	$~�|�$,eI,J��*0{u��-"��@=�d�Q��#Q�{�:�z�4T�>��8�d��;�
=���:L� ��)�$q���Ҕ�Bn[,�,�D����6�K[�>#��/F����e����M�nN��c��/ڡ)��k/�y�ǃ���3)V�\R�cMN����ur_�mǷ�TT��M{i�}d%u�&G����#N�*�ܡ�[���	�JP�2�8l�M�f�����T�{Ikp?��Ʋб����B=f����Tfn-�aOӲ�S�N|rRP�ܴ�A�u2*��]��
{W$�I�E�w�Eq�nm
������C0��N>����^�H�w}����Y�b
�y�Vw��ID�P|���693p�-0�O⒌��W�GMF�p��PL����!�a����^,��r���@���;��r�A\Ȳ����֏��w�41���
2xNm?�R�d�~����;�����4��-���j]R	r+��-A%���e_����5��g�������K��!�I��S�R�۵�m�F��[��v�#M�0c�jt@�S�a�Ӵ�'q����ɽd��]P�����L�c9Q(�j�G���.��mBr���b�)ٿ!J�ׇ���AC��ICB��m�aCу�t��Q^~�O��>��([�m�������|2x�6=	����a�!��~�R�_�
x�z�O�����I[3M�	�ī!������{4�вdz�&��H��h��=���	��k������DŽ�:��筧m[����}Ԧ-��KJʍ�W+��B+�-�">W�6����K�WX�N�k�I��P�E�E�����|�;���Fb(�]��n�}����LA�����
���ʷ�J�q�8�wp��Ƚ��$����kc3Q��Z:���3�1��C�|7[�+?}���Hr�וG�H [�\A��LNb�ֶ^��^$LPl�
o��Y��:����y��Z��z-F1�3�Y�M�P�k-��n�n��T�P�dݒ��P�.�O����������f(Ǘd����'54���I�cP'�� ���&<Z��'����ZC3���	&{��l���Y��R'�^tPĞ���d�'�r����;.�ț%b�Ią�?�����E�B`�=��j9�3�ܦV
x:�g`�Vx��W�ٶb�/�
䒡��a�ه~s�ц|q�V+嫄�?<�?�n���0�›6b0?$_�'o��D���l���]�/����ʹ��hJ�a�8�y��ع�,�'�W��g���#�F!!60d�ELr�O#W���S��Yv��fc���4���,�Q����4K��Ns4�w&��M��| ̛�>�ܶt�l4��,��0+<
3T��gm鍾ʓ����Qn����q�GF`q0��2I�w�3[dn���x�K�SÅT2QC���Ṵ�}�_a�-gb�V���a'X)$��VO�h����#�Y�BM��@����9]��6��ɶabO�(��R3	�2��j:�i�L �����F��
�dֿ�]��y|a���=�xi�	��W�ی_�
"v�P��G�	KnB���������P�>�G�B٤�Q�T���9tu+����/�(2p���z����:nFO��P
W�����ur�n��\�,�mr}��p��]{@H\�x�k:<�H�C�1��]AH�qP��j ��vӥ%�N�hz��&�a<�l+p����4/�V\�c(���O��"�t(�Z����P]T��f��K�Dh;��Acl��Ae!���r�-�6��$_x5?K?Ҟ���}>�'�=a@�Q:�j3ߏjt���FK�1jt�2D�ܫ����S���f��L��H��mS*Uw&a}k��;bEĢHt�ku��=��'�H9�Ċ��T$]�b�(w��,�5��U�-��|(_���cm�.{�OX|��)�H�Mb%buWAd
�j�WBtRp��e���yuW����}	T|*��
�X��R���~�Dh�:l{�ڝ,VX�j��
����}�r|�Y\��O�P6���g�rf@NQ�_f,�Jl�n��>�Kb�����s#�*K�L�}-�̄?�^x�4�ϓ�Ԑ�7s��$V.�)�
oRV��n����h\�4����å,�X��D;d��@�5�%%������i��~��~QW��n���P��D)��hB��گ��q�,�՚HHd(���@(
m����qe#�\��܋q�E�O��Px�I{YE���~Ϥɹ&A���wr�D1�CPJdf��,�R���
������jԾ��f�ʬ\m�O���ԳA�W�|��Q��,�b��o���!I��mFS�Id���3��ZO[�U�2��7��ݼ�u����	��qj-�[�)������	�*(�Q,k8��'��yԝ�F�-���F�J:���d���#ba�4�Q��02���W��
�Mo���d��JL��_	1��#<1X�np�hF���pŽG�y[���I�9���";7DE��p����O6�x���O@�a��з�LTZs����\2�F��<�ю
���|
���Uڰ��J^s<�&�,�`�K`9�+3g��L��c��r�l8�A�c�4��9��V�b������-�����j�M��6i�|�����!��Ia٤��D����B�~�~�W�c%�'��e�I6�|�(��8�w�Z��ϴv�t]@67��~��i�����A�8�gH+�G�]ޫd�3�� �3��.�yҔ��onS��K�	K'�h���5�ȑ��{�`
)j��I�]u
����[�\h9)���T��<�`���czz����Qz�F����<ʼn< -�LF8sL=3_
���a�<�%)��0�.{���ho�+B�h����/_!��b����	���,���������X����y��.һ�M�3�:Np�����W����W�ōA4��2�'�R2�E�Q�6��W�6��s��-�n�W߂F��J�ۀ&��:�$[`�CWҷmr�,���`�2sd`X��O�L���|��ģkO}�p�8��.;�{���5�M%Ԗ�@0�p|��˳+x��J4�J럱��0[3l�ױ�%s4�ح��g���HD���!�{�5oZ\�~��/��Ͱ!�A�~u�`-�Q�vf�55a�"j?�?���$��\���д�7�A���#��'���3���=Y�Ik�.�k,��o��%�g�?689<�ī�C@���ڙ�̶��_��,�p�~�j��p:`�<D���k���[�g��B7�w�[�&��i#޾�b��b?2k1�\���=xp[�̿b�1v�_A]b��`-�]��d���I\�
/�#�S�?s��fe�zܢLP�'+��m�-���p"��,�W��Í�˼��H;�G]}%�����ޤ���
�"JI#��4Bl[���� �X��(ב8r��h�]\j�lI�M�D��]:�ϗ����� �(��o"���S0��tp2�&����y��핆btj��\���)��s�
����v����l#�$����?�9��y��Y��YЭ^T�cb>�<���n�y�9���=�W]'o���,
]}��&���� ����>��!�z�=[��&�=������%�V�
�a�v9�,Vf�YB���9,V�B��^F.���\T}Y��ipZ�D����^y�e.NBE����ێ�6m����9��D�퀜��?����,�'��J��ī�k!��"�9n7w�	i�z�wB9Γ��.4I#�i��1�\�Gacy>��+'���j��i���U��0b�WC���IAɡ
u?3��S
̇T�b�+���8~�0���p���\w
�kN 2������xJ<Rq�LvCm���b��h���8u�������>����9�ƺ��wPD�d��1�M�I׵&��{m��?1�U�R�2��Csxh-�a<���2xh���+�!:�v�Gpůu�&��!�C�ߔI���t�V�qsD���#�y�ڤdΝ���W��*s���;������UTrPE:	�<������Z�I���V�S�rl�'Vu���j����ױy�pP�ϺHI���hy�|u5-��L����/��7�̿���/� �`$�p[���y#��|�h��Qv�-'i��wgi7�������Q��cH*���5\��'#���2�&nW`��û9AD�b��#"�#�D�?�X��-�3��=�����N���T�5������Kg�h�7���6��&{�J�c�n`�܇<��8$��sʞ}�~L��ˑ�D��0��QR���F8�T;
���f��u5OB��`�ڨ��/>ܹ��鱎���}x]W������'�ͶбDŖ���{�+���-��&��hz�
G��(�0g����?����	JI�M1���/�'��fw]y>��d��g&3���m�(�&��ƥ�zI�.���$�Y>�MG�Ϟ�4&�̛�n�d�=��~�-��>}���z?n�'��h? SCetQN��{CT!RBAV��Fu��GL1RA�M l}�m.����ҏT�v5:����2���[g��Z�%z3�	�ka]wX����O��:�;�V+�2!7j�zf�5��X��Y�9f��~U@�\H(7�W+jH6_~���ӱ�;���8��4т��A&L�3��XI���%7��C+�/��렆G��,��͘�W���i�������D'.��I7S'�@R-i���{�2����{g�&�q��f`�P|��ص�(1����yPa��c��?��8;�g ��H�R��j���^�z�Hƨ�����5t$@���>�y_�.U�J��Jc3���Ϟ�)-������w]n��9Ӹ�Xnܕ����1��9T�r%W<�>�y1���Yͨv�^�e���V'���"ph��s��13�Z�@r�%�l��a���s���31y�0��S
���s�Z�J
�_~���u_>Ï�g�Ff�Z�z����Ď>��<Y|���PiȢ7�{�8�<�;��?�`M��{�rY}�:�k���H��$۴�����X��7$�e�ȗʫr��2�l4���EsH��?B`�Uv)<5PP�74/#�g)��-���A�k,���xh��r8��.|���W��M��	WZ��B†n�~sW��q���ŕcKH*;������W��W0N4��-��W��zOC�5^�}�^�'Dߧ_+������y=���r�$V�Ԃn�qj��MIkR*���2HU�K�OD�]/k�'��KPb^'\��l����ݗA4a��3����wZ8h7ͼB��%P��%$:u��p/��K<��;�U��{ �Q�4��ԲT�o�1��{Y�SZ��*���S��Q�Gc�5ج߉�yO6���p�S�]n�j“�z���~P�%u�q�?(m�YxILl�[����`��&x
��y
��v�4�ƽS6~��d
2����������:���:q�<��s�8�|x����|��iղ�c�G>�B?���:�B�� cP��G��l�N��k��� ޮeԋ�ѼP�:�w��˞��&�縨c8��A�f�3����>�܅�&kF"�jȩ�UϝBM����q�����!a��U_�JHF(x��2+f��-��c��ܷ���!Q��h�dn528�H߼��3Jf��m�����Ċ��Lܼ�o>!�u�j��4Rnh�����F��m5�7�~��W7;Q�C,r+E�3׈Y�'a�C�-��3�������Q��꼹����ysL�8q]��N6y��;rvA��eC���,~�^���XR^V�9|��Zāe6�߼���=���@�ˢW#��h�(֠��X��f>2j,6T��P�o�Ħ�C���j;`��d��\�0�L��npe
6�/��8��~?��?�����>�ia�uv?k���0)׋��$��m�P��7eKk̒y�d3al�y��m�	49���W�lE�9'�`�ʿơaO�1��e��u��L�
|h��6�m��r��tCg�S�+�;�>�V�"��L؊?go�A��,	2�y���i�
��Ӵ���B__�Km�X���0���h�f?���j�ظB^v�Sh�\�Y������6��{���/�>m�j(�c��>�@��E��3���Κ�1�R��cQ~�v��h��W(�;�%'7�6��i��)��d���d۝Z-Y�ZBV/�(�����%#d}_�/v�
�@
�zֺ�!o��S�%R�B^t/a��O�~L/?���j dY�:brU��~;e8��j���U���]k*�"��N�h�?�s�#�k)�#�!�݄C�9%����ㆡ�C��a�G��#����W��˸>P��a�F��fO�<�:ir�:�૥�7Y�7���ā�$�r��
Y$3a�r������}�ai�T�L;ɱ�#�O�P�efG�=ȑ$�+�����z���@X��-F��s}ɯ�.tY��R���a[����Y��s/
������e�z�Y�x�2�݋��m���k���@��'�|��F��ÙO!a��+?���B5OΕ�oQ����.�J��A�@�,��W��1��J��>����ll2$�aDy��v��0�66�٥m�q�M<����o�}	b��'\�4L��i�~��L")��
3�����O��}̞?�C 3�,"q,Vm6�S��"�����x(�ɉ��F�u��B62|�+6&�R��`�AzVn�C����C$��C��x��z;ޥ��zK��޻�t�
}t�1�ӵ'H��e�d�d%x�~Z*���A=�k���0�K��GQ7�U�<�/��#�7�Q�ekr։���N��Y���e��Th���AB��z6�s�J��#�ҲU0��ߊ:b܉X�Y_"V��sW�mK���}�J�E�X��0
���bӯgS��H�Fw�\��b#�X(�X��F��[�2}����~N+�	;�/>M,�����,�Dq4�Q�.�Q����ԣ��%!_{�y�]Y��*t��q牄SD���)�_����Us�6�>��O�{�GZ]\�q�pp�s��+Z�e�XQ'p��"��Qd��#�_��="���X��`��yD,���#���+
e髵��EX�������;Doe���;��zC���
�5�(�p8�k+�ט"pg����Ŝ!�M,�����\<���/��z}!b��8���"�ǢR�`	���@�؊��[����rqs`�nq��l��ܖd�l�j�̢���Y=�!�07����ߩZ����IЏm����>��K�k��~@g�)_e�j�
mH���T�ۼ����C�z��5�>��	�eV&�^V��m@�7�D
�0賶��o/=��s>���B�\h<b+r�Օ�i+'�X�����E��.��?:�¿zkH�f�
v�e86u�=�ϋ��8Cr����A�'�pj�\��Y�Lp�v�a\f��V�f9���&���@��FN�çn��ޤ
=e묷�!B��v�h�2��f��,HS�|�6'�
��J��7hn<	F����C L�;e%
1I���U��V-bE���ʹ�<[|�	a�.�9Th�<�z��m��i�xf�߯�8��;a�ыt��ӣ��!�k8�����h�)�36�)��\@:%�S���v��\
���_��
�+�ʤ~��r!+۪��l�sA��
9�uh��=Z��E_�s��f �Gm�3�u{����?���n�.()wP��(Ɂ�z9d���E�ٯ��_I��@
�J�����k�p��6�+=���iU�c^��
�3�y7^K�4�f�N�a�r�l��#P�u�_4خ������^^��
�Sß���:�2\Bd��������5�@.��52}*��7U����iߛIJ���IY�HS�M��A+E;�5 2��M�}��{w�Kf��Y�M�e�-~�-�oP☒�Lp>��Ɖ�D|N�`D �N�/��{�?�*�v���U�l��{�*z�М�y�'z
H�û���zf�3A��������	+8Z�)�U�r�$�p�[�~��4���Ts!Q�g+��ZgO���~��@��nDFvb9f�q�'�<G.��X{�����}�x}���C S�<mơ�f�lV�m٪z�<��xA��r2HX4�|�W��7�����纝����9k�7��4��!o�9$�ˆhC�fh��`|]#�q��D��;�q)��[�i��ۻf�yR
澤�R�Iܸ�[��F�2�8�5t��iR�T���7��X��ݺ�i����0>�t�l#�k�ƕ��s�J6v8
���5f�����/�
�}*��!��-��l�T�GJ��\��
<�[�M�n��g�T�p�E���_���n3$�A�>�/���[��M�U�T�g�
�eF�!��*-Q�|P66C�(ɗ�.������dC���ex�n(�en�/K \��d7ҽ�c�O��
��ų?��j����<m�Ol�Ӑ�l��S�=����Ċ[���B�X�r�{�L�쎴`JY �fѭe��������'E�+��Q�4r��J+��v�O�8L�@oQ�-J&)�����v€>M6�m��gB��d�SP_`Zw+�,�xsph1�	ckl����VH���Jz+�_����u�E��;(YV�jN�2�[5&^�ߜ*���$���Ak�9M���b��6C�6S0jU�VE�o]�P�)�&>��@շ�>_Iz*�
�ˎ�r�([��$V�N����
<���Ns�A�!�/!���E����!л����,�3O�{OX ��3q]�dqc�	C�E�l?B=���� �j�y6C�śes�>����@SU��٤��ט�s����ճ��e��cM9�@�����*ޣ��Z�g���R�'�5/k-b�����M�~��T�xa��pԩ�}g�Ncw�Ae��@��~�0�u�@|��g�,�2W���l����T2K���� @>��t[����B��٢�c�� �E������ `�L*ɷS!���@&Q��/��v��	5ŀ�
�~�c�3�L����\�gn�n�ť@�ѕ��nW
��5��x[�k|���e�f�ޮ���AkIh�~,�ܴi @��3`+����yà���?<�{�)���dn��W��>�|
9h�"y�(6?�gW��{�G������h)Gk|ݴ7N����m�#��~���>�BR��Շi��K4�ޢC�r�D�2��^��b���c5���{�����\ܭHދ��P�vK��z0�!m|�<������	��.�x!���W��x���Le�.ؐ�M=jR����(�F��%��ⴶJ����p� ����^�ͤ��u�B���]wh�}���/�^���t�Q:T��7�僄���Zw�1Z#�I��&'z����et3�F�=;���h�
�Y��&��x%�dܭ7���'":@�|P�I�j��ƍ����U����[eϹ��X�d��d_}�ou�s�^;��䶈g@�������A3ۡM�
L;Q��N>�D�G�t�*��#��C���>Yݜ*�ww%M�
!�*5��
BZ��14�[UZ(3�ﱀ�y����W���[Y&�@�S\��7&AgI$�x�(vn@�$^d)2��%�<�b��4�I3O�z���:�ps܀�����P��Ð#�:\�T���y�����N��p��ma��:��<��ғY6ڊI�����~u��P�GY(u��� >l�~~��2�>M>��k���BQ�$��V��ud��A����0$��P���Ws���|FPs����9���Ǿ.�I��D��~N��(ie��,R�x<�u�^������"ޢ֟AJ�m6WaO42�(�Y�� j��x�uur�z�MB$��ij���
@�c�YEw���܌Zw�'CϤ�r��*�-4G2����HZ}NF7�̲�X��ըƒW�O�vz<�v�{�I_����7i��y���A���]	�v�^��.i�!��F���䆤x1`ͷ������
(�F�F�(Ǽ���.���/�-�r�".Y�0��}ØY�P��<��^�����X��4��q�����M޲�@b�AbT� �,B�>@c{��NoV�Il/$��"��k;{��Nj�#�����c�`oƤ�}0`Œm��q=q��?kǫ�~b�V�����ޞ���A��n�IF����=�W���n@��X��*b��U{	5w�����_~�U�u�S�,�* g1�����ƾ	����WWPwM��BupC��	���N-�L�����s]pP�D�0]3������kF2���׮��L��/���y�B��ϲ�������k�
u��]�}����Sx��tt����u�育��Z�ۆ��lt��N�Ե_��e{�4�Li��y��D����;���i8:_�V�X=Nb{|쬏m�f��_�I��*���W��4�<�
?|�4��P0�����D�i��_�̶�%'�؎�GE�,�m ^��:?<����x	�X�a��#�.��n�X�5V�Z|���ϢT�����=�ƞ���zVN�u��Q�A�şHB��-��Ċ��-+fЋO�XO/SĊ��L����sĊ����Ae�](V�B��b�h��]�M�Q�?˵X��R�Թ�@����]X��MT;-��7s�n���K@nk��unxϴ�/�96�ɥ�p���&�~bﯽ�ޜͻ�^՟����|�Vɋ�$��[-[56���F棋S���Q��K?V���t���&�U+f���!XY�f?F�}[i�?�X<o�Xa���}��=�Z�SP�h��J,�+��}��=7
�@��H	XP��FoY����z s��j��@qYY5�E��x����k��t,�X���|mrx^��]���s]_U�3���nI�^n/�L����1���tg�K��J����\��B���M���S�F�#
r��'b� �X�,T�KŊ��d0���M�
�<���wt���guH6���c0=vņ� �F�C�i�iu#o�D[q�"��JtG"��84_��N_�gO�,Q�f��M��Rx�78��Kt�Ϡ���/@�aw$V\���،�e0%x��/�����=)�ׁ҄ }Zk�S�o�
��sQ�<��A�Ro�%��C���p�Qځ�o(��{BI)7��G����⒋����cwE{3fJz���j�	�A��4^����*�'S�'sRA�����z�f	��_݅���>�e�6�)���U���^����]��.<9W��6K�FT1����+�X�<D��_��'��To^�XaF|n��{�r"g�F���	�)Q�"��5�D�M���E�6�c����iv�x���YS�?��]t��vy���$@2��%�غI��rq'��3�:"]K���
X���k]�}�hKb�˿,C���l0T�	].Ҷ��֒S
���X�Q���f"�T��	�ha�\PN���	��BĊt\��4)bMNl�ύ��I�g<2�mIz*=@Ѹ�$~���tys��DFp�ΈW>6�gA����a��؝��\H���}�E�ؔ��k	:(Sm.�s*���O����위�����%��l?�k�8R-�*�V���:�F����π���/�~�|z=u[Ou��c���?;���E���+�����U�u�vvC'*]_��H�|�����d�ެ��#�}=�S �@�1/�%��l:��u4�ߪF��t5�H)�]L�K�"/u5�\���Pz$%�>�e�4�eaaBF��5�#�� �H�)��J$5���`x�H���X(>��Hj�;�xS"��5$� Ɇր\�����0�D"�ة�oX>�c�u���{M��b�#��c��f0���d�:C�ى��I��	������T��Y��t��؄�^)�Q�/FJ�,�&GZ��X�G�}�~�.�@3h�jǘ�L�^�pF��z1��k�J��5:F��6�/ؘ��e����/�P�M��U�w��I/��O�nO�����*��b���?����3v%�!:�E6�*F6����(�Ze��\[Jp�7o6q�E��l"�f����EK���pK�\4q(�Bw�KX;S��X���2���\&�1)U\�I�;�$:Une�9O�ac��h�f��"�fm0^��YaVEݓ�z�B�0KO��۝td�w$��ɡ��`z�+[�r<<���=�bEIӉ�|@'�w��-٬%���^��+�G�ɺ�Eܝn`�MZG�a�u��]N{��>	�$��(>b�ޭN<"(��f���d�*C�OԒ���LgG�7����[�+�4)c�FhޥG48�$)vm(O�D�A��̡�u��}
N"K��-b�6���������t�#���N�#i}�4�ʁ��
̈́�H9��v���6% c���c�"�Q?W.o��4�[[�;~
��	5L�sΉՖQ�޺�_����z�r���������F��.�^��e;A\o����?-i驯�nI� DB�bYA��Ao��ںJ��|�1��M^���7p�������l�;z��֍����16���'�#���e���N�|؉[�c��v�
�-�"^:ү��2�2�'xZ���Q�h��O�_MA^ �<�iy��}N�[�x��]�<�d���i��v�u��n�^@�,��ͿrH�{������<t�{��`x�Hrc�F�?�M�8���.�a����,�m�Ķ��7"ra,G���c�Q��Fz=�x5:	o��~�>�7�0�M�c�)&r����5�>��Cև��z���5�s��C�z&����	r�W4��|�+2�]��>D����d�65�rq�QH�x{*��}.~�[��;�}$=�4Y�"B���m�z���ǜ�
tAx���0^�������D�c8��r��W���Q����`W�嫜&x��5��T
x,����8�kc�'2���DP��"�^(���{�p�����Q�@D�	U
S0���m��i��`vg��2D˜��o�X�H���]�c����M�����EZw�W��졾ۊFr��·X(c�;Ln��	 �g��ܵ�$]�����1�&:edi�빚n�ְ�k
�d��������L�+co�(��Q���?��7�Hkx���t-�vz�l&%�KwB�%��	æ��õ`�E��ڄ��k������TFËM!3�]��׆Q^��u�L�Cf�4~�%�/��*�T�G�+�,����9	�OQ���G�I��2I(��)��
|`�ׯ3v�ſ�������}��7�[��:�5Z����� "?_���g�0���Q�"�4/�@��O��rf3�$}:�gB�-j
fB~�.8Ofa~����S��vޢ[�B�Ƈ���&Vv��\j]�N���P )*���fW~Y��3A�c�v��ؤ�/�%���F��������fT�O��_��gzIy~�O�3woy��ġ�~Gy�/���j�u�I��3Z}py��4;!z7�(����������DOÉb~��!������q%��oy��~�}�#�
	T����{�r�fɢ����\�Z�7~J��3:��V��:ץk#DD��_��6���sE��5\�^�&u��3�:��.��;�h�Db8.���81A"���5���/��&k�@���& {!�c��c�a��<�b��9k�<,�%��I���8y0�l�j�4������Df�un�M�	Ǿ�<p�y�P��)�O��]��bu�x���Խ���򳨤>�;�S�R����R�$<�r��u��v�`�hX:X ��,c���5��h׹1e�濛u� ���S,���z�J2���yR���� w'L�Xs�T�e�Ԡ��ţ\���6h��'�1/J��e��J'v�֊m���N��.4��ҍp�8u����#z��OnL�]�.��#x(�*;���Ne��T�&�6qc���Ov�0�:��\�
SO�;R �h�o���!�=2�@����_u� g���Q�������z)�']� $�e
Ի�:�����G޲wA0��wi{��
A�to�%�w܎�G�G�X1�Z�� c��9�t�\@#�nc�9<���]*��5I��w�–��z�>Z��44��FD���ﺹ��z��C�{��hYHl!oV��+��
s*����L��@�*O�i�g���q���T���>ND��xf!"
F27x�)�IT�b�Y+�'��)iۧ�K������;
�*A�N�P��&��/��ZǨ����w�7������d�	D�.���w_���E�_.�Y"������>d8�}��]�����]��.����3�]�qǚx�B�w@k���m�kqsr��ձ7��\�w���Mz��}?��n�O�k/����f�^mv=t�M*����:,zKL��)'$ω`s��z��t��QW����od����qu��Kt�|��@엍�5��|��x��סv�t��9��_:��}��"|�c�O\ ����;
�(��k�^̠^|�8-yN������<��g�2;����Z�f���w�M���ᾝٲ)ޙ3��LpC_�Ր~2{��Fx�Ic�ck���\Ò�� �zL.�o=�*�.��2:H�b�<�G++��FH�.�ܠ�7B�-���w�8��a(�yJ{�gtw��Z�t}+)�9W�d��u';D�<��[�/6V.?�J �!��Lb�dv�ɧ��i���B���V͑C�:|;[hUT���)��cQ�ݎ��)ܪ��<*��*;���F� Py��]1��.�?��.�*��n�$��Q�R���ah22�2�wK[A�B�����8RVY[mw�ݵ�Zm��bY�Y��ȴ^-�)�����9�F�j����|���;Ϲ>�9Ϲ��<��!t}�"��4��y��	o���W:RV�*c��z�i�_�i[�iwúf/߻���3{��=���ӻ�H�!�3&:4��
�x�=�s����w�Nk�r
���Ӄ~��ܕ��f�;�M���&�ao���7��9�
��ٷ���Y{ԙ�}O�I��Z������u�xF��}��yr���tv�5d<�D2n�u��M�t��s�������^���D��;)3ն���f�U냋���ن���[�kLk�zx!gi��/4�4^�"��� �wʕ�O#J;��e8L?.�s�+�^�P���9�xJ?����<IK/*ee?�ִ���X���^�ǖ�_H�[Җb�P�`SL���bDə�?85r!�*M�y�z�
�K�s��S�i�ͮ���!E&�m!eH�	�C�ΚG��o��5��F���G�f.�17�ӫ�tr�ҟ���������&9_�h?��Ź���&.�՘���=��'�L�����-��WܝL�Ҽ�t\)F��3����M#,��ɗ�<���,a-�%k^�B��sx�Ĥ�����4�h)f�T
Տѷ���\nO���
��Lg�-�ĥ� �&�B�l d��DB3�pkͬ�����G�!��ӽ�b�ў�(kެz�/M�^�v�.)���3"*'�?�������vGz,��v��
oF��FuOO�}��XR�-�7�4�~�1��b���u����;I���1a�uK�z���-�P�$}:�urem��zC�����״u㩆*#�8��&�ZNv�yn��hI=�4�Tq1h�0���{��e�\��3:��G<&�ԫ����L0�i���Y�A�9���\�=��>m��9���35�Gu$w��/_��ܑ暴K�m�?���R?�&%�(��Π�^�G_���(��q��i�WR�ߕ)�\�C�K��%�F�H��O��!�;��<ro��%N��Ԛx�)C�7‘�.���ݮo�ی����@�BF�^ĵ����$�U�I)�
4�
l���^}�D�G7��ϕ͠���+�Y�_k^W�gw�	���;b��SV�)Q��!zstJZ����w�=�o8Yz�Qv?��2�~E�De3(�3hjѤ7˯/�uC�����ԉSvM�wԘ�ْ�՘-3y/�x��2<{����8"`by~��
�x$*)�9{��켖�7��Aa��M���"��)�>t��������4�[A�2��:�X%�֡��ih��*~�޸ޭX_ư\=W���G�m���"��K�h����w~�ϲ����<�9	C)z���k�蚘�:!�Gr{��ݼ���(!��/��U���-�RL�:~/��.7<6�u�4��=(�#���8)�JnbG��w����#�����>��a	uR��J��v�o/�z6x�c�\ݤr���k����*�b����6w��9��5�a�b�M��=[�C����@	W�t�.�e(�B	�ZD���"�Sw	"q���`�4a�z�V��E�I����G
��H�'@Y��ģ��'Ohd�t"!����[�KL��1��=�frm�r���,�)<��6��M|�k.�T��9~r�f�5��Y���\d`��D!v�q�D��{B�H01˓EN��fD�[,��mI,�{#�+�.S�ɵ9�K-�)c�B)d�i�zD��d�y���&�x7fַ- �z@+#^@֊��B�� _!i��Z@Mz�)g����BD1�$~f���Z(ǘ�7Q�f��'\��n"�>�:�/�R�M~y�4��2Q>(�r�b�S�W>Y2=�o��r�B�Pȭ�܎�[��%D�7-��9e������|^�MX�4�P��}\��a�*�Ľ�O��8��>n׵�?�4M_sy��L^�z�]��Z��QV���k����z�?�2^dB�w��e#����W��d�:�1�M�Dv�M�<�l��<
�0'Js?��cX�Y�Nk�Y���K���{��~�/���eOڌY~����>^�45TV���c�ʦ'H��:�����N��J�Q������b�j�4������W��6�9�߮�.��Cl�!0�_�FH���.�s|��r�z�7������o���@�<^�&&E����<8�K-�T�S���t1��ۄ2��;Ņ��&�zf�~亙G���F.����Tڄת��q���m���ĕ���>��j�}G��ԣ�My���sc%t&ƋEp���vȕ���1���Aj����D��jL�����(�'r�߈	�d	�(��u�A�'7�<uP�{9��}k�y{~���߷���+]���<6��<�U�Wt�^'�|��Ϲ��샚��Q�޿�Κ�˅Id��U�q �(�Ε%�gpAu�B4��I�ロ$��#Cc�gwF�y��˖p�D7�Wu�MD%Ҙ����p8ݰ=�g��:������`�Nr	&��ѷ��b~h(���O�d�I�n$*hYjr�R�DՁ2c��U���Wy�Iߤ��'x#`u����|]P���ڐ=i���в�5�(��f�n��z%��k�S{}kQ���Q�����R=s�Uט=ofx�L�i))\�]��L�ǘ&�V�S���խ�3{�e�s���C��ٓt�걅df�L'*N腬�n5&6��(���Y�y�.���]��23��w��8�N��e��U�24����ӫ���5G�Lh$e�i�����9kN�7eSy�gt#=]�@a�	�G��X�sQ�;2�4N?��f���
~�&���,�~>w>�I+�f
I��M;�:KU��Z��A_8�0d�W������b���⛨��[�2Ir�Q��i�B���E_0&*#�~�h-�aV�xއ�$�N�a4G%���Z�Wj����Z��Dq��U﹊����Qc.d�K��y,����op�/�h�\h)A���`,�yv�J=z͔�5c)M��q;}���p;�ԘMo�����*�З�rzP9k�Q���W�/9h;�0����dR��J~m�ٳ%�����l3⥑VDx�gS~�!���mc�1yo-�ֱ碪���_�ġ�y�߼����)���|�uC���4jcIm�ؾ;�6�<�ţT���F�M�κ;��xA�nv��h!qGx
DC�6B�'��ey$�Z�+��Y����]��ň��H��*�D���z�~��z�������l���˒-�Vy�E��{]k3�7��Yc����,ڋD�$�}�Ԙ�t�y�eam�ؽ�1*�����s|�&��Qv��g�-�<Q��e��Q�'��)���x�_�,�x	ϕ%��w��wYV_�Q;>�uT�
z��eBY��0�*O
�Q��0Q~'I�=��T�4�\��2a�V��a�b�e�0,VfC��)�$eJ�2�e�0�m��Q�)�J7a&�(�e>%��ť�LlS�����zR��)DŽ�ڒrP��KJ�0�5)ʳ�Lgx���L=��E��L��Q���\)�-|�fځU�����*9�̕��fRq�X���)㖶*�KZڪ�.^�I��+�id�X�Sf���>%vʷ���R]E�22�/�ڵa&ie�0o$�a�L�'�y1��d�$��ȼN�i����Z2;������@������Ί+i��H�daV�<D����K�[�%̴��	���-.�g2��X27
3W�yT����^�IS��0��y�0�
o�Qa��y�0�*oe�0�%s�0��%̋ɼX�I��2_��Ȝ-��d6�:2��F2��d6
�Cd�&�[ɬ�md�X*ʂ�ͥ|J���,�����ZS#?��_��*�1E�7������q�2.�p�$\r��pY�K��-T����X�oQ�p�]�L.C��.��K\
������%Z���e�pQ����U��.��2[��'\p�.�K\&
��N_������'���X��uIp��e�V��s��~$��|fn^�S������f~��U�z��k���
�M�;��V޾W[���?��eM8��y��T���&��z�n�l�Z�s���h�tc�r;��[h����`ͅò�0�gz����v��xA[�gb�߬�m�Q�3����{
�8LX��{F��&�F��c>@.��hA.��Å1�sݲ #�C?��OY�V�q�0�P��7�r��ݗ$��?B�}e�ZB��\�"?�T��g��P��azw�zc�{<��d�u�
8Z�N�8�~�Z�8m���Q�V�kn��m5�[
0a�wX>D�[Rk!P^���BFPbsh�u�,S+����a��z��V��[li4��MW�7����_V�(�o=ڞ�@5S_i���[���u^����3��
wPh��(�Oʂ�����i�I���.~��O6����o~�$���$x��yj��?�3�ەO���5��!K�{LU4`��V.�Tc+���1��7{��Yʀ��;SY�5���]��CB�w���Iwi5��D�F?�BH��
�lzlZVM���f}��Á�i��R�0��\CH�ۀ��Z|6��՛�V�s���ڹ���������M�Cf�^Z�j�����a�kh�(pSW�31��5T9]�#{yM�d�<���C�@	t-�>v�y}��k�\J��W�P=k���$��\/��;L/2�/j7go�Yú;	����.�axy�D���X�^!�^k
��dx�2���:%�
!DŽ��P9���y�-�z���Dz���H�%�"ae'�93�H-���K�geq��VOѤ�i��K�Ҥ�{iu��K�����ݹ�z�&�NBfM	A$q�AGAi�G6d�E"{��K��v?���H̼�l����t:���� �Ő�U��-�
>�
��F�3�����K��;�|y��Qz�K�/� i�P����SkL�`�a�T��f�{1�6�%e�&|���sQ`�i���hR��Y��ڦ��2�-R��Y�:	�ך�d{u��m&��8x ��hՑ��B�������-%BA7���q��Z��bÖ2C� �1�h�V� 
�4[^�>�5��ɽ��3��֛S��fB}���kiЄ��!p�� �����A��㳓H�{�9~�w�&�}fy�%��M��L V*�t�I{���+F��P}��&�~]�y��v+����6Q}��y�n�rݓ[��QTQܭ�-o2�����"�g�5�cm#�n�8uΔ���0�{t��B�{W�2�}ە��D��򑢦j���6s�n�ҷTy
��u|�Z��$$�IW<�&5ѕ�(S��E�tMT�;V�F�֨$۽jP�D�/�b:!э�$in���R84=�'Ҷ�>K�y��/
A�j�u-�m�f�!!˝_���G�R0���7io
!v�0�R��Ϩڱ��E�;��-o���*�ݜpM�����8�Ͽ<u��>�IqO�R�=B�!}�
U7��(�TZ���r�PLg_ѹ�Ȓ�Sjፆk��1z��6s��$�fN�҄�D����G�2*�	Q�|���~��}Zx�ջb�ty�$��sB�3c�kQ��*���l���Z�Z�	ƶU(�WY+�(����N��ڊ�cO�c�wHjx<��CB@||�;��9k�#���G� T;X���Su���k�,r{����R��e���xd��#3�̤Z�[Q'��*:ԪFӉ�	��^���t��#�m�&���ꩡ�}�x$G�"�t^ºf/�@�O塾d���w�k8~�Ho��eC�V�_W���Iֈ�e����QM��`l�ð>�wU�Ƹ��߮Kvw�o�ܩ�F�q���H��w���䞏� ��>��^E�*M�ƕ*;�GgbhLʡzl2<�P�-�q�H �9�����ʤ�(�����q�O	��]l��q�J�i
�*�x��h=(5w1�p��s�*���	��~y���67������i�8��85�o�8��;�5����E����.~��_Lp���0WW�&��r����CP�Ia�5�G0=��p
h��Ap��~�K|��F�G@���7;[��i)��Mw��?�"Un;S�s3�s7�ʰJM>��{��)��qԷ�w�
#�0�B���1�%��$�z�o�>��U�EB�)W�䴧w+�O�ֳB�mC�O��^�%薦�DZ�ŗ������n�~���nu�z5�[$��]�KF�N�l��깺�=�^JIх����\+��_�{�oM�YK4�R�IqTN��MqOp|���0�������'y�Z�)�J��Wy)�KQ���y�Zq;P]��>��&��-t��`S�g}I��d�m��sM�]���8'-�lZå��K\�F��<�����٠7�"�1��5�?�j�z�R��4�*��+x��4jD�Ҥ��gm����kPo��u�SH�-tos7�$�a0lڣ�ܟ$��$���B�*�*i�M�)�807��-�,��W���YCU%z���j�χ6���
	����7�*Vt�f.�z�{ֺ��\��t���Ë��fЂwx8����u�dbUޢ3����Q1�+φɣxO�*�<��y��T��ܣB)R�Ӂ�$�"���*F��YtR�r�nR�Tk����tY�4%�-d���Tz=
Isy���^5�ႉ�	��)�@T��j�aC0�&0�3�h'[ދ��|�w�a�ω��2�"oj�H�{�x���&�a��۩����c�hu���%��ä���r=��uYt�5�_��HK�2�')�Cp����t����^�9X@QӔ�� H��Y�/��`�Z:��sT���}��-(ۏ̜0�3�P-O���C��Ǣ��YM�y�3�D��NHW����+�.�|�.�{��9�k���:�#q͌H3�k�3�R�&�^I�`���u�0w�����-~aݺNd\s^�ʘ�
k��4;�2r���	��Gf[k"�K����fq^ T<VL�(<��PQ,�aI|C �&4[�0
���3l����g����8�Zћ�?�UǴL�n9�Q�F�^��v
��2��hj&��Tw��5�/Q�t�C���!iJ��.u��ktW�0�r���r���cԑ�%^���6�v�^y�к��V����ߢ�5;��Ԏg!OW��ۄݣ��B�z�bѸ�-|5G�`�h�yoXk6ERh�g?4�7�A�~�O�ޜ�O�y��a��ʗ�K�wx�jL��T��c�\F?���am ]�N<�T���F?;��`�e�
� ���t�6�8OR�1����}���`��qԘ�׈�y梜Ŀ�}������_�-Jyѯ)Au|dHs���W���ʑ��x�܋Rn����M�ក�@{v54�����w]��Ұ�?��9s���X�hGw�_]��sۯ:��r��N1���"uw�����s����3D��X�*;[N���uw��[ʉ����w��r�Q�����ߟOޮ�Ykҍp��K���h��~�K�He���D�cxj�M`� +��51[7�����e�^_ј��[��A�ry���iQ�Q*DH�'��w,/�������_���8��2�qڳVY�o��IHJ��y[�� Z�RFQ8LJ���ӷw����^�{�<�֧�į v�(�DŽ�Gy�1?���]���c?�Rg�|�	�OH�#��;�2�,5��\�G!]�����8�_�}2o�Fg�}�0�	�ҹ+�ōU"�Y���E_��z:��N՗]e�HǾ��	1<��kw�C��
/�H��rz3)0�8���N��"�����iּ���u�z�e>x
�Gxc�y�I��%~{HV�!՘��P�p��j�ʩ.bV�DMS?]U�i�"~Z!M�y=����:��Ȩu�T��v�n���´A���Z�����QgsJ�@������y͡]���>����]t�i6����-c��K�
�##��{ߍn���|v��y���
�.�7L�0�=�tr�Tq^�*ɔ�ՊRs�T�g�U-i
{�������w���:�R����)�t.��;��1�ܾ��&ZC+O.�n2��R����b�(h0�����S#'�c
RcL��`(]��8���@S9���Uf����0G�#
1 �8��}W���+.~=x�]�;f�s����q�rQj����G��w#�iF��L�Q��w$���S+��K7m����p����7���;�;�r�"ג�
�Y��)t֣ݭ�[t־�g~�{'tޖ�CIi!i�s�݄�{.�����~`b����X�u}�DN�`?r��!�n���W*��VD���
��b:�pŚNk���(NJ��E��@���Ƚw��y�1T�į��C�Ys(�cV�C$&�JBM��zڼ��Yg�m�Gi!��u�]~�k�|�bŨ�N���<���Q�{���Ҵ����U�pA5���{��/QdU��0��)��Rc��?��(Ҩ���q��#��5��h����F���6�g\�ާ�Qgj~Aj�����_�gW��3nR�-8��o��W�i���Nӝ���j��$�b"�$,T�5u���'�l�^g��3q�0c��2�����Yk�h̹�(�k�!Ro��.���%4f�Sx5&�(P�Er��}Q!��#
4a��գ�j�����)	 t�<�_P����bZ�b�@I�)�=���́�\��Kz�.d��o��U�j��{$�M^tC�΂�ze#	��Ð��ĚG��&#VFuPCE�@���6��gL]i�}i4�IڗV��fQ;�c�]�Y0[����TR�*�T�3F�y?P9̗̞�(��pb�����m>�	���w�3�(��7�|��(
�H'O�B��J:��9'u;����{��I�*�J�ݘHK�N�U$�)�_`\�Ƭ�)�*�)�¸���/�p�h��>?��(�*7�<�OK����=�yt��s��c�&���Na�+Q�6��8�r�j����o�k�sQ��hH�G�y��"^h~�*Z��c\���z�`��B(h��h&���_��h���B��+��N�’��b�D��,O?	��J����9�G3i��p�:њ��(���]`��.+���&æ����N��%��T,���	�\=&\c;��Sk}j�j�8iF��s�k���W6���K4�Y���#�F8���	J��ʨ3��Dd��Z=�|1
�g����Ž^.�p��)OS�	�UJ�ST��/W�l�,��X�/n��I�k&��]&Q�j�z�Η8Ғb!{��9�h� �m�'�\�&�Ah
Y=_�����-��s)��t�Öw��Z^&��H/\�;��v���Y�ıɋ
��'��X,��^$7z�ѧ�����s���Jv��f�]��ky���;�<�E���*�[�s�F��P����O5
��>��V��hJKHCM���^��H��6���\��u��y��p����z�w�����J]p���
\�H���5���ZC}o����Vڇ�;�U_���o*"-��a��ļ�`��|qW�����u�p�w�����C֚n��y7KM��5K8N�l�k�� 8�`�z�����	�2�H��R��q�`f8a΂$y�4=�X-��J��U=H��`M��A���;;�F�B��i���c����"�Ch�h�\���U)��'�����>��̽�Y�����6����M��f<.�g�E�D4W�-������w���B�tT�7�3�CξI=�ޓ�yM��:�I�1w���wN��:��2�Z�}�ҿ��{pQvߢ]��S�滋Dy��Ū1��s9h�Ձ޷�
���#�{�R���4� W$���M�����H�-5(�Ľ�3;F�+���~�u�I��=��,���+��&|��Bޣ��@��ڹG��a�ӟ�RI_�d��+���i��
���T�q�f�poE��p��Hw��]�g��[h��fZs�ų_�y�뗤��=B���w�BҳѡJ,��Z� ���'|{2R1\�e1��9�S����n����,�˄�����5]֊C*���r'5�*w����>6��7s�Ao!P�I�I�kӾ�#����Z�T빏���[U��{}	)O,��`ii��S+�gp��>���&�~dс��o��~��ʐǿ2=�M\o֥L2<?_��5���F
�����k.p��s��"�XR<1�`s	1�uby�N_�y�k��Y��Y�Λ��}-w��¦ӯ�Fi��K)�T���'X�ӹ�q�Y-c�D�^�m��vW�.j��#�J��	~~���ߏ��@>}�;9\���b��-��)����v~�X�JռKc���c��
�,+�ꙕ��;f��y0х�*�Db�nI٩2~���L!���W$�:��}����Z��<#�Q�i{K�o��{���D�_���fAX@�|W�*�m��:W�u�{!�y߉$�1<�o��)�NDه0�gJ����u�����K���J��uьns7���b��xWS���a�W�1ov���
Uq���{��?o�磑��v�yC壗.�l��uN�7lӴ�+��%ܑ+��,x#�~F3�ᢢ6��w��.�1��}��k��ƻ��f��O�l��M�1��Io�e?��&�{���Ҝ���ر��gw�}�G�}�I7�R��I�2T�jF۳'�}�3:�O��y��}�o	��>�a����'�z���	��}��>�
%��w*\�윊W� �i�����j�B�7^q�t|��	��%�U@׮��{������=�rO�.�~��O��u�k��u�	e�,�&R�U�1K�l�o:4�Z3[Ǖj�+3gr&[=���W���P(���~s$f�����g��'�Ҽ��������4��z!o�VM7n��EE����/�:�1��ԁ31��g�ߜ(.�ϟ�Yr�$�)�y�̸yO�O�ߩS@W!���	�$b�(Y2v�l�$)#��8;�Ȣ���n$�G��nm� ���v���kfRc�@g0�����ң�o/�N>����u9����rG{Q�����j���Q֤3Vk�T�_��ǵKO���E�F���dE��H[�+���۫ʹ���
W�,l��*V&1�(A���Ɍ�Ȅ�͏����o�i��=�E&LQO�S�b�(�m�^�v�}���Cn�,HS6�n�`������û$|H¿JX/��*^��K�K�)�|	����Q	_��
	?��	��$"�u,�K�U�M��J�C½6HxB�o%�/`O	�H8S�������I�6H�H5P@��)Z%�-a�����p��I����%l��C	?��[	� Y^��p��i� a���K�I�?IX+�q	?��I������I��0K�_HX,�Z	?�P{�d�̖�l��=��#En���T�	�~��m�g������{܃�O��Kކ.:�pA���8-e��lgI�����%����dv�
g����UCIfO�A�<�!8��f�IlK�ii�l�b
��
,������]��͊��"E;3�u��5��,�Ù�2���͗�=�'w��bۘ��j/�tЙ�F�\�!�	T�r	s��׍��6�bLĥ|�V�q.�a#G�0�ⷔcY�-�K>p8�[��V����C+.�/�>��W�n��J�nh�)\>~�]�iDjn����H���J~��b���s)�.�k)�S�[�W�N�"�<%7\)L	rn�xx��\��Ƨa<o��B���f#��ZlWs�QM�������v9U�i���K��iq^��i�!n!�g���+�b�p�Q̹�y5"����؋En��>K�8�_�������r���=xf��q�|�K8����;�G[�%��Ѥ��w����/4<n^�%W���������<��x�k/�1�DzTk���F��s�#�KމXn�������V��������q�e�6*9������]���bѾK�?��Ky��_Q���_^��*˜�)��;�m�]����^���D'Ǟ��#n�0
�?S.O)��?�M.4���x]�����.�c�v�E-鸽&���ϧ�B�:Je���]�қ�W~?.~!���������Dk#��B���G7wqr�F����$L�(�czio�^�C��\ڵ�I�%혏q{��;��������מ�Xiϖ�a��SZ7�{��O�{i��>ҾN�j�v��������o��Lㇴ/�ғ��5������|#쪴�vo�N>/����l>�i�^:K��%}��2���I�DP�Wn��(k¾��\"�ổ׀e����k�����q�ٗa���/+������x���P>gF��r�Ǹ{"wO�.(>�g�Q�|�̼��Nꁴ�P����r���t��Ho�n>�ѓ���><���d��>�-�v/�<�e�LB؅|�Z>�jZ]E~4�5z5:5�4z4:Dz�}th�k�j��\>�:y�J�$N}�ͬ(Ti�psx�P�gX�>3������38���\�/�����_ç���^Y�[��R_���3�h�c$�r<�����Da�Fu1�*c��ٗ,��*�
%K/�O�s��u����<L�E�R��.�2�ż�Mg!��-י�+g�B�;��cXfn1�"]J��n�I��/'\���S6#��v��r<�����,v;K}6�˞_l�s��6[I1w��0�Ex(>šp�����
��
���l���ҵ[�U�c{��ջO_c���<��k���4b���c�M{]���OH3ML7[&M�fdNɲ�05{��3g͞3�ƛ�Ϳ�rr���-.��֢%�%�ۜ�.��ee�o�c��U����!��+����b�����v�.���O�3������Z\�4��<W�����k����e5@��3�Zk����O���o��Y����s�ۚ�.�r9�S�fmEe՝�\W�޳�殻7�s�}�~���l��������G���c�?�������߶=��3�>���;_x񥿿���n������_�����ơ��G�<����{��{���G�����O?S�>��>�ŗ�_}�ͷߝ=�r��������;��5 �O�:���ܱ��
���p���� ?�����P����6����7�����~o�}m�t�����6v��Nk�Z��u�]��0��8�d�W���0��*�;�.�Ş��(.(q.�s$�g喺Ly�¥�����sn�s�"�Ē2sf���hx8VY��g_u�.���^�.*����h�؉u
�
�X,��N��S���ٵIIs�C0\yv�9�s�`A�(ãG��z=m�Y�ƓN��w��)G�w�߹��[p0R���BA'%�g��C�!�S��#>��&��!����!�ŋ�!e�2��
������]&v7�:j��"�0k����%���ԁ�d�$��Tt��W�O΂�؃\,׎�r]�EF��Y�4�r��y��o���[Xd�7�J�%{��^f�s�ri+�Y�d!��1�ؘ�@�|ġU
zx�pN{n���Y�1��h�l��y. c�f�B��^���v����E�N���v��ϛ���|���0O��|�0���;���jg�4O����ؿ���R&�Ti;[��@�,��afm�����]Ƽ�|�����о�3��}���9~'�B�J����K�
V`%�K��„R#΁]������t�}a.�
����v�g��B��ԑ�g7���N��Dw�3qaaq��x�`-r���Z�(5,t�/�����؝K
�sy��c�m��݈�o��=�ǁ���|��ɮg�Y�3�/�Y�k1U�RW����%�W�<�2L;���'ڡ?�+��o�U�?��]J�͚9iXJ��3x�`c��բ6)\��`䱨�d!���ue��y�A�s.rS���ؗ��),0ڗ8\˯������ʔB�<��̙�ľ�Dnm�����qcl���U�&>�1vG�*�_i��~�|�J��F!-��1�����KE�E�ߜ�_XꚿlL�pG�B�3��UϺ�G�����tCCdm��d�ػ�؇1;��F��W��u�X��I:C3$wb����^a�W���J��z9c��j��Х6����ן���%�a��+��
=f��ɰ;cj{��w��Ź:���/�F�9;55`p���H�ÂX�ǡױp�\�-�uK6�n#��;7F4���!9���)��H����������RԀ~M�����CJH"cV���0�cA{,舝.�ұ �ݭ떯=!D��_F2���V<?F�E�(��&3�P�/��?��C'6���=���f�����B#�Ydrw���:a~�����C�2��cu,B�t�f̏fƙXw�l��^�=c������e>e�r�5��ܣ
�ȏ�1Lo���	�u�|�~IO�ᡬw�^�;y�{�u��p��rn�y	`!��y|��g1.��!,��]}����S'1�����&��<�~�$�0�{��`r$�>�kstck�0�X��Q���A+��L�x��a�`~o�2N� ���u��'SϱY�q���6�/o7~uedLc׆�Z���6�kn`l؉��*c�f��ǰp�?����fq�SY�.��e@J�{$��>��X��gY��gX�6%�����B|<����f�]�NIO��z�Ţ����D[ \�M�m�׊+Z�C����⭑��.A�ʯ˽�ٺ�0�)Q�+���{y.�t���.��(�P�}& ��}dW��_�z��^��4wm�n0�F:"r“�;���C?7�{�(
�/�
%(W`٪��+��rŢ�tG�����ua"pQ��[Y��r4<�]X'�[��H
g}�g}u[�彝(�� ���͗��t�/�
յ�עϫ@#q>�dؿ�h�m���H�c�۽�ߨ]�C���Z��8�Wf��ѝX4Ҍyy>B�K���O��@������t��;����p�
��p�=�Gc���Z�>�cn�>�sz^�-��n��!����Z�W��X����}�U�Ў6��Q��0�܃�ݳ9��n�]�9Qټ�O���4OmA߀7B�S�G��i���R��	�H�r��߰HK_Wԫh��(�5��a��N
A��H�/�A3	w�S����]Guv����g@����4x�9�u�� >&�ڡW�����k,�
:D�G���:X��u:u~e�_��&�8PW�>c܏㫩glW��~z�e�}@g���G����yF�q���D�:1��/��
��1\���9�P�0���շF��/1fh������3�bރ�0�i�o���K��៥�Gۨ��M}�0���kST�Q'0'i��� r�}Y�q�w�Κy;`��:��G�+��ΎȜ�l]����\��6�)RеiO�_]�շV��":��1]�n��Ą�f=��
$��n�:��^�s]֎��Ha=]ɺ�ɣt=uI:m��E����+��͏B]����M�{\��.�A�߳A�� ݷ��W��"���;��n;[�,o3c9�Z��m�׬��?���Ϲu���[��?^��lw��%pV�sXB�;m�e��a�`�߭�,Y(vp�b�$�ݞU��I_���t��im뗱}����R]KM<'��5��9��xQ�]bZ���v'b������]�"���5]�L�����%��%��|�$N���D��R����|��|���J��E�I�E�r�P�'���`�y+���\����3K�����:ٯd}���p�p�[�?ڛ��}l�A�����|'�����|�7`H%�e\`r���,���t�^TR�٦X��`��v~=��k�}I�R��{�f��p9�^�C���bf3�YsL�<z�V	���NtK
�]���=�Ae�؛�l�-�p�Dg.wP�
mꔉ�"��:]n1|{#H�7k-�A�����-eyv�	�B��g�Kzf���݋ٝ�`3U�AA�]E��dnѬ�e�����URr��1�]�G,�.��%��\���Z貗��@rQ-e�kf!>�;](��v��e�]j����Q�ܢ���z���g8
��Kܠ��������ɿހ�7�&����s��v6�l34ۍd�EUN|󫏯��ʙ�ig=|�K�Eq���9H�W"�/��{�lT����Rn{��-�
ǟM�Y1�M����S-62G��@ea>o�h�,10+݆dxB�N]����uR��] ��I���ȟl��"�/YZ7�^tI�ޡ���-��5��%����Q��v'gIq� I����,̻UR����.�may�˾�>ĘJy^`b�A3��v�[�3�1��/��c�hY��/����|��D���nFɺK����PD�t�:�>��)�gf�:i�t;�S�n�#W�˟Z JgZ@��>
��(Q{$Msؕ�v�v�#
�}��o6)8�j�DYZ��Gjk���@�ɇ��d����d��<�y����`Xk{
���0��v�&9l���
��:��K*a����J�%h�x�����"_r�'�GK�I�ӥ=[ƙ.�gH8G�Q�]$ݗ0:��e:cv���%�k$\+�+���C���Dƒ����Q���}���
��'��~<��{�r���_���������!Uf��쇅�ƿ
�{���o�����t|�P�w|������{h�����~@��"g����	��c��}#9K[U��V�����?;��撀i>�3Û$|�=r���#�#�:ƿ�an��	ϴ�8nd��r|���<�a�y�F�1/�?N��w~I�X�|	s$�/�\	�%�J�&a��F	�I��0HB&�E��-~+a���%T$<)a���KxL�	k%|V�'��T�-n�p���:$̑p��3%�J�$�Q�Р����=JB��L�?���P����!	�IX&a��s%̖�*a��)&I8DB���FI�gںYҩ����PÿU�7K�NB��9Z%L�0^�^�%l�$ӓ�k�?��}��m�?ŋƉ������d���5O��ӏ���)y��6O�||$�$?��^��J���G�+._��$��񯁫�sT�=8㟃:Ig�:R!�	/I~�)�����fe��=�[�����7�x�х�Xě�16������`��{�xS`�BnxC��@
s3����`Yo�]p'�����.�i]�>��a~���0w�˘��0gHs9�i�x�:�[G�.�ѱd�O���(��a�<�_�=
=�@��5@��</��dl/�3��e
�	.$xUx���S�oP7���(�O�%`̀���I0���
�9TГ>L������JĘ@x�$1��c)t���*����V��0���c���(܏�7Jп	��ɨ�p�8Z�=p�h��r�O��¬����q0W��ZA�f�)H�x��u�3�|�:�[��$�M��-�q��������)�L4�f�S+&���D�g�`L��?C'���oܖ.�l�f�W�EZI�3�6g`��/��a�x^vxkA��L����N��<9I�=��ɨ�p��,h��>q�(�;����������nB����)'��)"<��g���t�ل{<�"i^�yA�����N����ȩ�\��F?�����X�ߜ.��f�0�7Cĭ�9S�y6� .�Kx7�
�s0�❏0��z	�z�O1�?�5_�O�������%��d_X�W���07�5��sH>^��,�MۀzB�酢�<�=O�3+��DZ)��»i5���\x������\�����I�K�d����%���N��Np ]���b�/"|3��R�a�����S�������.�W��W�.\���'����O�p�Z�gີ".AW��0�[+A.��U�	�N�V��8뗂os?��(�F�-�DY\P�v�09���im|�Z�|�[i&��#��A�ItԈ�Lp�ݢ�K������{D�L�#�ȻXp/� ̋��|��x�>�+��ӽl0�l�[�6��?�z	s<��D=�������Ø�#A������E�4>�80|�Q������2���~p�V��+{�����?/�+/�M��"���0���71v\�M����M����)�pp��(w��G?`N\��g?#��Q��gߊSw�>�}��]��n��	������0<��"�-�S�Y�> �S2��:I�p���/`6V�.��
�oJ�Q�5o��S	8��n��=$p�h�pw�8^�Lpƛ��_������2C{�8ꘘ�X����#�(�P�}��z`�L}_�0�}�����n��Dp	�pw�a�0���E�S�ޭ0?�v��Ir$$�}#���L��֡�.��WJw��Kw��K3���L�ki&yB���0i&�.�t�)�k���Vi&X'�����J�_2���D'A�t'�f:�gi&�W���㏐i��1=-����r�F�N|N��Ğ
+�u�@��fUN�
 7A�A�W���0I���K>Z�q{HW��S�W���:p�܁���wt�^߁��ܕv�i���{1F�y'�0y�&�Wu���_���[�bn�y�[�
`�j��G��V{�:�J�[?ұ���C�3#��.��_��g���l���lΜ9������nQP��/g�7ofO<�۹s'���e���t�����y`X����>X���-;ĭ��//�G\\�l�

�z��!��9x�]˗���edW<x��2Y��/Ջ�يf�iDV�I��C��_PpQ�WS���

��¿����O¬������}����/�H_U=�ip#�.:�lgɟӿ���%d�4}~\,~؃_:���-!�������h!�U#��B�
�.��?�nD���-�z���yXz�~�4NmAt����[.*������v�\���m�Ңro�B�o
���?�Mx3�:�ov�o����	�}��@��r&:�^��oB�j�j9��
��׀��J�<J��������f��3f��o���:�q�F��?��=�쳼������ԩS�z���c9�m����q��|�.�zח�
n-a�QD�Tu�.�Ԅ[W�݂�aX��y��}���f͚�� +�πnͼm��>�@]U=x׼Y�j����E�v�E�W��s�1^���o_5*�����~��„�� �D<J�|�w�$<d			,))��?��L&����y7m�46{�lv�7��o���ʟ�-Z�n���d��t:y��r�J��{�����3�RY�"�pk:�Tbb�;�؋k�c)�`�[��m��`����p+�ʆ�Vو}*��We�_Uٸ7T6�u��Uٔ�*����J��:��y��,�QeO�l͚5�����s�=�7��
��o˶l��z�!��c���ݶm{��x_��K/�7�lck�R�s�*{�W؁�믿�>̎=ʎ?�>����c�ͯU����z���ľ��s��y�577�s���BO@"���I�T��L�M8{g4`�څ�WG�y�4�\��mV�aϩO���a�?e��?�'!�x��B�◩�l=�oA��"~-�A��~�!~�߄�.Ŀ���0�C���oB�/��_��AX_�Pױ6�Hkջ;�uJ�4�#�L=6��Lc��ۘ��=Lm~��g��wC�������#�
񁫹�#�z��u��O����#Mف���P�C|�?͘Ĩ�.L���#�����g�Y6�6ۏmd	h�c�!�f���蛘:��iw2��-L��i�>U�����7"���B���_��w!����⿌��i��>�B�f_���0
���0�����9Ze_�Pٷ�Tv�6���Ge�R��U_�8���:��!�R�_���E���Y�ߍ���}����K� ~�C�A�?�G����o@�������@<�N��MMfnκf����M���&ffd�͙�&���
<x`���4�x�?�yA��`�d��ϴ�[2'�%�4a�i�P
0p`�~�?Öf�4�����>4!��Df�2�gR\l�Ç�L������1!sA�=b�Cd�A��"�g.��ڵ���4�7���1ݺv�2�H��)~��|M�߭k�)���k(�_0�d�!3Ӓ��'!�۽�U��(���{^`����-���L�����|
�?�fδ�̶I}z�����aYL�O�Ih\[0�H�q�#Rm`�͒i��)h���#҈�L��9iR׮]��`L�i�$p��L��I���O7R:'Y2�6pyR_��ޓd��p��42��4a�m�-�"��il�HO�����Az�2�&�����Q��t�h+($m�P�Z�M׎N���������L4MM�<���=�ܚ��t
2552 $���'��f�V�*XZxt��mRQ���/kT�X�	|���&�f�
�kG��f\�-��Q3,��k����0]�ƛe^���x�j��C��FL$j�5�������ل6���h��ӧ��*�d��㉲�ٺB��LgϮ��m�[Ů�ǜ�����>!�e���������x�����G}���y�>|��\��'��ol�\a�޽�7��s��'>b'N�`'O�d^���>}�}�՗|n��w߱~���sNeO�~�{�~6�:���v�1�rtwc�{�E�ϲ��l�Z�nS�d��ﳧ�S����w�Mk��`�q(�A�4��D�y���@���ⷎs����g��u���i�ٳg?�=�"����Ȟƞ=c{���oT��}P�z�2p���Q��#a��o���71!1���͐��a���92�O�~�$��
�#��!�$�C��.�#{�v�&1\�
���`�ԩ�5��a��7&D�?��ޡ����؀���
M@��70.�|�7�H?�W���~�MBB|BB���^x�Le�~��VG�p���h�T������b�d�sx��?��D:���2����$&z��L߾}���ʿA����Y�U��Ο�@O��4����@�7�g�'���H����~Ɲ����O����0��8s��)������/�.=����?��~�N�K7n\��S��C"ć�T�40w4h�@�U�7v޼y��9�w޹�hu׮]�g�}�b<U�~�mڠR?��#�o�������4!�9r����'N�D9��Hw&D:�*�0��Ya!Q��vɒ%�ZZZ�V����=��Ch�Ʉ��k�D�.N������ܹS}�;8ݧN�R?��S���A=|�0Gq0G ����zj���Wb�f�����p8�w�uW6��D��$t��}Tuu�M#G�$�Ś��!�����o�Q1��g����û>��s������C���.���i'scc���{�q;�I{1��u�ۯ�����{�T.\��~���߼��[;?�䓏��y
�|އ�64�Eq�Q�1���|/ѯ���2�^�_ˇf�޶y�^��{Q��ߝ���={�l@9�G���<�޽��O����>��cn'�M�
s��o���A*7j;��^��S������5:�*��4�k֚%_f=�g����D�T@T�6ĆI		A!HH�(oIR@@���������FQ�/DZLj��� {���=ᦨ<��5_<k��z�{���޷*.\�w��>?����}���/��3gΈ�!#����7"�L�?p�lݺU��1��a�~�߿�Lh߷o�ѕ��*���
=�Gж�{��ODb��c�H��"��i�K�7E^�Z��3UW�� �.�w��1�u��5�/T{	?�e��W�h�1�?|���<f��o�E���?<.��H�C"��t}W�ηE:�S{DnQ7n	E��3����/�����L�����+��ypX�*��Ay��-��C�G"g΋�|O$bGMk�Q����rA��U�|�� G�
�Ξ�#����j�fz@�����D+�]CG�����EZos��l$��3���_��0�yb�}���aq���r�^�#z��������0t��| �!Bu�^i����W[<��n�|(Dϰ-�p �u������θG�W��`�\��b�K1T�ƌt.���_~�E��Ԛ`���œP8Ν;'シ\VM�#K���s�b
��W�Έ<xD�>0|���L���}�&ݸ#��m�tZ-n���k�W>�q��j��9	Ɓ�#�8,d9���
R:1J�Y���h����"���4��إ�`p�6Im�
j��[1����:���?<<�F�����/���?��@xn1@��=ٵp���%�'v�Ű\10�~V	Jǟ�0X}��gl�mo辿&r3t��^V��g.�N(����W]+$B�,����d����ʼn���bX��'��<!2�;�P-2��>c��|zQ��`�V��Im���L?z��8�f���`�t�bal��Y�O�"�Ǻ��Ő�MN�<&��0D1<�bp�sG��lR䁀�6�&�p�֐v�Я�}Aǎ�5Fɇ~�"Gd�<��km\�{�[b�+y�eSngyQ1�+�5�a��qr�ķ�26�*�T�I��g'ƸiGh��V��t�r#��}�nh�v�ۏ�'��n��m��#�eŰ1��TL�*e�!X��U�4?5N
�v�Y�=dƨ2uDO��5HTi0�c�vN�Q�j�+=��
]�	���<�ƻ�c�/���fE�vŰE1l��T�g0�8;�aLw�9Z1��)�#�2ؤ.��������G0׬Y#�֭�";�<�OO~��7�|>QvϸS�MS�/)���ؤ�hY�-��cdAZ��M��9��	�0]1LQ���/C��WY0�r��'�xB������X8������;e�bت�>+l���"�I�2bdaz�<�
Ó��*GӒzB�Iq���B���ߵk���f͚U�!G}X~��|�{��-�!;gD�VG�׻�y��a���i��±q2;9��ab��}u.��߷<��?�s���|�>iiioB+�����n�j�'ѩ�+�h��&�@��r�9h��@?��ի|��kך؋Xf��ْ��]��>��Mڐ�}V!�L]��Ӽy�v�픛n�I�"�V��rff�L�0A


�^��������l��(�}~wu���U�
ov�>�c����T�۶m�i��gK۶m;�92mĈߩ5|())�x@���/O=��<��s�`�C�=�_���8�a��=E񅬱gNOy���ț+�/�ف}�&-ɹ�̿���f�w�}Ӑ�����wܸqc���{���#���{���{��5���
��\Y~��#�!���:m�Y����A����āK#<�;w^�x�bSamG�%//O����믗�o�Y4�6�@��`�3���ƶX>L��5V�s �?���C6?3J>}k��9}�����E�I~~�O��ϗ�ӧ�4h�����}׼���pB8��P��#��ht�zy$�#�;��
�������8Yu�(==����t0�Lt�b��[d�ĉ��[۱8��m͗܀#��������v��Ϟˬ��[ȿ�R�i�>@O���#�'O6|�w��]���v����b���=trD���-b*>����֭[wڰa�\r�+��d"Kԛy
��9gee��ѣ����J�v�x�s�q��-���a�+�1���
��v[c��~�]ЩS�p��|�y����C�P��`HLL��}��Z�r����f�y����׉M�bm�@'�.6Xi����oٲe��dϞ=՞@ϧyc�g]w�c��I�=�[�؂���>(�E���>�=���z"v�=��_�^|>��~�ߜ�^�>U�m{T}�d��U}m�'�hl���o�?���B��o�~��*�&�HMM5�Uu�7l
�m�=@/�	r���x��\�����F���I{
�nYu˰[��
\��0s�LQ�e��{@������1�r"&��kŊ�����˥��~��~���P8�ol��n�' S��5}C?��1}�Yb�ѡE����^�~��c#�}l0���,.4���w;������?�q���vC�;�U�S�\�a��l�ȍ��ݴi�,Y��ȳ�a&�mm����Ȍ���,mڴ�?B{
�n��aܱM}<a�������,�v�OW_��_B?��~�W��o�ؚ���^��'ϰE��A��u�+�3����\�>������������;�*�+�"�~w�S�DM��N��r�?�w����=|��]��sl>�;�9��k(�M��٭O��w�-�}[�`�����]��Zy�_�ϫL;�����d
�{�*?�+y�\vN�x��\.�L�x��98꣫|l��8G�U:6	��k�<��j�?�9J���96u�͝�uα�s�q�S���M8��N��
��4wf3O=�"�>��u�	�yNG%�X�`���F�����=��s6��s���%�\��"�GEz
�ب�S��5������R
`�S�f����n���Y�Ɯ���~�v��j�>��Dc�1���t�k�qb�W�>�P�|]�Z�?����H�������_jý��Yw?��kb��N�A�Ojs��|��3��H���
5qj�����Q��V���ӧ'.X� �����u|��X�8��x�x��b���Nj��w���ckh}r�A�4_c�{�\�%�fOl�C����}��+�p2T��8$f}����<�'���_"�3�M�Щ;.2�X�o�h��k�p�#�!��Qz���L�§h���qn��>�O-����SM
�z05y�>�/�}O�mF��6z<�#=*z��	�eN�g�Ǐk��6eʔ1�~��g9[�r{�Z"�\����?$��N��^=&�����`�'�q�J����¨p���@=�ԉc2��4 ��A���L;8�ԧ3�k���x��x7���sd�o��J����
���*���t{/�kC'�w��'��4iR�ԩSǸ{��@݄�`P_��T���3QE�1�ۘ��&��'�<V^�}�����3cL��^5Mj�V���_�7az\�SF�mֺ�%��ޮ�b�ٳg'.[�,]$�'>7���&��!�*���
���N��W��ԳfnM��-���c�=�������۱'���T����3�L���t�S__��	�Ls�>�T���G]w���~���6?C���}w�}j�gt�U��Ы�Wr�^�k\b�XΜ9��?�|<�!�q�y��o:���1�������%k!�?1��ɓ�fΜ��>̝;��=�.���,��"k�{N��@�=�:$�)q5����ǧP砦��_�.��҃{a�7�b�~r����]��	�qi�@�������㿌��1uWz������O����-����7?U"����gę{�<�L�[�?�.�}��H�Ottt����I����7lذ7"""d�ر�\XXhj6�a�9����F�#�'3��~�}��z㿶m�>�zo�@|=}zKg�#�<bp�Uk���J�<�=������D�ƽ{�6�Wh?~��w��X�5d+�'Χ���RY���/v��7�S�b�t��=�uz<��~�a����/���w+��{T_�����z��������hek�\�؎����RK���~�����y��^`���йs�ι��(��$�ۜ>CèQ���[o�����f�~�?��k/�/q���Ş@�Иa��gƌc�5y|>6��£�>jz���e���K�LO��]1,���k��a�k����c�W���{
nl�W_��f}�Q[c�(:l��/����M��H���pm�>�X��,������KB2F�����͛�}�W�v
���@�3�>�\QQ��׽��	�O�t�]�W8ѯ��[��|���#Mj}����wv��ݭ9�����r��
��N����zO�NJ+6����Q���U��^�zu-�SVVvB�1�^0��g��z{�(//7��>>�Nr�O?m����Y��5����Bɍ�W�� �?
���ң�R��|�&����)lِo9�����F��؃f-t��D�X0�x ��%n���M�&�Z�;*�������p'w"$%W W��\i��E���ڑ�]����8?i��T����^�~�}䝑�w�SA7v�AC��ҳ��5��s��ur6�>��=�[����[�{�zĚĺ�e�f�k�s�R:���M��>�S,��|�؝�����iJ�=f��_���}Y�t���G���D^�c���&�2�&��F�O���[����RƋ��r��A���PM6럲�G����)�|衇̞b����WKd��{���s�7_)���;v�X�ޏ��&��S7-<Ɨ���[��{��~���G�	\�����|�4ts��^���ԓ8�<߽gϞZ�2r��ŵ��i�LO=�~��3��&�枰��מ�ŵ&����[�F��r�����)����ODD�:�Kk͜O���Y��a�W֚{�33�R��L
�IMI������%s����̶���3�e�9���q�]3S�e�����<2)���n᷵����
�����i��c#��!p����4<+#y�$繾��4>KWI�/#9;9%iTRf͛����S���}���R�R��-<1�wZ���I�aY�q�ׂ��G&�d&�GG���䋋��{����h�j_Z�G����/�_\Ϟ��'!�y����MQ�HIu�ɒ�%-�-����kʶ��+�*�.;[vmy��6����G���*_T��|K�������c�^#�(���tMiE��]��J+K�J��V���E�ٱz~?��P�F�^%O�3O�T�תЫ���U���5OrUߵ����0__�/������K�
�����r|y�E�"�_�o�o�o���W�;���y��[�[��m��H�����?�?�?ڟ����g�����k��-�]�}�J����گ@b���G�P�S��hKQUQ�������^������.�*�;��^�e�¼m���Xo/o?o�w�w�7]�q�������PKEePQ��h'��pip/_vendor/distlib/wheel.py�}�s�F���+�h]m
~�7��Z�>ٖ}�J��ݕ�0H%D$�@����׏y������E%I�������kzv���{���d��~�h�{�_vvwv��E�����&�^�gO��~��c�S����,�%+c(�&����)��Z'��ȃ�b�,�J��E>I�~��
Rh/o�l�h
�vU	1y��΄��<zwv7�� �'����O�_|8z�?B��iŨ$�.�E%�$��eQ5?���d�5�Jg�Ύ|1Jk��s�
ˌk�
pM6�{V7�&��1��M�y��T+sQ��H�M2�f��uZ_ϲ��
��_�"W�g��P[}-4"eQg�˴�V?Tr}M��o+]���F�K�_�X��$���a�d���G�Ǣ�a�e��L0J��j�-+_�a0��n@�!4��I�U�?f3 ���L��
�q^7�l&&�&��io.�˫��[��0x{t~���0y}�����ۣa��GGo����9����_��u��n����)r����$8����O�"�yK�pj��t|-�����$)�6�ap%��~L�2C�t����r=��d�BK���]Q��Y�EL~���C^/J|�;�����y��@M�~C�EI��sX'���
�+r���c@��k��1�u3�ٜ6M�La�*Wze���X��ҫy���
�I�ߞ$'�G���-�e�@Hq9K�)�*��Xf�u��ަ��e����,���V���û���N����'�bN��ܦUZdɋIф$^^4���"�>��a�zf�b�����_�0t���;�=�����9<}�#�wy�E0ĕ�/c�{!�xZ������x-=��C	&E����E�
$����"C��5T1
X�٭H�QI ������:C���O��OVɫ�~-�n����'Q8t������_��y��z��ma���|��(9;��Q8���|���a�AƿYQ��5]%�g��;;��&�GP��o���0w�=�s>����{��;{��6������p��O#��r�r����#�9��C	a��+�%������w;�8����w�O�^����a�xl����g���z�o��ُG/��itT�뇻�\��c�1�|����}����#�}{�o/}��
�GQ�p�;��_�|�����ox5���?;o�!����kQ;}�j��d�[�h��~PXK�_@�f9D�@���,���-����F��1n����5I�b6�
~�a_D��*h����t߃\#���Ʉ@
��q# ���
ܵ^���q	0M�n��D12��*1v��j�TB��A".�2��t-���0�
�܂�2�|����H,���닛K��4�'ɼ�,f
��b6c�!:(BX݀�T�5mV�^��QC=�:尕6���Y����?�b�J/��ą�y�e����J3���I�#	8u��f�(��Ukt��(�ĉ����Ƒ23Ⱥ/> q� Q�V�$|��`�U]�����A�3�6��ੇ��2ߠN��R��'�}��\�
�S��q����o���/��v��fK2VN���**3������?b
�>�zT� =�}F�/��Q�Y_���]h���HeH<ZA02�U~��U���銿YsW��c��R�'͹�X�d~Э�[x7�Fb/�
�02�i��.�I��@	��!:ޒ�[��\��$�^�/A� 	-����w��^�����$ZY�C�T4^N"GfR����;��N�*�7C>��z
$�ɩ�5la�L̕=�yڌ�#U��l�ݕ�Z��WU�M6�5:��n���s����
N͜F��fV��Y���uJ�����p���FrOPd��C͚5\y�{�ے�~z�#'�Yj<mpۊ�a�i���%�+�<c�����%
�sZ�!�=���yB��~�mav�~��k����j��7=�i�wt�_u����o�kq9б/c����˼Lζ���k��[���?e8��0&l[����ɽ253��7\�?fŢP���������M;w��|�N�5|пa(�X'5cah�tv��oV�k��h���E{�!�$Hk��&�g�=���������CsΞ��T\����C|���k��>D�!�fpW{&��ܧnO\�ւ7dӼ�a�����Y�EHA�ŠI�:�L˃��d���,������.�B8t)���v�L�:iSN�ݲ�j액�G��ܞ�d��S��G{jس͒s�s$���h��#k,�V u�e�6 ,��*�e����k�Ғ����(�ap�|��eQX����@c��&�2uY��
�e.B���9�f��	iI�͢t/����M�+�ۖn��D]��Rz�Γ�`J��E����[���~��~~9����7U�=�2N��S�B��.�M��/D5����_���T!.�n��М�2�a��Q"�����>U��T�5���6��+I��f,��ʦ�b?��`E�tJ��+�
�A��ҶUE��eY�t��⠤PZ���q��"�5Wo#���Ɂ<�\�f-��7�h��t�����?Xc�b����iy����&&M�^6ݙ���ru�ٓR��nYr�a��~��[���B�iK�HЩ1�6���(ͯ�,��V�P�3�y��Q[n�u�L<�]+�ȶ��$�6�R��
7�}�u�.��~{8�~��
;+�L�B*�">C�W	�U{�Be�'9��g�-d]^ $\ɢ�t
l�do�1�t|���6V�IMN�5�R���b�����o�pʹ]zD5��JܑUyF{�4��T����UKU�M�%�C���	�
��Pdz�
�Tʠ�g�����g��B����1-T�6��iU}�my�q�t���o���Xk��i��0f[��ж�7�?�b	����P���
�1�)��Æ�c�g��3 Yq 9HgWE�v��B��4oe,���uy�q�T��fu:���"�M*���°���Ap(:(
�z�e]�X�3���%��$ԯ�����ꃌ�A��!���������yz#(Ҭ\
q��/��iƭD�A�-#��UbFV�n��v�ʽ�_Ŝp���t��
�v<�Gӭ�%�n�Bw�p������iXK"�^>ڌHNA]���H���(quKp�D�Lw׊�L�`%v��%!�HxB�V#<\Nr�i��Rk?�Y��ށ�Q1	w�ǧξ�"��_���(sg����5��ɐ5<=z���N=g)�EP�Q�l^�)�MU#��L���D9��Y��/�����i�'�-ayȸ�o�'���~sx~��+�m;E��7`;��U�\���|�/�Pn�xi�UԾHbG��u����^��]�x�{��(���E��J1Φ�n��n5K~�%6k�z���Y��>��0���P�Ma��9zc�&����F�_��Ȋ�>Ḥ��rA�&Ï�����+XB<0�Z��:A@�`��l�b�–�h�"Ǽ]zI����ψQqk=���Zl¨��� �vz�p��O�)�6p��-a�!�w�h�n�ԁ�V
ǀn{'�
�]�X���]�&����=�t�-=�zU��y?��N��
^gq�f1���:Ccr��8�G���)�&4�BB��5��5~�� 5u;�Cr�����0>>���M��D�\c���A�o,����-����#A�e:�髧�Jc_�	�qP�=Y��;7=�k�m���$��9q�5���PC�<ȓ���o�}��"oS�NG�DS�|��gў�gk٧����z�2oi�J�b�z�ۣ�6\n�Z�eg��W�0(�k���9nwVu%T1��%Ì�#ٶ��Yh�*8��g�?lhsn�2��[��|ӰNo�Aۆ]QtC.vi&�7HD
�ˋ�wYg�8�N�/�x�A����o��^��;�r{6�f[������&���Ⱥ^z��-�i]yzG��W)�MQ�@��
�!-�)�M
w`��.z��2�&���&�YC�{3��
��XO��E�8��.�*�ͼ\�{(����(��v�Vk�_�m�������&�h=qpX�0%��HS��V�"FtQ��m��ȋ�յY�L���֟\��w��ֹ�m#�
��ߝ��yst�_�~<<=���%�K��-��8ﶶ��毹YQç㊽p ����$~0!I�
g*��i�:p=��"�SR�4��X���>`�V9�9�w\��/+H���t��׾}N׹������
��3�g'`|���u��ϻ�������rpW5^"q'-�ݠ�c��	<s	�i�R�i�ǰTy��IcR`�4�!ʚ`)3"�mQ���&�d�.�
�K�{�2��m{�C���e��h��i��}�1�Y���~4�(�v�o�TA�ϒE��01�}�h�Mk���Z,>�k�e<���4�o���[$�0�.3ɃG��'�Kd'�r�^�V]�I�L����+YA�g)*8<F������@IW�L�:�C�y�c��1�Uk����;v�:����A�!��-ʯ+��c��:ת�~�C�D��}�ϲe�Gi\T9c(B�,�����"�:u`a^I�
YjH�M����5�<���Ma��X&`g�o	�=�_ǣ���v�s Fw�xL��1�Cγ��~�:G�Ƌ��f+�}R w��@\��?�ԙ���j�f(������"C��x�Po�*p�4e����\��H��rU����>�@���g���U��ǭ����*��Ax�3���`�X.�_�uh�Y� ��F\e�L>�Y��� �_PFy��eZ��c�NN����
��'�~�jP凨`�	�c��'R�R)[f��ӑn���8(��$���P2rZ�@S%�z�J�SNӠ�9h�Dh�ɈIl*�M�0�J�i>^�b���z�m�a���K�4��!9M�e�φ�
�d��X4&��
GTΫ`��	i
},M�R��~Zf+y$~��.�F���x��Kzm�0-��P�E�ۈ��Ѫ!I�b�d�CYl�e]
O��F��A�4�c�܌��������@3��w�
Z�#D/e��g�
�kĄZK��ă�O|�?y
|�N��@o3�?}*�H�F�\8�ǩ�B�
���O�\k��j�T	h���i��k^�lT�-�A��*�~�ǁ�(�}�ڪ�n
��Ά�?�ҫ�6�m�������vT��XO{M�[���bw��4O9>m������m��ڭ)����#r�~s��xY�5�!�u�
�;�u7[�pHq6�]�88]�v�m�ԩ+�n�.n�o���ڳĚȽa�*聳�D5���hJx�t�C1|P%��m��ӡ��˺ݥI^N?w����O'�B�ֱ�p�����@�!,�X���J�
��[P���'��-j"d�-��1��i羉�v �v�]Q�L`���(7R�R��U��(�P(��%c���"J-x���&a�Q�U���й����V������7.�8��^\RE�J��pQaj�K0ՉzPⱊ哎[��gYT7��T��x~3��-'�A4A[�@;�Ϡ��t��TLL���E>�%T�fu�UOJKodyKN_�<V7�v�J,��Ţ�}ʾx�1ڲX'��Ǐ��B�)�\����z��R5�T��S=0�ZM�HV�O��>,Ӓ��-���E��ϴ�3��6�A�A�ר�r���48?$�����%;��*2�N(>	w>.ҏO_�!�Hͳ�Bwi
���*>!ˇ�*��t
�K���,�䆃��`?����t`icmt�&C�֍;nd����6��p=Z}�%�|݀�#MYߘie�����"���n�����
�R��>�6��}n�L��]aY��]� ��h�}�s��7��A��)�O��B�*�0����W�����.7Ӷ���#�tS�E���+6"�ٕ�8��u���ct�y����mm��X;�Cٯ2�������fؚi�eJR2C�&a�;M���\��6VТ�  䱗�8�
Ad��k���б�
�^��h#��c6Q��Y�z`E��\���́��f��ٖ�ߋ��'ђ�oo�Y��ˢ6�,W�¤zO���a�Ձ*F����=�����������=6��.�_��ٴ(��@�=�[�i6�7�d�\ð1��G��봬�<Blt�n$S��;�4�G�:b�y��8�5�5�lQ���h��_���A]�gQ�:X��f��+o
���	�쎳ܰq!{��I7����������Bv	��D��A��{:+O��G��&v�NK~�S�Oe�J��:�h�h��)�����@����np���>�+l,ƴӖq���l7�}`�+�f��>y��yG|"�D|�3�=�@,H���J�+��c@�y��'V2�9�_����a�S)R���q�ONs��I��G�F���9G��&�\c<$3AR¯M�)�{&>�=�s��ߘ��Q
Hv�j���~��iY�ۏ1̴.f-�W�l�n��
�a��m#{QL��v2���E�Ύ�jMʓ��;|kھ���I���,d���n�K��m\Vb���|׋)|�B���6��:t�Qx8�KN� c�$���\��*�jݿX�$۴��:�&�c�:�r�,ks��x(0PTZ3�#(}���ݖ���������c-|�g(�(���lRҮaf�#���(�G��:�f�X����_u������g��mz�'���$�U�C)�l�����
�z0�׃ �]��9Z�ד_�,�&����A�6����C�f��r�H�Ba���=��P�`m�G�6}ؼ��tѭ��A�o�'i)lH�ܒ��5�#�3��oV6M��'>2t�{�Q���y�im��=��Z��=T���=�߉�W6T�NW�{EeO[�%\�8�CM	�8�WV�!��i~%(��‚~�l}X��������"�Q!�SkNɀ��A�5(s�3YҠF2����W�Od�z:�
$o��:�7���G
��m�j�l^�����U��v�������b?R�+�d�|�_U����i{�q���#��mPq5o*!�=Ɋ)NhwX�y��|��y]͊Q:㛊�C��@������>e
�-���&P:s~�'3�W�}����'�FO�C���{GR4��:�>�ыp�yN`p`��9.��=Ht�SD9^�{9g�>.U�X��.�	g�7D���&)?�<�!���de��cx�Wݹ�=t������A�9ù�ۋ�_�9�I�=i��[=:�%��°�:1����
��I����Gq�
~��I�X:?�^I�Y왰��Eyc��u�6֟Ʒ{-�c#D/��JǍm���j�D�#❂�+̳����dN�
n[]�N�P�꼌t�
���BL���޲@~�>T��X�_�@�Pׂ�����u�S:'˩�
�Msy	�:C�S��˭�1'����'3eV'|�b6��M�n�eS}�'���\[��c��l��Z���x�w������|�1���J3��	�u葆���{���>����+�05����u�N����r���i'!(E��k�!e���k�'ɎLG���C4cI)�-[0tf���{�2c�)h~�V7<`t�����h�˫���1\_`���̋Z�e��[�x�=r�J
�Tb��mOrSU|���6T�s{W[P�C軮K��T�!��J`�7��BUQ}% ]�G?�x%�ļ��-r��~�դZ��b�X����'z@�ul��l�\&�s[w��&���V�����K,�������T����癯ܙ������41-���d���A������6�ydc���*�}�i�=�||���?�u1�'���28��L9p �p��x`YG�	��RdL���,O�8.W�7����٬��
�Q:��)�(iD�(���C�����.(OIL�Iz��}a�2�Q����wst�U�j+h߇�]���Fuo}|���F�f6��p\�Ge���U�������h�oz,�{$�dg����y1A�n�&�e�
�=>f0�)Rai�x����q�LW1%NP������C&=�Lx�Ic�dI+s��>��7b�&���j�x�K7ݥ
�9��s��b�h�+�U�K�bV���*Q�E>��RVnL�$yP�>�U�1:��!}ym
*f]pG�v��1�h+��I�S�jk0_�	��9�T�ńRg=D�d.`�\t������
i�4��c�?$��}�ݖ�du��f+��X"�nh����1'��0�O��l�V���%��H��G���ҽ=��+Uv�.-S}l*}���5�����,	�����?�0rdO��j�6QU����	)P��
�|i��]fdDV�����i���<�*�]�|���.O4
���{��^��<|�5ȵ�dT�nFb����,�p@�g��q���*`I��<�z��-�9���[*Y�A�"&?�-x���@!ʷ�x���׵�ȯE�GOqH|d��_V�r�BT�BDI�$��,x<ݷo�A�����^R��-VQ�����.�{s]'HZ��W�{��ֵ'r|z����%�1�Vr:h2�� "�/z���`���3�{�E���9��ׁ��uí����
4g����y���d(��n����zF�
*��"І	����V�ԝ<�w6�l��M��|ox�5��v͐
������q��=����`���ݕ��S���U�}�-���ة#�|���?�v���Zt0�dg�-�b.(=����
*R���ǔ�D�V+�I)���`��슶t�)��e��޵�U͗X��@QUV^&�U����:#�wȄ��#ݑ�(�5����hڄ�Y��d�!�rvo݆�a��l�����������^��2�Ωi\���� �<�z�:#.�l%�)A��9���{6��^�{L����B��ڥ
kz<+jM=��~�2R�[����N��S�1
�����[V���N�LۣZ+*��[����,2��M��)�ɯ�0������X�jc��W�H�C���
t��R�SLpgU:��U�r�(sة̋�I�2ή�p ��+�tt��}x���/���_
����ʿ���<�)�2�Z�OQ'�T����P�c�+��Ҫ��R鹠9ҕ�.UV�uis�H�h6M�l^�ŔwO��~�ȄxT��%���RU���z5�Ř]\Zs����h��+�X*ib&��AQ 7���Q.�)���\�#t����1�����Zf�ݤs���;e�0��|4H���_��w�1�!�n�eV
����r�hv��K�5�ĝB8����
 ���O��=j��w&V҄���½����?}�|�|K��_���Ă���$Zogw	���!	wd��y�9m����<A<����<�=��8I�=lT�pV���ꛌ�W��q]���8��"�l�f��N3������f!z��-�F����E��D�\EG���K��`	��B�#�����ht��$99=v�-50���C��"`^b����@�"����z��φvrrsՒj۹Wuk�]f��ot��2dyO�MI�v�&@
�RF��o��\��E��=}�$OԢQ����|����ś���3>��J%(���?���J���5TE���Y�a�TI79�߹Ѐ+�����	�s�f�VJ.ՠ��Oy�g��z�����dR��X��S�B��?����_�o@}q��/7���PKEePQ#�g��)pip/_vendor/distlib/_backport/__init__.py%��N1D�Q���= �(�x���S��=.�͌<���G�����+S�:���ö.8A-Kͣ��2�`�'�}��hHn�J�Ҏ�Y*�r����U}��X��.�yyzƂ����\~�}X�YKξ*�j��/VXGn�|(x�_�6�����A{J�a[6�����Ln���V��囊)n���;��J!��PKEePQ��/e��%pip/_vendor/distlib/_backport/misc.py}S�n�0��+���-1���9�AҡIO� �2�hS$C����'�Q��tM�==>�SX�[���2�;h�^|�6eSX٦s�p$�W3�����G�o�����p_lk*Aʚ"�v��u�Zow���T�z��7�O���]L�>6�L��XGj�@�J�VU+4H-�G�c����틀`L�"�O��<c��9�%|Ϥ�G䵳'�m�$fsI�E����h���`�����8�����YbC���k���o����8�=,9�w�g(.�,�z?j&3Fd6{nqH�3p!��3V��
<)L:��#��|�j���i�U��f2�-��^�(��'ad_�?�g�̼XdY_����3�SeKxeb���&�����ɩaeG�G}#����o�/O��EYxm�)�CHx�����g��9�؄���F�'xn�=��s0���O���zQ`yq��<��]��PKEePQ�9�Qkd'pip/_vendor/distlib/_backport/shutil.py�<koɑ�+:7���w^���F�$kÏ�^��Mj��3�����g?f���	p�>�$������]=���7�ͪZ������_NNON͋j���uk�3s���pm��C{]��}�io�ښWUW��6��&�����?����[��k���޽���o޽�a��d2���E�̦+W8�1��\�@�&f��:���6ya�m��v�V�����Mzr��O?bε��U9m	�i�im���W�1�P��fg������l����|����T�~j�c��'����t���Fd���M����I[����9��(,�f˕�}�E�,����ּ��_�uU�OL�ﶮˊ�KuL�����<X~9�����l��۷o�}x��97��8*�ѯ��	���۵.����vG!���CU@m�}j[��8P�ph�����D���dn�W�����3�~��&sZC��7�B|��>��N!����]�Y�
V��"(/?ە��n�垀9�u����v�7��{�prW}��E�r��n���Qoj�Do>�j�mY�vZ�fryr�*��1D��U��%�茷t#t`�������Ʈ��-�V�Qi+0&379X�jc����t�Ħ�T��&�+��`�(}�GAx083
�AvI�f���󽝑�t{�jX�vh�VUW�i��5�t�~���ֿ
r)՚UV
��D0q7�%%�C���'os��hq����Hn����o��h��?�T�
!���p7��p���ݘ@ǓMS��f�nڹ)l�m�ϟ~���'g��	"A.�l
N}\�7���a��X�ြ� <}�tc�m+��"�^}����n�,�'���7�\"����&0r�.�b�u0D�9E��m�\���2����R�Y*W'��f�0�3��c��ն��R�\:\׍�=z�>ءq����/�MF�̬��ꆂ\��RL�@QR0$�U�X��x_Dn63����Bjf�X�����~��F ��Cd�����\=j�H1�-�7D<�%��x3��gS��4���-lZC �Y�)�c���U0%��+PU�X�7M�ف�M�������ke�C�7�Y�nl�A�S���.Mg�,��_�~��7	�F�.�g��=�ނY�7��F>#kX��|�5+���z9���!U��Qd[��:
��Ȍ��@Ґ�c����2o�;���6౺�)�NG�����s��?���e�R7&T���9���vt��MeG�܀��Y��m�l�̎Q8N�C�����B�T��)�����/�qpV�1j|"Q����H�`Iyv�J�:4�WbT��G�E��JP����o�����"�߾j��ƚߜs���)�Tы̝V9�>���$(��S��mڼ�xc�0��|f(Qk�70(�-�Z%�F���E���%���XNB��9¡6{���%��.H��5�cs��b�����J2wp@?ĦHR�a&ȭ&Y�L@�é#�!���l���Ζ��C|�-���=M� �A렿�E��ݚ�n���`��>�OȒ&`#�Z/�wL5/}�'��k+��.��S����:�B
H�������뺄F�m��,���x�$�ꦁ99슼�i�)`�j�`�i�B-�$��X�e�uVn�v��Hg�r.(�z��#��:�]4`Y�!��C�_o�”�K�����=I�%�AO�A��@bR����YEp XQb�g!���,�lY����ٲ��҃��@�Q���enq�
o�\U%Ȋ������eq^���A�V�v�*e����%WʄH
��)�z�Z�c+p,ڞ�&�G�lvL�K����!N���3q ���P�����Hx�DŽ�����&�Pu�ee��7@7ڈ�8�I!�ls���g�Aƌ�l0嫘���@�4J��bF#��ư��u6Y+��ѶlA'JP;f<<ǧ*�H���7�sW�`)R���K�����e��5�s�A��*�!�Hx5��9Zd�(����X@��)P�خ�52��+�s<�}�ZyGr�m���U�;ѵ�.��]c3�$�%�Ey�%���,�l�k��%�����K3�8�tz5���<��U
������(BU%�uX_.��PE�VmPhW�a��hR�:�L�\"�Dbn���Y�6��qo|���f�Xk*�P��x��{��z�@�\��k�� ��w��=7�[Q:ڟ�S�>@K��E�2���s�(]8��@oܓh�~2X�Vt֧g����B0G�w���Hr���A���h�Yv$X�� v�
z�h�`4��br����2 a�s%dlX:пS5��G�����}A%H�@ά�8;�H��V�S��k�8-�d�C.4��&s�=+U;��
L���N�b���0��`�0P�^��_tl�N͏��b�SW��:#�ao�QDS�62�e,+��8G5XL1�T���J��
Vd��k�]���`ۡ�<|K��6O.9z�x?���l�Gpc�<̚I^���,X�X��(*�v�u��K�
n�G�{�Ƈ�z�k�w�+
e�x�+�הc>�yL̐\c��Z,?�����$��4)�wʊ�s��ŷDz�כ.2��\]���G��dN���Bgq� ��k؟���4X�u�&AU�č�QX`�O�����Au�y��9�t|�v�w�F�.�iE�6�����ҤIXpp�v��F�fs���1�,�Q�B�	�p�6Ja\8,�Dp�z�u;�|�ݓt'�l����kfEzr�<P6�a)U���P���.s�� �h�.��9}��9\^
C2y���(_�r
汓1�TG�����_���=�61���@�uU�h<�+�D!�Dp7G�ObgH<�G	q�q��;B�MWc!��0��I��6�x��		�<	%̝�|��]2r�"�QW�YHg?70�r��j_<1������Ψ��H�mN���_)4�ȁ�+��zj����|��k��o 
�F�:߳MmA#9�-2<݅m��fK��rή�@&+n�C�m0��g
j�n(���X��.��6":l��[Mx9En�^Ni�u��-��+�Te%GZE��~2 *o���wy�՚����>M�]".مI/y��:.��e��y�H�/A�����kWX�Aq��`�.�h�Q�J�
��nE؁��?笟 ,��"��!JHU�&�`5����N�म6�O5�	ź2�q�4�TXL���)\�E�(��+�8���fMU&��eI�{�Z��4�`�^ov���^nqCq�Ԩp��i:�p�.�A�!/�-���gȯ���>Y˱�=&��6�h͎Z'��*���ȂQy)`qo���X\���<DV@��h���a;��a_�HV#�<=fH֬`��k����Gʹ'�x��`�[〺x�c,�����b	ώ�߀ 	��xySBta�
hfc�
����6B�񁋒��`�eo#w:�.�2��
8ڕZ��V���@}>7aO
�I~¦�j��W)X����?���^�a۝��������nD@)�8n�uTB�5I%��9���K]u{
�� %p�����{�����-�@�^�c��?�CO��$3߸�����C.�.O�xy�t��R�.���z�-ܼ��c���d��-!�I�6.8����aLP���K���
8�e���'�F�aQw%|���[�8��L>�vk����TEH����%���v=��n��ʅ�?�ʵ�*�T�����*�)+घ
��ۦ���L���ل~DL�
S��S�a��c�	��DL/w8�^aȩ�ڐ��4|`����0�}]}��k-g@�x����'(�YL���sK�q��������8 �1|_t�5��=��u;�n��O�)���/̲I��r�Z7T�Z�b�[U�`�E��<��>n��Y��t�
ס�!x�Պ�k?�/�W��ҞO/|<����:Ѩ��IB}Hr�ÓL��D�t�e9:�l���I�?S�Ƞ��ௐ\��K|ɊN���-�N8zM�
Q�>v?Qc����3��_&)�K��mj�d�N�@�(q({!
)�Ad�=���6�|�X)\d�v~��#Ƕl��m'�����
���#�0�A�cg�8hdsgn�d%�2`6�'�3�q���U���6`��dQ���AY��-�<�`*�F|DG�(3R^�*��͛���i���$�����g����s�Y�R+l(}���?�|yGy��z�x�MP�!�|�5 #0V��Y=��B4��ce�΂�l���m�v�{y9PO67q�3W�w����X���3��TLt��ܓks�)'�k6Dq���wD���k�B
X�������26���R�Зa�F?'��<.}�)?/=��(�"�b�brN�;0YP�.o�������	U�jb��;�O�Aj�hB�	�����<[�@w�gzC�'kh���=�y����9յ�6X3Ā�_`���%��d�+U-��p��oMNf�Y!��U����q�=ѧ��X�9�1���;+(B�1�T#�(q"M�p-��>���`�2���__��Ye���thIe����j*��tm�.�I����B�n�9�Ip�+��=2�Rz�<a�C�E����7�_?����kaԳ/��!��=E�hB��&z)˄�hp�T6���KgB��<�z�wq�9����E8�)�N���X���ⳓ�-*��2&�k��ޏ$9��cu���뷋�_���s�g��ON5��C����|�znA�n���m�H0<�ss�{����5/�Q�,��*J���(a�/b�9��qY�2l~u�}����)���Z��X�����w/��//�޼����1o���&C�L�`��"	s5�qg�s.\L��Տ�G��R�x$Nd	�Ő�=��{^��g_�qe��sL���Tt\�hH�$�}^Ř�?��{5o�'j��LO�
��^�y�h�.��� �K�W/�Ci	qW=�~�D��l���oUS����Ox��a�8��9��?k�z���|
ʷ�/���M�;�D��Ư�R�3��9m�-�GD
�i��i�r؄��0S����D�F3ڞ̙���$
��*�r�G}p5��1�zX���5q+4���5 ߼$���i^�r�-E*\���K��ﺐ�����Gm�^Q����E���M׷zn8쥒5��Q���Ś+W0�{5��y��&!��I[gw�PRZ���h��S��z����F<����9����l�qM���O���E(xZ
�SD�tL{&�T��6�㕵-�,%M�@�N��������W��
M{��}�!D`U��۔B<L��Z��aZ7fk�0��]^vh�B�c����K������s4�p��<m�T"&\ğ�Kd�����b����[D"D.��׷�l�ߙܦX�i�|E%��5&gt:����vj�!�4<����LX�9�$Abέ��G"�S *��M���L޽Z��3h�+]f�:��,+�~%}���k�����q(\w4�k��
��,,�F�Z�a5w�ּ�@uW�k���ęQ�‘�)���v�m!A���-������k_�Y���~ϸ˹I8��Ҧ[:ta�	-l��<��V��SY�[��&S?�9��2p�a�=ZG~|f�#G������)a�{��9��k5��<D�≿��<0�4x�s��A��Oe�ߜK�ߟ"R~9���s��Kw0�@_0BJ�+�|��A�k�J���	_f+j�!W54��t��Q�H�����,Ľ��+��0�u.�"NG�9��oQ*�=��4��o����?��,�;�A)�'!
c�O�t�8�ѻ���H�^
oA��Sio�@����ܱѱԘ�q�����p���E#�Sۈ{��Y!\����n�׻����,�iȃ΀8��@�i7[<iĉ�4�84y�L��,6��+��#�w�!ŷ��珗���%5!]��j���3;���Ѝh��.<(���l��V_ݕo_y��D�{@�V-;�_���Ŕ���'O�?�XC�f�u�?ͽg!o�x��br��'Ե�RE���]8uJ���"\�ݺ���#�]�?������&�e��͎<� ��a�5�D��-�2�5M�V�K1��80@��)��#,����X��@/��Զ+�r��ɺ.������w�\M��yX�f(�\�
��+=���"��UL�+sYc1�ҡW(�W��H����.�����"_ƯÜ�$Ř���,l;=�ɛ����<r�_� ��w�ˋ�6�Af����O-�3�ߤw�"R@}3>�G��+@d�?�*����4t[���K�i*y��WS#`м<���L�t���Ʈp�=��	@�@�V�@H �E��R���!��CW�"�M˻fo�`�����ޙE{�/׌�fx�o�%�F^�76z)����.;}���Oճ���h��x>����B��h,`��j���[~9�:�����=_1�Ř�Y}�E��izp�F	�؁Zd� �
u���i��2DZ��xF�)/�{3��\��C��)9�;zR�N�q<W0�9s쌑&�q����	�����ެ���zAD�O|}r�s���5ړ�l��6vM�sj�	�w� ~	���J�i��E�}<�~��#Fol��c��]7
���bG�h����;����E�>�r7}"��WU�
�yS�q� Ά)�`o퀔+»2��3(f��l�B����d�f3%_�+�(|;��A�+�7��G���/ʆ�Zu��8Z�x�^���a�?R�%E�c?J96ʕ���'�L]׼�d�n��������Na�s��$�<����T��
�����iW"t盠����=�ywY���7hXJ�����c&�2C6�Ґ���O�;6�,�޾{��PKEePQo��9
+pip/_vendor/distlib/_backport/sysconfig.cfg�Uˎ�@��W��kb��s�)R�69Y����i4=l�,���<� k�c������*�X�%,�x9��+����du�bO�Z?�4��������r���}K����K/؟9��H%%��\p��f
D�|8�b����-y�IVE�+���IQk��耩r1���E�tP
�L�/:��x�+v�B�
�F59)��C_~a��r�W���j�
�گ�5A��Q���`�nJ�%�VƮ�a�5AY��쵬�p,�!��M����9m���)F�J?��%��6����*���/��&´0wbG��ǎ�G��+u�қKOo8?�y�^wt�ج�����ř����ɴ~.ﻄwIW[�
��z�FfW���u�6g����L��S�,��s��[A�)�뎽?rl�?z��v�q���6�as\v�nj�RBo��Xrrmz�����b9����ؽ*׍��wD���N���{�d�+�Ϧ���PKEePQ�y룩�h*pip/_vendor/distlib/_backport/sysconfig.py�=m{�6��+�R�J$:q\_έ�DZ���$�c�i�l�BI�Ř"���~�� A��v����m$�y��g�g#6K�Qr���b1z�O�k}��fwyt�,��7`/^n��%g�w�2M�8]7a��۴L�a�I�Ɯ�w�{�Aq[�0�����'�o~9=:�C���vg3.+R��H��.˜��(Y��J���kk�*K���3��շ��o�N�-�t�AK��ga>��!�c|�V�w�k>hD�	�����
vHMy��V�=�{L}Y(�kk�IǓ	�ag4ʻ��D��,'�(�I��ް�x���|�
�8qBµ5O��h>��a�[n=���\�\�9�-b��+n���W����s�`.�Dﻏ��ݬ�?9/�<av?jU�q46�A�	����-��E8���89>9�����ɛ����"����� �5�߀�fa¦��UV�1�>�/��^\�%PĔ�͖ar���	�w"�`�	��e����b����2Wt.��4�	Nev3�a�x�c���%E��e�i��0�
�l�z�"�������'�M��F�o�*FD��xo��?���(��g���kJ/_��85q�}���y/n�a���j���Dr�_��d�HhF$l�D��l�����10B-�ސ�_q:�ޠ��N�=(9�E��>��1p�0��$O��m����?}������>lAk�e���M�C�E��'��yժ�z�S`��ZO���E�A�s��9(-�Q2���M��>a8�
/9����$�EG��ސ�SW�&
t�_�&�A�PÍF��s����)'���B����
��!��7�7�;�D�+�:I�g6�t�`�^-2_Lʰ����&�=���"��d9��[��{��j��5��/���(������D>r�}�P=<j,�/|VLC�_�u�ڈf�Hxb���$�1u;���������t�y0KW�N���g?���$�f <&�`�/ak�ТnM�ꈗx��P���@�{�U8Q�W��*�e���1 o�-j�~���S����u�%Nt;��
�6���l��!��hJ�����"�jơ�ᠷ֌�\bф���kV�r�J���$֔�N�&LgF���*t����>,:�-������ԫ���y4+|��Ո�A�D�9ޘ��=[��/�}������2O��9h�?�+,�ۭ$���\�9�4f{a �$
�J[��y�����Ֆ���Mf�2a@*l���d|x�6�{*��Ǟ�
�,�	z)gۯ.���OG'��(��
ǐɇ���y�����S6��2^�`�u��`h�N�૽=�7��4�k�_�'ڔ�'ڤ/�� DŽ���z�	��C����O>c����Q��{���g�	PA��~�K�O�dzT���yf�s=��@���[�?����Ceq`�+c=�د=���%��jL��T���"@� yr�i�R77�t�����4��t\��mH��?�߁�p���d��#T�
�i��5���I��P:��g�p���l�MԬ���s�����56!i!?X���fm6
Y��n���w��#�Z��&e��
�ML¬�_.�D��P|j�zsZ��dw�?�?���2t3��V��?��:��G��v)�!z⋰�u0D��N���1��QC�]�$@��L����m|�x�9
���ֈ�X��oy�JH`��I�e=�zp���y"8t�f�'	��ɛ�e��rXe?�,Â�Ӵ,���
�"��#pu@���F���Y;V�{|��{��0����Lrыw��n4nG�j#�;8�2��S+S(J#��a~%��t��W�[$�sx{����ף��{�W[v�{q�-нH�Baa��i�w�X�ӧ���Ǟ��4?.;�޳6�.�mt�hꠇ����R_�K�4�!"��r�X�ޫ�#Q܁�N��Du�LpX�)�0JТ@��R�fa$u���	�F„H��2<���/��N�s'�+��b�
7,eOQ�7�d���m���	�#� ��0�
,��e>��D�����;X�*d���\mŖhS�@�5Ѷ�$�m��=�,�cw�������\<��g;�?x6P$N����ɹ�h�q��%@������u��`��(�9�տ����2\e�"H3���h��(��c,[��D	_.Âs13ޣ�͢F!gqXP�~���ȶ��D�'�ۧ���=���ye��T�C>�
�W�)�@}�c	�U��6C-���m�&�^kL��>��䉇��ρg>�T�W�+V��T��PP'fH!�{B1\�|�8�2!)��Es]Qf_;��2QX4�����1h,������'�@�{!
@ZK��ʭ���<Kc��Cߊ:��8��6Q����X�#	�ίǤ�%ZL�jQ�"�3b�� ��C�S��B�@kB�*�@k�KV�M��q�gl�,Tn���E�dPNB��K��+���w~�*"���2Y�m�V4Z��)PV6�'����w�?����W_����w�}7K� H�j�}�^&p���e����v*boEkV:X��q x��K��)k��&���^4���$�th���:b�lD�;wB��;�h/�"n?h8jC��5T�p�!C_�����rD�9D#/���vy���Q!�0r�6[�qL�I�4̈́�v��
\�݃O�N;6w�|�h�����:�Ar�j��9�#��X���	})R�?�8�c�O�.ai�T�W5������{ֈ�?��.
JG���1ov��_��^����9!�\��:t�A�O��Xҥ
��z޿ǝ��Ҷmd��8ͫ?m��������ٽ�
�� nsP���������O�{��
j�{E��q��#l3���R�
T1-��\�'��Γup��3������i�b'qC�<�a��S��t�/Ϙ��<Ja
"�NԡB4��9ã�@�0D��!kV����2���aU�"ʸ�4S�����֟�l��@+����
w�,���}"G�DT��JK����f��ԍ0���A��UY�e(��7�`v��h��V�U�f�Q>Q���G#���[i�!E;44WJ�j3�W/F�l��(��z�a,A/ѫ Q�@����LT�=�C����=���hȳ�a����'\RZP�4��P"�8cZO/'�'��\�n��ol�>�{�*�H�#��֮�%��(���+�"9/�F�����9�LF��>,���z
f�����B#eA�k
#�i�>todv�3�r2]SgG��n%9Z��ݛ���5{��_��z����>J��᧡J
�x��%�*E�C���c���Z��7���F#|*���r������Y�4dSpo�<�Y��p���\S0������HuL�[�Q�<��O�'��T;��M��I��1���\�i(��^[�x�����������k�3����Ww�?������6�GV=��;>�N^���=���o�٠D;5ve�m�O<3���:S����i;�{|(�<�&�f�����w_?6,K7��o�/E�������y���
`����S����W���p����mVEo};����vS�|U�Z,��k����Nߪ#r��	��i��Km��4��Ε�WWMP��p����y�Z��G����*�=���f��z�g$��{UC�:̺�-<m��3�H���6��&����e�є.R�� A���!�2`)Ҽ�sߨ���ps��2ã'�:ڞ��nooANq<:��n����
���61���P4J`��邍g��!����pE�c9+P��
cAaeA�MU���g���g��5�+(6��(��h��$�o�8���]�@��e�c�S'�mi�]�*��r׺�n4��P=��>�y��� �`W�)S�8k��ʚ�#q�h
T��%�h�̲�+�IZi`1ԓ���F��Y��-��`��kd�n�`[��D�h\òW<L�L`�*c��Vw�ھ�ܯQ2Oo]�x�����Äજ-�X�8,�-
�h׊��q�d����
YH��g�I�g5���׺�V���p����J��U�-æQ��)�>`U�s�j)i*���}2�9əX��;$�exͿ5@��!V�I7&̹*Ԅan�'{m�
:p�I�T��^:)�(�_��9󔴔�4U�vt4V!{��]��Kj
C���������5��=�l\t���Gl	r[��Q_���~Z&�
�
�!3�U�(�.��=�e������HMky�95�BZ���(y^	nVD&fRS�Ѭ�l:�&������t�[(Y<]�G%
T42�qz#E�^��CA5/�D^�DI��Jw�WF��1Vj����0��}����K���ɪ+��ߓ�x<�7��_
�&Ӷ%�
������sr�������p*�(Z�}���w&�.W2_‘�9���n+Dߌ�c?�7� �l^bu�y|\ �I���p�a��]����DZ����Ȍ�^5@�~C����Gь)���/�&1���G�*0���{9��KH_Vuy��[��h��`>��WZw��ޙ��e'p�mNJ{t#�"wҟ�e�; �I�	خ`i�p�������е�Q�m��:4\PY���'M�|׾\Bm��h��z�4�!|�x��X+X	���:�Q\���C�(�l�ldW�47``L�T�;�rg�T̆�{�"0S�i�	������搁?�B0#���SE��<M�e}���@Xb���h��"=�T��h�p����]7Q��h�]HPV#�ŀ�+��q��z&de�&�1+E�FPʴ�W��6�P6�B�� cXR��`��s�ôs#Ojׄ�n�)�8�+3d��md��(�{��Q��;�R�=�c�ޟ��7�^+�="�s���	���>��ȉ�������*&-�?]	��X[,hPV(#���w���;>+��NbK4�"��,[��E��N�%]���c���1��ޱ�,��D��OH��8E|ق�"P�ʻ��0�,�K��	e��)��D$�<�� >�h�1�{���$��Ty������o�m�������4ۙ@��q�I��!ݜ栧CAz�5�A�X�b]����0��kbm(*i!�����b<a�%᪊L𯅫f��X���U|�%�4t
�d~Rb�`�ل�E9(��T_\�]<C�LF��R�
�^�!� �]f�ܔ2�sfl�ֶڇ��w��Km^�d��N�M�-o�**��Dz�.-�P�'�#�=Q�M�t���$G��JѼ,��km��`���p�.~���]ʴ���+|zO���kr�4�}�����r�	_-��Q��3�N�?��d�H���Ę|�Q!|-_4qV�iV��}u���d�(�J���*����pu��%TW�O&�)%�"&�u�W�ʋ�s�!�'h�u�O��^F�)�[�[�خ�@Ww#ݡ�*WRLݾ�BoXD�H�W�����(�)���@*#��F�ޫXD�F�#"E$�0wߢ6��'	`ڻ,����SJ$�Ҫ^���P�dZ1Z����)�$��P�j��H��x?�r�<�pV�/��s�R8ҥ��h�-�Q�ቊ�����fa^D�2s\�{s(>�x�0/�6��-�|�o�HE������f�����<��d�r��H�71�1��y�e?	�l2����D
Eb�l�D�l��!ʣ��7�+���h+��Y��,c�qN��*$n�dD/�b����=�Jo�S�
�����ևI�c�r�~k�t�x1����	��&*Wf�WТr+�FL(�ЎW51*X�_ZB�Z��e�U{�yΚ
��`A/t��z�r3�ֵq�D;z�TbR_��Th��n�o\�V�|��Q�7�T��o��^:/A�K�ڿ���!�j��j���E��f��`�K�659����s"�Ud�9�F����S�u��yJ���h����+S�(&�c���ӧO�����}8ER#G��ȈC�N�
�~�v9>�#&FL�%�Q�a�9(���I^`.�F�B&ї�(���jQ4��3L��ҡuC���t�3�B[޺�oJ�A\5��@���U����x�h��~&�#U�|��1��-�0�X�j�B�����]/H}�����M�G�F� ������I�L��-�u4��_'0
���	�<��,v42D�^o5��Ek���x�D�M�a��b$�t}}�
]��^
h�T���L0
�=�mp\�����=�j�mXLYXO��^�g	<��$����0U��������t��(�Y����԰�>c8Y�-��Nlʝ@�g-�I���h�e��f�/�mw�����\����
X�vݒ@gw���*�PMƌ�$獛���<�xn���Ů����A�˪)���j����5��1��.s��9i.0��ɇ2�B1em(^�W�33�T�
ˠG�uiה�!�z��w4�4�?8~w��N'��'?��0i -k��(�;�lI4�⨸2��i��DH��Y�q;=\Ee�LU-�:�XƎΪ�\���rpε�-.U�m���6�]ӽC�Y�%�`{v.�.��h��7�|8�����$�A�	ҙO��aD}�{�A��h�꾖rQpj BE����A����<?r�섇�2�9��#z��<�Q9�7���S�"E+��T㥋�H��`�9��"�$��#�}�񆈷>����k^����<��@٨��j��*ϙ�Uw.\Ƀ_u�3Do��iz;�/4凮�_��`���L��+��Ќ�}w��?�LC���HDӘ�}�n���3�{��^��~��w��FaY*�4
~HG�)�ũ�ۨ��Y$�����<3=J��i����<���,�G�$Gm7YN
�1k�k̽<Z�.hL�m���}c��&�c����"��et�q+*�/W:k
0��̭���R2$@���I]�3��^.�+��`�#E
��Q������.k�L����y�Ã�xA;�Y�ԣ�>���w�q%�H�A�	5?:�=��VU:�`��|�e���,y��sj���|������P����]O�X�f]y����<*��%~<\D�k�ү�P�W�5�G�����T��b}���R"���}W��a=�z�
����9��c�$PZo�.'.���Sd�M<�?r��f���I#m5�(�!���
K�s����ΩߚS�95�@8`k��b>�s��[��A�o<{�j�cS�{�fQ�"
�{����*��"�>;�@��r���u���{��z0��y>l�|Y�Y�$� O{��$���pX�x�������NQ�M��Z��,�B�c6*�r���}�`<���Sxf<K9�W(���{L]���@�xa���{O�6�;���a����⩠(��Q7��>�O���~�(Z��̬C��*��0�����:V���j:;�3�:���j�C�a
�S	!����RCqޤ1��W�'��?7c\ryhD��0��\����5�`��^O&J���_�?PKEePQDBCbY�i(pip/_vendor/distlib/_backport/tarfile.pyݽ}{�6�8��?W>9�Yk9/M}���$N꧎��v6馹*%�272�CRq���w�⍔������nc�`0�f6�����Uqq�Γ��vc�<_��쪊��{����nte�jYVq2N��s��_3�{0M~�z�yD�ʨHʤ��L���MR\�e��Y�e]%E2��fE�UɴE�E�DQ~M��b���*��8��IQ����U�fi6��(��X<��^�_V7q�`�i�e>IcM���:ɪ�J	�4߭��l�\�uz�^4M�9`�!\(q��F7iu�/+�=��t��Xv2_N+U$���)�(`dH��e���ߏ��iz���b9���U?����xY��N��a�Q���#���(�y���{� ��˛��k���8+��"`ܨ��+s�8�#�T�������zMxd�{[��\_@�x�N��LFQ�W��g�1c��w�U��/U@��J_���1�\V�0Q���vq-�������ӗ���������ߎ^��:�<��wG?���������/������(�������7g�����Yt�����~tt�틣�WQ�Ꞝ^D�G��.��iD�
���s�0�ׇg��'ώ��.~�1}ytq�������������3z����!�8y0NNO�N^�A���O.��IO���o�;:���ێ�B��2�}~�旳�W?]��N�_��g����Cn�:�����u?zq���!�=h�
e�ƻ��)4<�8:=�.>?=�8��}���»��C����9�0^��BK8�P
��2(�{��~{�_q<	�������q�/ ���rY-�d4��k��hQ�YO3Z��N�,��Gʼ)�*A"�
$^\�U���sR����h��T��Q�?Β�)��x'o"��������Ԉ��
��O5�u���<B^�xi�M��a%��/�����p{gw{�q4�n�����0z�:�,�~�_&c*֋��L>�� ��鞱]DO�>~������=���oà�j�'��e1xE�����~�9�N��:�M�>~�;��Gg)r�it��˦�Ms�9�	*͇2g�m���4Z��IQd��Q��I]�XNt1dE�{�llT�����<�`�7Ӎ��$YT��aQ����c(����������4����K�i~S"��*z2؉�8-�q��@��Lp�#�Ru�-"��G݃J8?��*�j�7U��"��`�9N�m`��'�G��:�7���S��y�H���o��9�8ǀڛ"��2K�O��J��?�MT�=5�'�ub�6g:ZsB�j��Z�ω�>t.��%�.�_������Hj������b��B�;����D�F�e:�R\�qɏr�6�
�7�|���'�M��Tm��-�Ag*��
�u���^W~���Lj{�םN�ludK�ea�Ɠ*)6��>�����P��p7Pi�d��
w�E�O��A��ɧr������^���ƫ]$�����Nގ`�9zN�"_)��y8�,�D�lIc���I�w+��e>��"/�/fō�ÓW?�N^#�Ý�����zym ��I���|��l�� ]�<z�?^Y�iQ$�БK`��
�W��9�������r���q`�ЃS���g]z�N��K"�&j5�6�y�����d����t����0�r�LP�¾;I�Nk�I��^�->V��@�U^�n�<zy�?��Rq��-�4�k}���Jg�|Y�h�
���ӓWB���qǨ%���y6#*2�%�;?7U��VU�A�<�6�;b�J��$���Bw�Kp�h%�� ���K�<l>W `?y��XW���>��cK�|~z������}Ǭ|���u��x{~qp6)����s����O�.����~ēt�ak5VR������5�nv��؋×o�/�u�߾��6��l' �#��vrDu�_.$��m��}�t��#��s�k����M�K��HX($�R��Z���j��#�%�H8C�������Z����m�B�^�Rh��o2��l��چ�o���H�>k�R{�M�"k���"��F��Q��Y�N"Y�D� �J��9:<~A�tqu���*��L'i���;:�e:ŷ3��D�H�����pŗ���a�Ʒ�մ���L*�G�Fw�h�-�M�#�p�����'+G�U��k���ĂK)H�}���F�4*���h/���q�#ՙ�]��8����M�@6����h�h
#���u>M���s<_&4d����oi�|t��ŝ|��Ra͊m!K��;vIK*‚�\���� "`A`_\�]�/�0-.�`X�=H�\xhF)dc���ы(��vL�tI7·��%_�ɒ� �t��@�W~��]��
C��2�o�^h<"�TL-��`��x�����P!`�d��Q���sݴU�L�Z&h�1꼪�Y"2+��Jֈ��6 ��ֈ�<�@D���<
�2(i ��FD5��@��|��M�m���bR�zX����y%��n'��yN�s�~x�̬������CI7^��?K*2�ߖ�J&9Z份o��y���\�#e6�&�ic�\Ϻ��Y��G
�>����w:��y['��Ѧ���]��<�yǪ�2N����f��O�^3T�H�e�E�=F�c� �ƹ�(v�^���nj<H���:H�!�]�n�H/��4�vIGe<�V�_������{����IC��ۀ-nļ1v���
O'腍$r�؀;�M�օ2��Z-Q�r����*k[
4�Aq��TK4WA'WE�Xa���ڣ`'��|t�r��$,��T��g%�x�+�I�o��69�!{at���N"A�Ju;)?�E�^�
��{��.�l�t�����=�?��=u�=����C
�8�h�j����I�D���}n�m-*4�ִ�%Uϒ;Ѥ��}�R�俗�}�JvCc�z%�˂�/
I2�����)��F�O�b|Y*)h�����.���z�Á�R	"��0���H�f&@H�j�4���� :���&���4������� �S�/���y`���N�u4Ng۠���"Y�� �XN�G���O�^���EO���#)�YIZŽ��y'�g��GY����,��r:���59�����"ˢA����zm�+��A���\%&��b4��۱amF�߿�ށԜ^��*4�U^ş�|Y�Q4L���s�d8Phb'��w*(�����`�-�ɧn���<��
*��
k��⢈o��&�8n� �@���;;�O�Ї�}�sP��G���U��Z�I<��&W���u�//
No��� OM��	~~��H�P�+^^#��+,��^*��"ã���*������K$����̃sxEsZ�P'%��	��E(0���J�.Q���б{����$yѣ�~
F?�e���A0�ʴ1MAW.`���l��2+u�D_�3�C�W�[�t�$����-m�	.���=�Y�*'��b|���u(v���3�Q���|����)���Ud����������]Z�nenE���T�n]H8_ܢ�U�,&���+������ ��2�B�v����O���ѥ���t��g��N��� �b_�YIu��}�q��"�.��E�Lln�|��Pc�����>������.�T�}��b_I�"&�I���})GYC`��H���e�c�-��aq|�Χ]%�KU��`\�<�n�;�sV�z�O��uP�;�-�\��u`��vjxN�՜���5sz�X�����93X�F�*F�vyz��ɧ�`S�	#늉G�ٶ�<;�u��Gg���~�'�fb�9zy��,:=x%ر]D^E���Rߑޯ����P��wPʯ[�G
���趾Xx�j��U��W>���xՂ�i�-x�
�xxT&�HA�0ޜzxl�Z�������,�>�)
�U��Q8TT�]�|�k.��di_��ӲaH뽠(���G�+���_ؤ^/'b()�|�{i����$���/�?>_���b����z^	�s�±W���u:��i��20ޓy\����C�DR��X�v.�!B��}��B�!(P5�WI��p�*8V	W�@,��5�<�`-3�4C�)/���5*;蕲.�s��	����'h��`�(?^�^N�&s��X|(3�i��=O?%�T�����5{��I�����zQݚ`��M�H����!CvzG��������]�5������mM�F��2��%�jw�M~��v�Mu;�I��`����Ƞe�@��%h6�����8��̑>�lO�Q���s|�-vQ�<N��]uEm���Q����K���k�<�QL���@<A�J-	��_F#���F�2�_�&_'���iu��>�#�tt����[��=Q޾;÷ѿ��s�T/ԏ���'��z���
}4������n����ѳ����_:�&N�k�ar�Z�^
.�52g�n�CTŸ<yҫc2�˄F�h*���Q��M8<�����e����)�6�W\Q�O#f�}=��dE����~�XO����Iu�$�⟦�[VQ&��/��oU�,I�dg��?'D��[2�2�=�x��B��n�t��$� U�~O`w�m�}b��+� �!��Ɖl�1����qLY��M�$_��c�$���lFI5h���=b����Yim��h2���r�SO�W���]R��bя�v@T�c��6�%0����}�_�e��x�.~�j63X�m��{�XfUgQ�ۺ��3`@!Eg/�阄0M�dR�W�S�c�
���{S�_n����K����z�i�0�R���?�4�t��L1+.�_�Fs������LD>���{I�c3XZ�ݎ���)�qf�;�q��3����^-]����c�}����a5�m;�|��;�ka���q��ƇG���{��p����R�H
��������nՉ�r�֩���s����w���Gsʆ!�н2�k<����"QL����[����8y;�2M�s��@໲T�|s#�&sه��Ő�x��0�N�vp�*?�k@�k�8Q:�Fu��6x�ї��$��e�����v��r���}�ŋ×��/���������wώ.����`����o��w�S�9:ʕU��6O�~��/<����������z�u��w����3��:��������w�u,���� �8[��ؽ{L�������퇵����|>���nTƷ%�\/�
%���t�����o�)�K�@7NĽ>���!jZ��d1�ћ�U�ǁ�ޑ{���Ju�łF�*����6b�.�%e_�uf�������_��*vyd����W�	�Ls)��r��o��ϒ��M�RVoE��f@�nY���aJ��fhD�}/����ةA7t8fV��r��[�|\�N���ix������W�ƘLA>G�X
��%��7q1-W`�W��HfY���t��EP�(º�/˫no��3���i�w�_o⇯�g�@B�Ȕ�g}�pw-ըT��B�xYᬾaG����JN�t�V�N�R��VϠ�὘^���tǪ�q�����mԙ�'�Q�9��k&�
Z�Ȉ�&�|�H��!�}4�4
 �9OA�/>�=�_�^e_ݏ~��7�����VJc`�Ih�a~�%)��CD�m|zp�3�r)�^���0�
�K��?���[Pt�X"�9“RV�NڄhNX����4ML	*$�8;�!n[{J2��i�
�!�;u 
��J�=n1��ww{�{ja�YìX�g$�!x�F��I
��O������!��$u9�g�xZmz{-=b���葍՗9�
�i���Z��m�����n��遀)�э�6Z#$�0]a=�>˫�>��B���I�^�U2�V��k�h�oZ$����&uG��	o��+��g�|�n�<�Z���W$嚇���?9���I6Co���4�q�ul�N��-�͞F�K�sY�f�6�a�e�#���|�<���XEc�9H �v��5�O��9g	���O6l5TL9h旦�TH5��e��r�j�a�#��v^v��4@�����e��)
�v�v"P��ul�أ(M7:W8��pR��\��+��� |L-]�-�΅ �M��X���S�R�ey�<Gfot)�T��5�:��9�~�|}��U�y7G����h��Z��gZY/O,��p�N�
�jWq'�U���/'Ab0�����gPʪ�ҩ�
�WQ�Pr
}*.�x���R6�X��UQ�o�eZ�5�d�?��L��γ�4y�ݠq�6#��9��+������Im�3:J+���T�ޑZt��E�m����[}�����!�Oߚ��Ӫc��u��w���Vl��Ϸ�����P���6��6P�m6�����g��~��l\����0:5PEdQiB{��ݯ�2�!Nax�(,Dm"�{��un�;�W)7n�U�Z�)��G7y�).�%��KF<C�c$n��f�ʌ*��.3r����{�0��[6�k�bF��%�"(�P�{���\m�Y#�����W�tC	@r�]13�l�K���l�c������\}�f�.i8;kY}9-زuP�k��b��ܭ���e�R�ܯ��Z�@�{��zHà�N�Um����!�}�wgQ��hm>�p~� S-dm=�Q����z��f���@�5���1@2Sz��%Md;���Q�W�zo�k�Dm->���]�I�0���*y�Qt�<����y]v�CA�%����'�1ض>�S��ah�r�v��˥Pd);���^b_�����}�p�yo���V��gPh�/�K�p|OeB"�l҆�%��ׯA[Nj�Ę>�&]��:^�%�����e3t�g���+_|#cY�*wk��;�gƸ�(��N���s!���j��rx)A�\���B=�4���c�EG]C �!�r`��>pf��9ͪ�5�Xd[�t=�E�-��`=��� 1U�n�ְ}:��$;�)���G�<\L.m
��,��eA:�XG�`�M9x�9H�ޕI�9��j��-U��j�]�~���c�X�ys��&=�}4'�vCc\�:ͺLc�@<Ĕ�X�j?���6�"v/��.��^��ze|���G�
B����@0�b�\�\V�N��`9���l�U�i�<�І�u�.̚���g�Gy�'��ź�0n�NoMwK�fT_plF��/=�)t{?����Wƴ�x��Ɔ�*�?OI��|e��[给��%���"�4n_�f8Rݞ}��[�TV��H_pOmcL�M��V�@#	i@v��ջ�#
�S
(�ޢM�2��* z8h��s}�����;hS��ܬ7b|5������.i�,-�
��m~��vͭ(��뼬�GD;��9��Or9[��s��Y���J<���W8Ky!R��zj8j��e��٠e�2�~��
�ֽ�g��V�P̷͌Ђ�j�a�f��meOy��C�`%�9�u�q�t�Ɂ%��G��D�\�i��L��BS=�� ��E��4KL��(}�$V�o!{�ssH�;�V�_�9���$�L�.S�ѡm�-��5NX�E[�<���ɵb�vLU:�ZF��C�}*�l�7Knx0�,`;��y޼��NS�,��Y��+'Ot�
;D�i�Y��#�������i�L�i�H�����Zˑ���
�6F����_��-�5D<s(+YY�S�<Fp�Q�&=�\���&R��ٯ���G��a|��&�5��c)��\�OҊ��p]�Z�M�����<:?��v���@edq���5�d���:�ҥ������C����=�6؆�.�鬭HpXC��"m����X1R��n���׆�}���5���N;���|�7d�X�ހA H��"�8��*)��_��")�rѠ�9)t�[e�����/{��ai�]��t�8�"�g���'�h�u���C-�l�s�HS��8M�8���gn�c�0���h�3��QZT�>3���G�)���b��^ߨk�+�|��x!J���򲤃�h"��o��F�<��[]u��A����[���c�#T!�e��B�WP� �!���u����R�=��{� ��ab�����H��d�0r=��؈E�∲PU�0Rs������ʍ��|�<eJ�B��e"����c�ك8���0}6Z;v�'���,脉�] rR�l�>UD��.9����^Q��ء�/��i�.�ɹ-1�,n��ͪ��(�ud}� �v
���RY��_�W4Mޥ
>�+��|���/;��!���btsS���W���5�E/��]M��E
58�@Q��P呸7�ԕeG�fm�Z8Ug�Sm�C�����P3��S]#U�YQ�G�Q��)�Evt�L��RxR�~7�����.L?5�v���rz��BiT`~�m
.@/�8,(�V�]�f_3��Tx�!�����Y�:����`,0����z޷��0y���O�ý2�W�����):3!2і?�7�b4���l)0OIJ�׮Y	�Rֹg8rO4�T�	;���)����kϞ_'6m�F�÷��,�^���o���)1�JH~]·��/�ɹ�2"�E�v
��`�Eu�"z���ɚ�}w��e�T�g��@1X�lf�K��R)�$��#*D*q����	���
�����f94�@	O��2�� �F���b��I�U2��`�S.���ʤ�ċ��`e1�;l=%}�8�I`i�e�\���0tf*���,�(�l]H9a+�uCux���̲�W6Rgz[�H��9��MV�!S�
�NC����r�ER��A�ɣ�J��K$2rZ���A.��G�`��\5z�B�<���c�[�Z���E�5;��"U�h(q(�sP(�
>l9ɌX�n�����4h�'�ÛSq �I�
ΙS��uő۝��<n�ƙ5G�HP�4�_C�B�3赠S�ћ��Xj��&D*_���NR�sF�*���x`h>�Jp�����Ή��΄�ӗIqmJ�w�7���R�Z�؛��ft����.%Y �Y����^|�$�W�S���2@8̽m�O�E�Ϗ���=�V8���Q�3�gn~jۏ�4��׏��!��Lh,��od��6���.��9� |���T
/c�}#�0�:�B�����?���2�[ E��C��9�<�6��E"!D�����H�dU���o�KR��k��|��A�\��&ӢzȲ�4�ޤK�f��u�o�D���ʓ����C�„�J��\� yw�r��i�.6�!S�X2�+T_F�EjE���I�J�c�ya��'^,�2ဧeJ	{'IJ�yT�&(<���R���c:��f����Q���8��Udc��ah�t��+�z?���Iȁ8(kn��$V�}��!��!�%��r�jz2��Yk�ő�r]�%�I7��G��o�)��S�V�	�A#��bLX�k�!I,���t�>�%�ڜ-:��x%$�/�m�V�{�m�9;|y���|
&�6��=�z�];�
��ۃ�5����v�P�pth�/�Y
�K�VA��o��3��O�i�73'�ɞ�55���U�^�›y��F���T�ip��'����W)�tV�� ��~�<̡I�����Ţl@��.�bOjՖ���^m��tB�֚���c�z�gw,/!V�UCm��U��Jn)�p��4d,g�r���gÔBמ��$�M��������ݕ-ٵgw�m��q����G���l<�H�F���6S�GWM�"�ݛ�hl�W����J�\k�5}H�f�����}��v�tou��G�O�so�I����0By	���ߵ�h�u���iW��łB}A�Y��R�F�S��xt<��2�Ӧ���`�~dD\��b����(��Gu��J���E��"�4Y;H�a�篹��v�]�M�&�ԅ���ucnc������onj�m}��_��c�1p/�ڠ�93�#�Q<8iӿ�mSJO�~��t����.FF����Xr$/"��jZ	ȝ� �RM���wwv�֣�`��!z!=�0X��1�Sr{k�Ϛ+��"qUY�(	��C�,:�t���dD���3	(
��,s|k����et5-H~N�}N�B��A4/�	q��yx@���)�c�]����+�*���A�	U�|���?�\����[�߹H0�i�۝��fɑ���U��|���,3�����&��wv��T��
�W�T���7{�=7�P��b+�Ű�Y��Ϙ��9�����[�8�'I2�'%��.Ѿ�!u��<�n�'W�����ط��fO�y�MPA?� LK�U���g]d���*⏇��-�߃hk���5۲@�-`��v�k̥%��,�+)��>@��VD#k$R�^�=m� ��a�yEj�`�(>�����"SNmλ�'
�)-�tz0�-���C�1K��8�:"}}�g�=i�}���k7j��:x��md�-�7n�+�ڛ��L�~�W�П�6g��J�k����S�!s,�/i3/�o�� ^����ώ,���e���C@�	;nz?8F
��ˬ�b�ķ�	'
`�O�g2#�PeUJz���ӽ��'-���4e*��$
����M$��0P�����J��X����c�����_U�g�=�hbպ�y��)3����
w9e�)U�}�7|�Rި���'���*U��W��)�Oӱd�>���p�S�e�v�ܪ�Z:�v�<��~u��[���~���ၪ���=|��G��8����G�����VЀ�{���� t��;�6��Cآ�[6�K�ESL֑�c���)���+�(�����@�	�୨��C˘xq��p��^�#���JO��d�H�R�u����ȾǾ��D]~�{+���l�L��¼���c�?��J���<��ՠ$�� ����T�(
���ٹ����çOK9�G^\a':��Tc�+��
oR �h��ї�����X���T�8���:R[��"lI�u�\H��$��d�W��J�֒�s��S��(�;|��Ӈ{����Iu�D���7�k�֪<K��ϨL��4�*^Q*,�Z��I�BKi	o]%��B�z+PX�j�[��{����6���b}£iX�E4� !�7b!��q��޸Fk��
O�=fxHdR	A�h��Q�;–D2�:�=�h�F�yo(���=U���I`��k�m�.����Z$
��ܕR�%��-�}�axĘ/s��NN E��d��Q���l�
&u�g��	�
(��C ag�툢�㩗ե��F���i}�1�`�H�
X�K��<�� ��0��:�A9����k�
f�aϨ�쩼��w�ɓ� �ޥ�`�+�7h��t���6��/A2Z�0T�B��f��M*b�in�V��V�Ԩ�t>��%<����v�D��
�����FiN�\��u�ru���Ue�2!&�ؖG!#�PHgQڬշ���tm����╊]�eK�SE�Wٸ4վ�E�X��]6��������Hެ��7-y�^��2�W�5�b1�̫�-S��g6!),L��T���Fђ7B���_��MSt]Yξm�5G��U=�JKh��Bד$���7oN�._�6M1?��Ø|���0bʹ���7��ԉ6GС5
I�:[&����;���1�MQ���'�J�B�>�X�'���v�L��5��D��F�6��f+���e"���vɴE@Ϗ%��L�[V�Aȥ��69�'�S%�����B�a��1Ηc>�,K�{E�[Dh�(u������t���HhFe|�f#LaXyZ�a^o0_��!tl/wؚy��G���Y�]�u��s
eZ&c1_Rp�B�5ĽÄf��r,�8��*��OIÆ^ܪ(i�E[�ҕ��<\�@�9�@��=�uY-�-�ȅ��U���ŏ����OT��8�tkO0h����w���W�=
����m����l��Z��	Y�j�g-g� BM�rR�c�4a�����(�[}��pR�M��y�CG��qyzb�I�+IQQq��Z�"�fW�In�D��#�.��m޳����Ӑy!& ��+���h7��v�7�4�Sy�H�]F��2}ޜ+�x󼾃�vu\߼s�Of�-0���B���k
o/^n?�+%SL8��1Il��ʲHk���o#Y��\��_#Qc&qt����7h.�2rA�c��S���qP&�;.:�N�N	��ϯ���_��YK@��#�{�&��R���{��"t���5�S�qB��M�	���*�����0��ʓ#y�]*:��,��6�*�R���/
ު�ߊ�B\1)���Ώ΢�ΓGO"��h���o� ���X��oys�o�1R�h���u��!�t���_-KҨ�3`�����h��I��1#p)�w`4��a�7���J��x/�`�}dz�7З�X����M�Ru�KiV�|Iȓ���/'��3�,��8���Й���0u�"�ܸ@3��۰v#�Q`�ta��"X3��d���s��&G�zI��bi�.�%�i
�e=vF�^���K�O�*�[9ˠ�pP�٥8�{��»`��
�vd^s��W��R��}��W��Y�ų)Ίx�9�TQ��"`ӹ�F���c.6�o,�����(�#���؏��݇H�b�QlWne}����qR�ba�w���*�v`����@������)��*0~l�W��j�G�vV��R��āvI9Fc؂�ԍ���J{F�1��I�e"�dO���՜@;�ߠLݤ��'�^�Ȃ1�*ȣ�G��/�e���-zm�E{:m�UH��������oܘe�>*�7Oǫ��2�o��a�
�">�Tʈf��:�WD7	�VK���Pe����^#�^�;�.��}���jL��'�@ng�v|�DF�1�$k4��Eu�B��8�t��n��6\�k�`��!���S�U�j����xy�7����;ڤ=xAK��c;�	��yt�$�rKl>;��};KX�/�O����Ϩ�'�V�:ߗ��;�y���T�8��k�8M>�6�H@����W}��P�+�q��Ů�"����n?�6L[
#�x��
V 1�5K��J	5V=��'�Z+���7�m(��*�ai3��_��Њ�*�J4��t�N���1����yv�M���;l8}T��}�k%_���=?�vx����>�~�aoo�c_�0�_mC1l!�5��a��!�cWFʽ۸�͝���2��hߏ�nIQ����.p���U�~�������I�9��]�8b�:]���\F\�]>w2m�9[.��Ed��4���݉Y�}�?~Q$��|i]2�k����E�^����)��G��͸0ĆGj��(W��[�H�0[�߈h�MJg@G}����Yc�4���G��,��u#�q_�0�lȏZ�1�w�}����tK�S�X݄A֩B�i�^O�f����V4z�B����Ũ�Pv����K�-��u�ͯt<Jb7/��%�K��KH�]�����Z��.�8���.���y���������%�'��@����#��~��vw�O���
���/���Q��W�
GU= ��DQV���᫷��^`T'CHK}�6��-���:��Q���^��/������:�O~v*N��B��O.��Z->;v[�L��͡�/�^���S;�4TVv���˜���:tЕ��}�K��[�un�`R�6 �#8e�0�eg��%
��΢�Rb��x�cE��f�ӌ��*2������u9+{�a�E�0�V�����/|���&ʫLn�9����z<|�L;��۸
�*q��Q���΀IgY^$#�Q������E�@t`�������fDTԶ��,��Γ�	^���(�1���IwcD�gg
�1��0�bW��aN{w�Gl��
O��oe�����\*x��Sj�
b��;�S	��:���T�IQ�pՇ�*��١z�����1����)]=�J�xhW��)�:q*E�@�q�
���tA�c.c���kW}�%�C�ķoe��X/��2�p&M�@��h@Ң<����â�3֮<1�<ҁ�}hM�-�H�4�@�E�7z
�JwIy�)�gr��7��A��4��D[���#�e���@���m�[tɂ��H]v0���8��rC�&*�a���; %L�*�����5�	
Ќ斱V�o2��AJF��C�=\���l��v�|ׄ'�M�I��`2tW�Gϸ���n�$��вp�]��Wq67�9�s=o�ҍ�1��0��$SmU��O��
���sɳ�q\��1��_���?;ӿS��-���
~�w��K�a�d8<��hv!�y9@ui@�Qv�@��cd@:XR�#T�Vor���#]`l��D��U6���o�s6�<�R�U�82���ʙgil���?��Z�d�F\����|'����FC��褡�V���#���KJ�¡U�Ip�m�����-�̣ˣ#g��#�Y�l��^Y]��Ŭ�v�v��(�L����_&8K�k��H|�O��1ڡ���E���!��نi�0�!Ҷ�9�C�e�e9*��ND����a��@q�j�v���o��#eܡBw�9�EKbvɒGvu
R��R/��9du��0�I����3�+�6�
/Ώ�$����ܴ�����ԙZ�ĦJ����2�g�4�)��LuO��[���$�>&v��R_�u-��3���-�ZUip�R���$-嘣���hwo
m���r�h3U�����8�TA�ؙ�UD'y����n2��&e�	�H�ѷ�&C��k���\@�tE����5�~E���ta�o4N�h3,"�?K����ǏE>(jz���L�(�Ԭ!P�N��:�����@�.D1h��s��;�W��D�rm�p�rZ^y�O�BgD83n@H�Sݚ�i�K�ϒy~CF2m�aTb�X��)�*Y�%�n��ujS+8�/����/߫���s�վ����:�@Z,��t���%J%",����l��&&�eS%E����/k�;�k��S�tB7��>�[βT��5��:*�ʧoOF�/~�k�x�Z��IN�%�2�C�!R^�0�!h�^������cmt3hVO��"��D9"P�����s��q`ޘ6.�t�.v�WT!���SG�]ag�%�g��g��O�^p@�?��ŬY5,+�������S��x*t��VbR��|Q�8�6AZL
q��*GP?.��oQ7-����2
'��P���
��9P�g�k6�7���[M�������[m��P}����	b쇮��_[+uo3��F,(5�j4�q�r�0܄�����=����g2g�,1 �5IK��Tz��C�&�0xc�h���x4�s`8c;����5�e��Sݎ4CX�!3͉l��[�+�b"�KW�Y'{����';�e\��f�2EY/h��{_6O����}�7��Ep,�}W�l�Hsw_>����c&.�ݭ*�����R[��_���#���B+l��qӛ����W[D殖����z�ғ^�}��ҨZҾ�yX��y���:{��-_�qDH��	����|~��|��9���A|گi����%q�?Sud�+[���@���l8D��-���%�?���/*�Y�M^k/��?���Wx�\��||]�4	�{%p�6�&|��'.@����k'�_��/K�>�i���7�
[�b�����7�
Cc,Ej���Gǃ�r�M�(�KָD=6N�TGb�9TѬ���a��������$�rZc���1���A#'F�bѢDX���O�����p���5�����3��[�ӕ��<��9Pڃ�9�F�׎�݇=�|���o�^�?/M���&�����������@#/�Hk��nn���(�ܳ�����0�'��Z����a�sM���i�T*R��C������j����UO�ᅀ�<G����x����Ე��c���g�O��_�3�0
I��kư밁u�0F����ȿ�֧����/�N�����+\b�~��շ1��p�>�������i�TgQ��U��ڌ�s��(�9Z�
�,��d��Uք����!�A���L]|�;��?�4�C�>]׀��d�w�Fh�R����Ųo�1(;�r��3Ұ�l:��Yv��J�At�'I������6KK��p�9qc-,����ڿS�`͙��8�	I���fy;pFu�8�o査��E�i�S�Q�/1��r��zu6�mߘ�Q�(lMN^��xw����@co�t`���-���۟[��O
�J���Ly��s�gs�s�Z�N*+����W�_sCe���'��S��+9"�q�D�.��n����O~�ܔ �
:�O(JJmf�pPyV�L�1A6�	�x��>K 8,�yy���:�5��*ߞ�uR�#Q�V��~T����r��7f�l#������B��
V�n����0#��r��%8<�r�q�k��ĝ�]Il�q�T�*Z�jž��x�#JC��ɞ��&��I�LG�6�1���1��ՆmM>����(bO�r�s��fT"uc�n��y�s�
iǚ$�,��S/R΂	�sD�a����PeF�C�D�Ϗt�rkТ��m�	��c)黶Cnj_���l��;���+\��	��G�H��Ź�g�y9���	��X��
��A�K�D�fs�izyk�u�JÙS���"�V|0o���)9���q�M�g+*�$�L��rb��������V@�w��m�邗���V�J�U�q����!�_��e:סᨬ��lM=���E��aB��bHŻ��Y�y0.�⨒\U�1��\�K��2a��^r�Z�jZ|�1���ӕ�5��K˷��Pj�ɢY�q���p����ϒWCX��y�]�u��9����Qj�Ոכ41{'��Vl�_�o��1�+���F+o��VY�W1G��!�65�Uv�=���Ctz���u���� �O�G��O�pƪ�� 6k�S�4I�Ynz���s岺��o
�Yn�8��jp>::?;|���n؁��^�x�7aN��Ȉ�99^�2���v|�gF��W[�x�bq�(��o��@>!Qt@N~I
�"q�
T��V���+ �M�[�c̈���z�t�d�_vaC|���d(�+�k�I������o��2���J$����?�?~�jeP�If/��Bd��i��;�-����~m�����k�1�� �	>�����ںgޱ��>;nCмf�u�Q��/[�����
��Ao#ػ��ZNk�/�;Ni0x����fF!�����3^D���X�l��s*��<�&;�G�>�Sf��U��R_ͮ-n�N�X��J�v3Eq~q��5��K��5l�T:����̊��QI-��3+f>���Ǜ��~?^��۫0��6~�
�;ed�6@_�ݰ�?��d�����r����#I����e��f!7��6CoV<��/��~�}��M�e�fC7F��ܧ��UH9��%��4�����û�GȢ��e�=��F����-�Œ�.�|��4���8��z.�
PQ����U�k2�^���oE[�DT�s��뽒�f����Zs$X�(fnu\-xԆ���處9RG���.w��{��i�A�r?F��*�{��kC=,�ؘ����kL�t���.��?{���ݣ��y>��u-�������߬��=�P��熒h�}�N����R-p,�}^���e]J2��EN^�
�g+��0#��"A[1��>�S}jؗ�����S�~䜢���:%�nuvH����ي�IL��>��{XU�A��c�Y���n�ϋ:I+�� �_����[�@lH��s�R����IE��i4T��a�d�i�kH�!S^�ӧ	L�'�+6�œ+|]����x�����M־�0.fKʓYG�b���
sY��U��#�J'|�' �-��ЯS�}�5��$C?d�>�b�`�l�瀛�@gm��M=�ngY�˕8S���YY�������������Ϧh
d}<����hO�}*Ω�y?d;De*�N�;� T��oN�O���ɺ$��_W	�}B�-]r�S��	����ɶ���xgX�-�ln�1��^�˷���:[���.&��2�"n��v>���%Pw�K�oծ�h˔~%��{gӉ37�����8֮M���@h��8�W�v<��ZG�V
G�	P�9p�.P�
�ERƞr��6�6��j}�#OU�/A�}ӛV�W��-��kH���!0� }\Sm'hJ�q�oR՗w��D&r"�X�
��.C*S�[-�M�9YS����g��j0;7�i�K�)^SU�~P�k�Y�PV��	٫�(0[ŘcE���E�r�.II�%.��w��o��mO-~ti6�䘔҈.ҷ���N�U�ƛn���H2{o���pֹ��M�zL��l;,�j?>S���ұU�����S{&�N:.�P��h7��E�B8��O	P'U<��P���~g���
��C�d�?q�RP�����'�Zk7����c�ix:�u�\=\`(2r-���SS5�����%�����^ҙOU�n����Aظw��|��9_(�ؘ3�(?
�WxH��p��Ю0!��vcp:�))�٧Z7Q�����b�Ȗ���/���bF�qDZ�ZCae��ɿ۱#OoF/r9�FhT-Md��ǂ�?�hMsIq�,����_vB���� 5�}Nf
���t��J�90��`)L~�?����8���x`�sf�۹1��~]`)���z��eal�1���/p(�oxxL��W����
���Y��C�i0[Uxre����*�
Ow[,����~��
�t�{�V��A�aso�spa߼�����5WN/k2�wZ�+�W�󴜋�Nt�\��#��Thc|��.Jogƒ��x�hV\��j��-qt������]@��-c����x���c���$�H^�m`��1W�oz�냌5���1Ӥ%�;�l�t�Ė�������C��<9�\�N��,T����,w�SB'νU0`�U/GXq$�ZY���ݡ���HL#�^߫��'#���߼�����34P5�� ���>��4c
�
h4�C��Ix͖n���I��l���\;�]���;jwe��f,����l��)���1�߭`i�H��d�.�j�j};!(>����SL$�E��8!����j:Ȓi�ƺ���`cHZǛ�h��=��&jf�ё�~��m��j�
jo�;�5߭٣��^?���^��M�'�N��,{�-��&�4�r�o=��kkg��4o\ U�SDI���"
�N}��XdK�O�����&��Ԏ��?� �0M/�JqA�T�	�$.%���
�h�G]@�G;��&ۦe=�5����c���B!�|MM��RY�F�	�5*"Ss��M^�5�-�>J��A�w<
*p��`���L	C+�mk�2Qe9[���')Q�λ)l�<��\��L߁7�§|@�7��	NG��S�e�"�;r�c���Zi����*�hqu[��x��+��aj�m�T�������X�f�Y=F�|*��J3�Թ��8`2�M��;�층#y�Rm����(��KU�B	�ˊ�<&��	����B*7��7�!�O�s�n̺�TWi�x�'ӢC�	�~�� ݛC��>�Q�)�M��)Alv����-Ɂ�c�B1�x�D�g�	ն\��Ͳ��k�f�fo��+�;��LG͘�˻@[ϳ�F6�|'�w�r�y�m�E7 �ʪ6���>�&i��X�B������}5���Ú׍?;�nm��MG�x�@z�w�x���R��{�gDY�(r W(�$��n+X:B-�"鵤ߌr�+��x�V�F��P�e{~
���LPk�o1vx���
���t�rqsD�P0{6�|���矄#i��,�_i��� x��2d�����E��o
x��zň�E�)�e1�weܠ2��c�Uh�u���<̬��H*�8X�5	+@��i��
����NH7E\7OX��jT��6>�V7|,kb�Z�*`��v�7�s��
�ȿ�<D��]Mɔ:k_��O\�&���F&n���&x��]ܱL�zm�7s�Egi����8[oiy!>am��1%����k1¥�jG��-^=����i��q�>�I�rQ���t�6��m��,�vH*��1��H�zNz0}F�\5��U�5,�D@���}}u���[��+�������e�))��O�JŨ%��{���@y�9�*O���3-PĆR;%��]����k��Q$	��Q����0}gu꺋[��t"���2�D
���n��t��-�RE��/J����$�&C�y��2�o |
8t���G~~�f�v�y�iI�v�b�Z�dJ}�l��/������0sX?t��N��\�F�9�3߆��@ɭ��k��
���i��UCl|���]��,�t�m3�N�
�<�\�^��X��p�z��v���Կ���e:�ۍ@3�K��;.#z���9���9E�� gVO�̼�	�P��$��{��3���{��,��&˯C`i �\A�S2'�]+��?m|Л�����(.0���^�����K ����:-��X�'����q�GڷW��ٶ��!Q�rP���d��a���枆�ڑ�L!�OF3�5�"��0����7�+5o:�Pv�odaT�L��}=�e���56�u���Οd��ɣlz��Ű��/v��|C[���:��8�apU2#93��9��x�t\�u\�b��"f�:�`���6��VT ����]�~��Q'���Kޜ)��nV�M��b%�-k`0��
I3��*#�ܴ���{�cG�L�r��~�{|�p0ۈ�Z�Q4����F��+�UvROS��T���:��� ���g�t�m_�m���Gv��������˹.��yuWe�l:�l�_���ǟ��U��*��Ѹr�2<B�e��+��3�/�c�=�7.�%��߭�h�[�h��U�Nm���#k����2-K6�R��
�'�|��j�8��e!�@��<u}�v���H�ъd:��	v�o�`��Դ]��˷{����Mdn�{���K�w��+u,F��09ח����QS�:pC!���Ќ�^,
.�o���o>�x
6�HX(���JbXWia'�&�o�矴D�z���Rh��`��o��ALa�d;�o#�1`�Mps	��t�"ذ!N���A����4V�{� �y��k�-�r�gS:�`R�+"��������� n���0�F�
Ic4�SuL�'�79������hV�E���O[�3�6��e;X�\U.��f����':��\��WĘo�Sb���+��_�����l��,0��fF��\��CN��5vj�i��{�L�%�ks�sg�/�Q�0����dm���S�۲eΧM�`��2y"Z$�5��!�5�nHs�r��QGi\x`�o؇ˠ{��Z�*�xH�C@]S"k=���5�2�j�De�W�$"�.gv��-c(<^�f��c��֒�hI�7+~�WqQ��O�F90�~
��rk.4�v�4��uU��%�D?�Lt�1)Ms�N�q<�d��a�Á�9B� ��	���?�5����	5���%�qh���;��������m��%�^\����aڟ�D}3��nol�DuL�2�@"Gj)<��E;�BZw0�|�\���6:��,�̜f�.8��k"�$:_oY��f!q����UAsS8���J��@�("���Fh�Zn ֢X�
YdB��ên�"�MF�B�i�_hR�_F����Σ������h���5߉(�Pۨ~E�&�3�jR��E�e�wCE1C�s����{��md^���I�c�d~k�-z��\�ٱoբ�a���lXrN[ji�e�m�|q���‚�4�Q�J�	:x�t�oZO���Ċ>���k:g���-�k��ll-���/⁢\)ˆ����r��F�zQ�7�n�����Ke��FOE��#�+��x���#J?��j�X�DWWUL#3W�ˊ��t���;�c6������
�.�z@�_PKEePQ��o�D� pip/_vendor/html5lib/__init__.py}T;o�0�+̒��Y��@�6��d(
��N������=R�_�E"��{��9g/���`�I݁��v�p؀��{������WHH7b-[Y/�f�{�GW�VS/����v���æ�aMg#1Z�t����
T�F��$}�p'���Jk�n@��T
��F�j�`B��ledDk����"��䅑��C�����4hu4���HTT�L���}ى(����1���f�Q�y�EݐY1�C�HEK�DnFԷ|ؗ��C�Gπۊ߁p�	o��Ȓ�jݶw�=�Fm4�I�5f���@�,��.�T��(e�X;-td�m�u�����.���lE]'T��sװ؟��)F�u*V�C����y�n�����(b�B�ߤw��0N��R+ʲ
>X,˥�rF��Π�[�hF3Z���RI�V(w�8O����e��^KY'��.G/3�i�ps��wAw+K�}����/NT�v�X<ƍK3<;N=��AD�/�n�Q�iR�*|��xUnQed�7�}�q?�ȥ�즀�t���B�����
��PQ;)�a'E��gPKEePQʧ-�-XA!pip/_vendor/html5lib/_ihatexml.py�[ks䶱��_������%�O(ٛ�Y�*����$�$���hFR�����i���k��|���h4�
�Ip��������qw�����_/qC�S�]�[���yX-�u+n��Al��?9�l�.���b�F6uJ�y�^�_
�V_������I�{����ڙL&'�/]7���O�^;?:�Dĉ-'w�)"�)p*�!=�ȩ��碗�{���)
�F��D�����$�'�
'/��\éHs=�̽X��C虧��d89,�%?���~w�$5M���OJ4��/?���K=�_`,�C)Յ\ʱP�ZO9G���z�n��
\�� $��ʄ$�xF�=A�<&Nb9q��"(3��$��dhރ�iN�Þ0Ծ�!��Zab)�!��[X��kN4G��O��M�^QL��Lw���1�QGv�"=*��Ԩ�p��4�2�Q��Ũ���E&$XB�In98�-c���g)lf�����Z8����̊��0���f��2���H��r�+�\�'�`X:7���aX��SN�rH�o���O�clNC�*J�n�Ia��a�dZ8)�0��2���Z0S3ͬ�
�Y�3"�s�f�XP�z2B,�k0#�2�h���"�b�oP���"��q�虯�BLn���B��XF�dIj9X�����Ѡ�l�c��;[�r#<v7{KF;[��I�҄8vДzefOȲ�8f�s�0�'�A��b�{05��an�)�r Fz"Dxna�	��.��`�-,9���h�)Zr9�Fnb#/t��%
Z�
� $9XXr���`a�)ȝºS�P��ь���EIU��(t/3eBݓ���)���4�C��%�Z2���?�
�2�!R���i8�Ic#��Lf{�1~e�/Z�%�z2c��=�*r�
bˁ�U�Q��w�~r
��ĩ�Cʓ����jt��Q�Ő8�fF8�&=�X��͵���Y(GN��B��)4f��֣�QY��y�)�u!ԅX��QA�J�WL�ƾ���Lۓ&��i=)9�VFֻ�I��,��Y��ܠQfc�� Tگ�W2$^IW��B����TV^B�Uz՜d+�LPNH2���J�K���
#���vO�{h��k�Y��Ɂs�[ᜄM��U�U�[���$���Hse5Wԫ͘{�1��%��Of��
mN9���I�O������)q*��.|o��Is�N˭@=`�,Z�~�����9�P@�̪t�l_>k�Q�4ƜQ�f}W/Գ�zj�|�zt��÷��O��ow� �le��r����!r�=�Bz0�B��Y��r�Z����W�(�;Z���?�x���8z�T����lmQ'�JjK�2+�=��{%�q�|�@,���6�虁�f,�)�5g	���%z[gY��.hX��,7��f0=`�\��
}<0z�a�+u��Nꏃ���)zД��40�
i�f�4)�Y�2ä^�����x�*O�{Ssr�"
�ۤ��Js3DF���I�̤d4)Y`�@�9l�H6g�V�G�bh�,��.�z��,7hd9��
YNY����LAN6��V�EiS`�4"����soR�����ybB+'Ss{��djn�%'Ss�j^���<`.eT��l.,��\X��� xU)�uj�Ԋ�ߤ�%MS�|��YWF�v)i)3���<��ŸC�a��O��,ĺ�t���=�V���*��cr���+6�&J�RcUF
�Xgc�0�lI��C�-=�c��cW�<1ظ��{x�x���8��6�>F�mG���skd�*���#�_��8�IDS�I#�!���d$�Y=���I&�zrғ[��d
����Keh��^/���Pf"��M<b՚SM���s?/\]��������h,�>J�zcf|:K}�u�)�L/
���L/ɞ��3V
L�߮��~kx�l�׳���_��ap�[q��wb�'�S�5e�J�D�3En$9<�OO��?��Q
Q-6���8R��k�_rnĹ�~��������1=��N��f��(�_���W��8W�R�q�9�T��|��|�S��gp�ѣ�r��� ��{){?�9�z�(��XA�?�a
�f��y��Qy_��^�ê��ͭ�S�e/��6��7��^u�n�Y�av�3w��t��T
>�[t��wV�r�S�yw����TN/o��7�?�ҵ���٬���zv�F������w=s^�v�ñh<%����g�@n�o6�@���wÕ�+m�ݡyߋ���3e�Ɏ�
�MKb�mfgz�����Vbi�nl��f%�Ơ;�l��V੪�گ7�h���hR-֧�%p)���Tt�r!�.J�o����=s��[G�r���\lͺ�Rv����U��NJ�Z��^ϸ2��~tئ����ѷ��mK���`�&(�v��T]��������/���z���wB�N��_������x�!�&�������n�r;������uE�9G�tO����]o©��z�>;-j�ի�C�}���7ʶ��4Hk��8�����t}|q�u1|��
{�ܙ�C�e ��^-�����֊��F�Cn�c���F������/�������n'��虁Gx&������p���l˲p#�'
u\؆�(���8���E����.��Δr����"�)�R�?(�"?M�&�7�T"׊���T�%6��$��<���N�����_�^j���PC��d�V�^&>�2���Z�X�'��껻�2S�K�`�M->���i��髋�?^]]�]]}�?WW?�]=֑���Bw���W�]|��z��?>h�J�2E�N�&@C�(�y�t��ETQ�s�С~�g�*5W��0�--U:U�(�CT"��IZ������1�Z
�B-���h��U�A�r�r2�� Q��&D��@U8hK��5�}(���J�a���0��-4h�P�_!0
k�h~�¤��FE���͕p�%�UKR�"E�Ԙ��f�`As��
�F��#����O,_��3�*
~��d��J�j��X�e�P�),Wf���/����F�1r��g�Ô1�2�)c
Y֢�M���-�d���Q�]ԧJZSE����2�ϕ��G�~
+9�ᾲ��1�@U8(�����!� p<��qǓ0�8�5d)�8��@�*�r�STc�k�^�-��P5�^����d퇠�*j�:��]��5ܮ��:D�0�
���v��<u�рA���R��
�f	(t14s�uV�*1(i��a%W#���V7���˄_���)�j�
����5�tO���q�H
b�	BP4,M)�?,�iHC�4� 
�h�D�ph
����4p�!G,����{h��h
��hȷˣ�o-|k�[�Z�W-M}�Z8גsm�&TQc��\�ZrNG1W�v7��M�h��
����!�"PJ�bD���0�Dpt�(�q�%����1 6hQ�l�p�&�즢�q�����ͩ�0�4x]��]�l�pv	N��U���t�w5dk�0���m"TT�u�z��SI�����zjHZ���[�!@C��
!5�>hD�Ŕ��h4ŰQ
�����C%��1dc��0"�v��%eT����
�j�è�OR�ݐw]u�#/:؄3�k��`�UP�@K�4̺��*h	�%@K@-@�2]�APO�P!u�Iڂ���@р�D�@�
Pi��6TA� �=;�w�5GT�ݖ*�U+r��CИ*��Jڡ�̔��B�wU(I�&`��w}�X*,DEŰ�5U�������e%����+��V�6�
�N�]:s��j�~��6����~��K�u_�ӳa4�[��LnrP����6E��[���6�cKi+���9�N�I*��4]ry$_�!��ş�)B�>�}*؀�	�a��/I�>.!�I�>*�:̘>�mg<�I�l�:ѿ:Ɂ
5ـ���x(KA�����'�O��4�%�iR�B�	�"Ax�|���_��3��=Ȍ�/����Ց\ar��գ4��-俔��_z�7��]]�}:��<=u����g/��ۛO��Y�w���ֽ��r��~+�Θ�މ�pl����˫׃�i��d|s�^���,V���fڋew�f�Y��h��n8�׸�{N4�͗��r��NZ��(x�����!e�a�.W��#�zsW	�ڷ���]��|-'p)��a=L!
 1�/g%J燘H��Ot"t�{go�'Q�=�l;�b�-{-{&<	#�뉶�n�#km�o9nCΛ[��?��m�b�ޢ~E�������ku�;۹3yjս��w�|3����t�d.&{��8���tbl蝆��Ml-�,V�R�@��t�=�� �/�[�1�������qX]Mn���ի��ߟ���כ7��뾂)�~�3��B]%Hv�_��
�x}�����T
2۟�r�nk���>^��V�p$@�\c{��"xrv6Q)]���{��<�۬W��y�V�����V|0d�P;��1�D�u���{�-� (V��g�������S+?�Ɨ�Ø�d����1;������둺t�Qo�u�4�u�-O�|2�0߈�a��})�S�!��N�=UpX�Ο���Ȕbu�֘���ȰoGKU�L��d��G7�6�0e9���/��=}GDڠn,���}�s�T}xs0���T3�F���p̈́N�s����wU�5���}p.�C`K��a:�t2S����@��⤇~�j����缒f�>��2tv,bH���A�K��gSe�e�n�J�&�¶��#��/�Ư���)��y��\8���s:�֌i�}�#&[�:
����ؚ#Jo�v�k���7�Q�ߚ��u��퟊�Z�O���x�Ix����S�Q��Ɲ#�|�����'/8l���g��H�nEY�����v��o=�]��� �6�>5����8~G�YO�R9�I�-�����6o���]l&�~�ߩ�T�'�"��)`}�;NX���\��&�eZѧ�JBm��iv�PKEePQ�6=a~$pip/_vendor/html5lib/_inputstream.py�=ioǒ�+:�1�H�-X^X���B,��B��a��h83�C�{���VU��P�c��@�������.�|Ŧ�ES7%�NY�*�fѬ�Ӧ�S�}���MR%y6dM���OӤ�e�V[[�Q$�xzóy^���N��]=���5^�7�R}�꺘�i�3��)�4�mm�g8e\�o���j��}ͫ����s]&��'-���x�B~�YUGY�q9�4���b~|�Qk��,��$��k�ۗ��eU���W^De�O�b^�@B�Q?o����>��HR��зb��� ����,�X}�YQ��.�T��T�Y��l�jL���@|���-s���h�W�4�
PC��s�.[����5��̙f���!������&J��T��,�VMY�˨��w������^ѿG��)5�M�ߗ���LNNvG��S�2��ҿ��_
}W��}ݶ�۞궧��n{�۞���n{��^궗��n{��^�׺�n{�ێtۑn;�mǺ�D���S�v��&�m��vU�5��1�Ͳ���l!9g\52R5M�Vl1�������XU��*��I�cdHes�7��n��J��p<��5p�
`��� ��M:�����M�"KҔ/�TBP|-�& Ċ4��p�*XQ��*z��W#Ƕ8��%���k���^��.�!�\ �n]_YMV���������ľ�"Iy��8����)���}�ڜ������F�v�	.��O���f)?��#��`㊶xZ�?�$Y�Mg�b��a�"O2�8߽#�2����W-���xz���� <S-�U1�à^��/����jy�V�T��
�k��N����#�HA8V-Ǫ�d3�NT�S�T�LT�d3�����&��*kZ4Y\7r�wj�nx-t�	���K_�I+<}G_���Ϗ��#jzAM/ŗ��xX�8�b���bP`՗d\��~��/O���z[q
€5�/�l����7Kq�{��x���Vԩ�l���n8��n ��HJ��f[�J=g	Y6)_���� �XR���R�j��
��'�Z�"��&#@����(�GT�I��l�7�oX�I�}�g?��?P��9�~`ä�N�OC�&�b�`�X��=@��j�ť��ȫ�p�G�=8
�(�he,kV3^a�0#Ztj����������R���V��Ł5�����uTГC��O�[�{�^����U�a�Պ�kI5h7�Za��0�3y�Ȃ������jL���^w��Z��{#�۫� G��1V�׼׽i�ڟ�vհ�s����X7��m�$A��2Gw�)�[�
�Y��#��C�><5�;N�%bB
nY�>�)W��U�1FK�q+�5\�`
|�3����<�mtVg�G�d�>���I��!��mr��� \x%_E$�C��7�y��s9{��I�a�\h}<�.�?+�GF���[��[�����;y~
$$c�O�p���`B������� �y�+�
�h��ٓzC��OLȗ$��|DZ�7�恻��7��:�)o��P.,ҮY���#ֶ�;[���O�n�����=9g�\���zc�8��
��ȵ9����hj%{�����mT.�n����5�J���쾾���5K�����(��y�+�w�<˄?8�00�u���0�c��˟0�8�ْ�'`�`�'�##6���ٯ�*����z���]Z�`X��n4�'�@��¡�e��#CS���Y�w�f�h�,o�xQ�A��Z	ذ�>d�(�����K�K)��� �c�F�ɢkaXc���-=D�#�ߡ�ݍ�V@��{�`U裡8�=J*���S�=�~�8ʄ}RcTA���X�*���R�����s��\�ZN�πp�dQy��rP:ft��2�I�2�%mx�-T<��9�B=ϯy��
t�rT�m���5��#����-	�ރ9��)��"�b�"�q^b|�dڨ�70��a2]�Ѝ�Y�0R�d���8'�LAEMZ��������l�۱!�L��C�$�K�G����u�`��޲�y�xoN��"Ԣ��`�yv��J���h����:r'P:b0?Fb�Au�q�RS�8R<�.�=͜�F諷���[qܽU�&L��
?cqqd*z��>f�=x>��E��C1�`%�~b`ih�eT�S^Q�գO� �i�x�9���b`�c�.�(D��Ȱ��Q6�P�)��7�d��6��ӵ�CŸ\�(E1x/�l'�����ƶ9ʘ
��2c��湈p�s<�a��T��IV�<��–b�>4XzmW6Ic�����gk����owe�}��[8��rK�
'!��V�$x����2�5,[=ͩ:g����uS��~���W=�Z��k0fz�߂.�g��l!��Μ��y���/68��D��p&�R@�f���+_\��a�g�f)0�@8�(�M�7��9�<�ج�w�P���TZ�-�d93'8���6K��	Dz��W�aB���TE��!��*�3C[1*�A{�,*F�[dnj��?ɅJ�U&�)�7��r�8hm
	cA2řk��`�'p�F�l�d�S�u�C�B"��jR�BI������:��֏2uިY&Hv�f;C��!�a8�ig�<�O$@=O(����$��X�$(I�Q�l���		�ca���
\v����r ��韰=/:�7�0t ������J�*��@_��-A��ъ�ed�<�z���}L�/��,O��b��<�1#/Ӌ��I��|�c�q��(I1�5fb��O?MP�d�(`:x>�`F�;"�$����5?�F��y�<y������0#���d�~D��es��2��nQi=�0z9�z��
�ϓ���t�K>D�l��[m[�����R7��w�)�!-�yh��������C<�#g%�g,�˼��:��~�	lbХOD\���U��>�#�\#��\��`�r0��w��sSJ�9a
Kn�x2{��(S1��"jMQ~��d'ة���&�w�,�()=z��N�&��)���Hr�s��oy��7��eh�c�ws��7<}�`���M��T�_���_M�����f�y��&\�r^6����"��n)�~�5XeKާĉW�0F� JS1���1�m�I#]���Cn?������J+�"Q�ܖ9x02�-tc��
�@hK�뤰b|j٫��5���`���;��0��Y�d
߲%$oѬ�e�7E`3��ӊU�u�H�3���GZ�����a
GY�Q��V;��K�>�>+�x%b�0�%r�e@���(2������x
T��舂1�y~���ڃ�,Z��_�/>���z���!�2�E���ط�JR��n�p2��z�
��v/@�ǠNY�[���XV�(˥�O�2�!M�Y�¸֑3;��Z�M������![��i#�����d���Z
̿��(cwXD��T���
�;I�����|.jذr�L򹓺U�$��lH(�����&G�o��

%�ԡ	K�{���)���w���ΛU�s����T��ߓ�����Y��N��D$H�v�0�\m_��{��ܼݒ��*=v������;��a��|��'�Ȑ ���+�L��ҫ��'���o��ȃ�Lqͼ����I��b�%_$6�+��z��г�=Z���@�=��J�F���
�g�Q�� ����o9Z
,oڊ+��m��1���u��a��>3���<c�S1�%�Z�0,��K�U�\ZW�����!���"�h@�l�IEpB�F�6\��v��K�xМ�	8Z<��BT%
��y�vR0�"�3�.�,G����]�D@7_h��P���h@x�-�"	3��]�}o�WkCZ��,�wB2�y@��V�70ד-�F��GH3TP���f�u�K�hY�/��oєS����P��M�����wB����!�T�
h��@��{J�$���e�2��H�p�ȑ���2c1�
��PLy���>���EIY�:����2��2|�9��P��X��F�.�;An�B#�:,6��VOB�]�;yy^�L�1�n���Y,�����O�����Sg����;s�C�K�,(t7DPY�f��U��ӼL�I6%�ͅ�&�d���_��u~[�����(�12�!!�L�K諿A�E�L&lG�Ē-�*�Y'�M7���Sn* ��z	e��/���2�%��2��<o�2c��,�VO��>Ú��	}ԩZ��%�)�6*����AkE�����7	L"r�͊J��ښ
����?����s��`��l��iB3A}~EEb�{Xe������6{�/�`��hZ#��ht?��8���v��ݕ�cu��4��
A�SG!��ct9E+e[��V�-,��Y����EW5x����W�WW��c��<��,+�і���-�Q�"�;��X����W���d��>2�,�ш��U�!}�kN��V�JՎ��طnP���F-',;4�c>G�L�����0I?��F�c�5��Qc�6x�2;kbϸ�}���u�:�1x]��o�+��|o�q�)
�����vj��B�{��c~+����Z���r��o��W����H�:\\�^���O�jE}N�|���ﲂ3R��:�
��.ڀ�k�@V!~qu
U�����hD���u-�'�x�Qku,��A�ڠ�N'J���UT��9w�	y�?ޛI��1���(��}����D>�#B�����(?~
Ӱ�A�D�#*����h�}�aW�r�i<F�ۉ7jSd�/R��o8
�^U�^���=�� \]ƴP�¦��N�4)�w�Խ�O����Q�PP�`�^쨮;���Cl22v���V�v����X�`��{�9�L�@pM��/&`��"T���b�TzH)`j��po�����Vg��L�fK���j�W�n��%�$|�l��m�a���6�vѡ=�t
�<�2�q����U-k1T���IK탩n�.˄��1n�}hX�ھ��ZfNi ���-]Ik��Ψ~O� ��\h�)�!��k5��v#�y����k�*j�-�a�m���%�r��(���v㢚���2o+
�d?JP��H@�mQ`rt1o�8r��{�嫓$�(��-���]�a���ɫ�C'sg���ދ�S�O����p�v��О�О��A���@��aY?�H^�i��
r�u�8��s�\�T�z��&1�D�H��M�F��F�@�����$�
1Ԥܮ1������k�Œ^�y�����[5��?��L�"���*��^��:�\���;�L�=���1���!T�)�KK�y-�X�eWu��>�m��k����+浒Z��nnBx�!��u(!��=�(�l�	W�Y~e��xw��q��8S3a&�Nn0����X����Y��&P�9�ψ}�T�1��0���$��gAt���|p�6z,�j�x=���
�
qkh���
h���.�*�1ob�
.�&*鮘x]��?�T�d�7P*���%�:�J�2C�a���JԈJ��@�G�~�Ό�t�����(�By�ɠ�P/?��q�!ʾi
8�wf�ElM���QT.��/)Y���$�w�@�E����\x�#��'FJ��X+��z�G��\��{U^h��{�Ve8W�C�(
D�x.��`����SUuT���5�S�6�Ô�� ��7�72�d=�@���7�0�V�3��V�c�H��Y:�|,�p\z������W<���\d� I��چ&���E%
�5�+J\�,�K͌-�[`&�4�X=md8����]m�����1�L��:Z��F��b:�$��(�?R��54`+�W,9g �ӵ��|�QҪ��6P��W����X��;��`�F�[r^�$�w.����#�]�oC��GL'C"�ʠ��׋�yQeb�>�c��n�:5U��l�D���Ea��ֽ���>��4��Xo�X ��q���Z�;�a=�O��*oF|+#仲��Ly���fU���^W��[���#�L0B���qu]I�Kk	N� �K_�ƚT��ACK}���iid)U�t�w��9�u�Ǻ��X�ҧp������AJ��@� E����>��t���H���~P��T�f8����\=�6��h;�����S���\`O�o=�J�8�\����Cַ����QO�1�)?�WT�6�V_r/��?۽@�W	����<Z��`�'�/�uO��	N�*�A�k�<�bϼ[c���5��r�r	v�&���RP��5���K����>e�B�n0����E�	"&d����m$O���=��@��t��2dW�M!�Ż[D�.4a��d4zk��k9��7��ѫ$D��uc�	��˟��4v�ˋ3��"0x�j�~l�'΅S����{��ڵ]z�AŒb��J�Kd�� �g�i�\E�Y-W���{LN��w_ɢL�q/�T����i�w�Xpp�Ҩ �ߩ�/`��켛"~�	{	N��w�÷"��^�M/�;&�h��W#aq#|a/8T����h��07�W�9@:�Y�;pR�"��N��ER#؟�'~���Y` <�@4�O#����ȧg*�{,��Y���m�H�
��ٚaL]��H�m���6L�м��'~�m��g�V����p?��h8�Ƶ�քd�
;���]0���Bԑ�q��3Qj�Dj�!^�D����}��Q����CE�J�~5ir��A��X�j�YD%s��rz�CR9�x�P��ۮh)ҍ�#Lu���2̴P
-�㼤ݬs�a�
I��?1�|��(2ີ�;K����A�G�,7>��Mϥ���x��U-~oG^'D{k�{�mNz,J�y	D_y��2�wV���7�W9|vS��¢f߄�φւ0Z���-�6|���yk�ڶI-�Ԛ-��$([)�C/��%��e�emh�L�%m��
2:y|
8{�O������o�S^?�L�'�d�����v���F����ԥ�q0�=`�Xf���% �>bԪ��V����r�3��1�-�xR�n⣒o�H��p��+_ ����������
��}��Z�G�:@~`.̚IU��m:4���:b\H�{���"
?����zm�+������,�3��X����tc���{�!��ð�s/�lC��}��&��Ԣ��>�h@��#X�5�׬�O�6����=h�Hpt��k�F~�����г>��e��_͑��m/(m:�߰�M����C<�{�z���Ȯ9����o�k��#�&��ϗ�.�U�w��<�����F��	"�ŃF�9Ԏ�o��1]�J��Bƣ(�����8��jX�q�DTї@�PFn��O@Ǜ���|�ÐJ�w��n��q��u�tO��ë1����3^��
B�2$�_��ʥF���@�!�턬��4�eD��{`������^�F�4�w~4z��5�0f=���Cz���ۄ�6���sQ���љj�O��8��)߉b'g����I�QS�A��٭���y�O0u���첁���$�#�H�����a�W�*%)����y��O;���܇�_U,����)��;FQ�͟�v�'��P�P���?x���J�0�|,�!Tm-��a�P�!�_	���
PKEePQ5�mO�,"pip/_vendor/html5lib/_tokenizer.py�]{s�6��?��gj��T'��#[{lj�if�4�8w����$$��H� �m��=�$��D�br:�,�y���<wJ��G�x�Xә�D�a���Z��'�ug1�u�$p,�5�m���m���i̬��:��
��1"��'��¢�k��������ϞI=j�Z�/��y\�z؁k��!��$|���Bl���D�tzNJ�QǷ|���3ò^Qi��_�g3�=}��S���i�-�O��������E�}��:��b�>���,��љ
��B����-��g�G�iT᧋ׯ^����qQ߳hT�>?z��"G��^���G�(�}r|Dz���w�xt(ހ���gP�D�Q�Q寲�=2l�1�Q>~��ܛ�@;Bښ������K��-�ϺG�;,����1'1|ī|E�GC#�<�˿'�'�6�Ƅ���I�	�E�9��Hl�e��i� ��H� ��1�$�<���5�`�s
���|��!C��DP{�Z(h����F�$L:��˿��!�>�d�{�zGo\�髯n�uò�aCDn��i���k��	�PO|H��w�f��/K�#�@y�q!%�}F�m}��F2����s7�P���ʎH��S��wEm���^@7C��� o��}j��ȊĐ�I�P����>�u0�t�m(�P�SZ��O@��*�c� ��aä����t	0�,�mP�Paq��s���L-uL��{
��(��/YA��@|/1��mJFr?�HI
�6/�Џ~�"��CHg>�4�4ky�4@)qл�:������V��?8�UфnL�)kĽe��`�j��	��MD��D�`�mם�� ������0|�J-�$��~G�R�s=�.��`쟚 �=��R{��t����>�P��D��p��z���z��L1$hӑ/+):�`J��ꝡ�� c���Ǵ�r�w�!����#�������l6"�Ent�V�"'�1�aM6�48P=���G؟�-�K��6s�ˀu{���?4*,���8�}�8�*�W)�O�i��T9�l���>���nB(tD�&�1lL(���cB�&�"?�>�[����D�i�3���}Z -��P}��-5�(@@�e�ξO&��v�����7TQl�w�1�F�g ;Q0@+̓x<�l�������8��G}4ti�^s�c�de�b'�%����Ӵ�o�{q��B�1�'52�q��f@\4&�?i�����~)K^�ĮRuU�}r��z4M:���f�F�7p�͞ex9��ha�w��ݟZ<,�+���S��N�z�O�?<$?I\�?�k���L۽��1�zrx����~
����X���'n��cFA�y��Q��0wJ'�=��!x�{Gc�C;#�4&mˡ��(d_��H��v���D%��w��*?V9?=U)�険Jʤa��Dl��]�>�c�����s��	����xͧ���7�4��MT�o��E��)��G5��h}}�]SZ�E5��h}}�CSZ?D5O"Z'�7ϛ�z�|�z}sڔ�iT�,�u}sޔ�y�M�1�hWYH�ga�ݣ&�˷sq���ߛ�3Do�5�hЙ�jb����O��9��a�X��E����D��n��F�w���o�J� 7^��;�?���{}Gd�pe�����}�Ezw��ԃ�8��E�˗2R�ϩ����!G��g�x�-F�d"���>��O� L��0�Y>8,,r	�0r"_a��l.9����F���ڮ�e4K�U��}h������,rS�Ԥ+�1��:��;��jG|�+Y�y)0 �()�����8�Q"`c"!�":Ǡ|��8��	����_j��|8~%�+	�/��3fҳ8������v�YbI4�@����Q�|�K'c�f��@Y�Ӳa�/�]�3"�|��(�S?��G�pS4�l>,�H���XI�Ok������7��1-���ʶ3�H��D�x#BÑ�0Y��	�|���{<-> �*��CE(� �抡���T�N��r`"�c�!��l�w�~�œ���{-P'��A�Bl`"ͨH��`2^ ���q��o��~�Q�z3��?�P�1��:(��x��<]��D��sk��#��E2��_dH��Cr-��a���%CJc۽�m��߀�h�"��v�{JQ�FJ$pv�3lD���s���x��\����q,��_J�&���F	�g�~�N/cKq�FaL�Ⱥ�JÉήo�]�˼�0ad}TdX����m���O��!/xj�a™��
Nm%�d���S}.8�%��L1$Ql#+N6���I��y�<-���u�p�+Cd�%p��N��sk����iE{o@+�xR�	{T(��g�^yS_Qg�:uzI#��_t^��z�WX��A*!�|�&E���B��YO�=���d8��r< R�`*��I��̸W�W�U�J�^�iM����"�_�/�S��5��4E+2��D
W+���|S<{vU'X�>K~^R�{y0��(B|y�R��
-��	�.+	���C�)L�a1����ҥ�"L�/��@��GieQ瓴��@"�|����OB�ជp���S ��G�H��s|�^+YNυ�Y��9;�	�4*@V��$}ź�<wt���a+�iC`�c@:��(n�a�:$��R]��\0f=���xa���?QRi���p=�dP\ZF�����ᆄ��.<�1�h��+e_���",M����H�q�OmM��uX
�����0�̳�rS�t�GG)��{.�v�7O�O���+�_C!yR�)}-1�9��j����)�D3�ٖ�{G�v@7��8��{֔���a03�S��g��bj���rQR)#����IMA��`�Y�M$cF���1��1R�{���ŝ"[2ln`�.
F�>�ʱt��)U����#�)�#�����L�
Xv/�j܃���1�,L�T��o��B�e+�lR��G8����y��Ώ�t��?�ʈ�`
���q�Dq${˹�m�L7���"���y�]<�<��ۈ�V�.|�
D�f&-��_%Ѭ��p��ў��/v��#��a0?��0_:�Q�q���Ì\Lf���x��WNnN����dfPק�|��IJ�_� ���q���{L��2����AF�x^�b�@�aHzc%�5�'C��r�<�!'&6tƜ�H��Ҥ��CLi�J7^*2�tgN~�b0���`pc����$�ʆ�F�!��/=��h� ����n��IR	-��ٓ(5
�Y�UD�<Bi���6��Sh�D��_:�)[n�����`�rq�;k\�Z�αD���R;��	tN�s��@1H.�$�����O?�-���-ڪ	��V�m�N���픙1óf~a�ն�'�u�^���=MT}f� �V���ר�Y�\�f�~��UJ'���/*�u�{���6�頇U��������EyZ1�j^�����xU��ʈ%�g��d�VU9'�Ld�j'ƭ����S3"񩂑��T^&����>��|ǒ��q߰��E�A=�?�e�K��j|�Ӑ<�%���P1|;w���i�c8^"���e�M�Ʈ?�p���l����=	��x\��4Q���?�|��ˀ(Ę��|����7�8`/�)���e{~�"�
Y�n��Ϛ���/���h��F������W��ֺh���>T�F5�b�6���U��׋qK	F����'e����p��؈f��;�!����amc}Q�[�R�T�qWt��\�ƻ�B��������w��GJ�Y���z!as��v�'��2��X�|�䵨�b%�w�ϛ�
s��3\��w҅�%S���Q�Lل���}���·�p۸��?�E�:�c^1�-Xj\nr�T"����͟�?fIS�T$�EH�����Kh-|��,��*���T�Z.	��BE~�(tX0ϝy��U��b4�BT��^�J�ﭸG�h��e��y���0h����������O���9���"�6�o�y��k����-	ID�v2&�v@���G%r?w-,YL]`�N�L��dYu��z��@\��i;������I�&�%���9H���kn�Ge6��ՙ����]ݱ�j)�ta�N��.��ªe9ԅUk	���LD�\`5h?�,ߜ�lR˛n��q�>n�8�-�yq�̙4y{$$ٽDR�M_"���{ed�K�+�gc��in�i�dr	c[����Yvd��rGlsm��悁�x��(��L?ۏ��[1��O��~Vg�k��LiC�S$��e�O��Ʀ;��_B7��o���;��i��E�%�w"�%�$���kN�/��b)?�=��%�G�x�(�Bj;��n��n���4V�+�q��-$���u�ӚF�A%����,�)\M�_��.Y�-��uU!��S;or��TM�aG2�j�C���X�8aفK��i	���Ҏ`�g,�L��@��M��Z֏��ju�|�5)�gNNW۞K�#���]R���-��jaڃI
5U���mU�~��D��C2�%�	�Ӯ�x�����֏����B�k�}���߬�R,���()�)���|�Yz�H�2$
�c�6��V�ʳW�hJ�͗o�6��
�:�wa_x#�|������U"O�9$w���j���9��"ߟ�rcYgQ���������N~��q'��_Rd���|q��NL�Ȟ�����3&���m;�Oh&�;��㍢e(E��Ev*��'��ĶX�eY��Q��'���O
68���v�%-�ÈO]�x���{^�?�����kӷ5Ӟ0�Qc��y���&��l�,F������@�Z�
�
��!����&��,ƽ5��O�<Gi�׻�����3�)ã��K��;�2����	�������r�G�9��3��]~��5��C�˘|Dzj�UR����f���1}r�Q��0^H�7�h"_:�#ނں�F��ѝ��6i|n 2�U��s�#�~������(����)�:�S���I�.y�����e��U�3ˆ*ܘ�,]�
3s >�H�΍�4+/��F�_�J��Sc���_��W��4���fv���v�����3�M_��	c\�R;������O��Ƌ)^��7�߆�=��N�w��J,±ܤninm��)2�ջ��9[�V#�r��u<Bj�R�+]��s
ʘ���S�A�pj;'�Xfcr�p�Y��4H�P_�D\�?s������̧F��J�;�Yrh�X�j��ֳ����_f�Ј��h��TO�(8�7QNr�������������
(b�Ƣ"�ɍFޢ��آ%�r#��+����kL�,_۴Als�-t!�`-�n^n3x�(�¡Wj�z7s�-K+�>�:R��Uv�J\g�ז6�GKh?s��,���!)�*F�����*�y��R���C7(���uG����
D�m��+v'��_��?�,��䘸�-�I7��-b�/^�Oz�Sݷ�,]��Ǜ�{�,Xe���N��aQ�g�љ
>�y�~ %��&%��y�5Ŏyi4g���1-��w�����#�V,���eL�6~�.�ãcp��A�cPcW[R��T�n��)5l�o�N�)[�"�`�B���\�8�ŠL��b\"�D�b�u�j�1+������}R�K�ֈ-.{����w��C�3����L�L�T����8�޾�4~�?�=?��}�|��A��?ǂ��f����L���~����$��"n��1D�Q�sŒ��8��o��FQ�%���5��5�j|�V�x�͂�2^�P��P<xi�|:M��I�p=���*SG�M1��:����%?�ꑢ=�7�C�CI�p�KA���:�)ZkZ;5��v�Ĉ|q�/����&*��������JN��KM�����1m�`�(�=t�F�U9��d9��ل���
BM�d�
ئ	g��eKD7sg���\6.+��9���
Xձ"��,�Ȓmp[��8=�P���P�:go�Y�
�v&��"������U�/�&�=�컳�E�(<�{V�N�~��{��Bm�~�K`
���*SuY�:wֶ;+���#?�m���5�չ����i��8�
�cD����κӍ��%�pC$�S��)��S�v�2G
�3\>��í5�Fx�ƸI��˽]���E�&�B��f7�\i�%���&n~����g�qo»��h`��,�q��]�|��oƆL�wbUZ|Ѫ�r�i�z�9ƕ!�V�%� �T�6%/g�N�g:c
EކwU��\��궨�.{PqG��.��A�&�n,�޶PTew]����s�*���K�����v�T��o�o9*��^Ƥvph'�>�eB�o��Rժujuc]���T69�M�1�U���.�)�u�O~ׯ ��n��n��s���ϯ��]���4�
��BS�ŧZ�Uî��7̀�M���7.��n^ħܛ��p�E��8(zT{b�ɜ�����i�W�'���}�۴��)>����C�;�����S��I�(���\�$Ѓ�#_�ɽ8�3C�R�q2�_�4�b��>��ލ>���u����2x|h��i1C�Lj����=�U�/3_ze�3`<tt�x?|k'C�cf��٢P����9�t��=���L��g�2���L���J���|*o����jcYͷ��kdQ�0��J܊���v�ٲ-��Ke�R@�)Ve��L�'f�E�_�ss5��!�={Qy�
���g'Jx:���SnmNj�s�"P�ʖe~+�c=�6tǻ�ޔ�tk_x��ba��Vgc�:�����AI%���[+��J^oſ��Iu��1߅g>D�b-�j�^���7m��C�0�&�ͬ4���>ՙ�w��M+�V6���`_�ۆ��O7�4���%㍭��l�[mkĖ.���j[���W۔��v��!��-H�ęty�-�V���X�k]n��w1G.�i�#�p���LUk/�Uz�u.�uP�AI�V%�%�&�`R��
~>��R��w��J���Q��ˋ�rFkҧ(�|�d����s�\r"�G2�ưd���=6WZ�:��������»��!��߳�3�!���t'W$T~���3q3��U�=FE�x�g��W����=��G�.K����Դ�o�	�DU��m�ܞ��a�|�QP�p��=����d��)�mro���M&ԣ��]>�Dw�׸Ľq=,��
?��?⫋R��=&��⋂�؄����⒊��V�S?��^�֦P��I��4����ׁ[�PKEePQ�ӉI�Cpip/_vendor/html5lib/_utils.py�W{o�6�_�⠠��)ʣŰ�5��v�V�)��
TZ�c62)�T��w����,
�"�~�~h���tY�J�4�.���F���!��%c���T��BX�Ya�`IvSrӰ�UyU�K<
�7��#�TQ��"�I�"kXY
y�^��WZ+��w��u(E���\�J'F�7D��۔��ݿς@,��k��u�p�9O^|ͥ����|ɪ¦�2�ឯ�j'H� 
��3��u
�4eE����<܅1�o�]���0%�يk:�}�"�����V4���w�.0إ���v�2��~l����I%yڂ��
U=�w�K����Pc�ȡ#��S�򗓓#|�f�	����A2V]�,,6`W�
u�Q66�������+a�f&7Pֲ�2$������g���Ħc�l���xbb�,[!!��٠Ge������ހ!/�����NI�@\�A���5ˉBs�
�<[1)֔�e����X�v�f����{?�eE�4��=>�@�)0x�0lQ�)��2�O����4�ɌG�}�̤K���Ar��~vU�֣m+k����Eum�/�IJ_c*~v�����l�#��3��4nZ�+��^�Mؗ����X�� ��\V�0��(��=��K|�n:S�L`J�Z�����<pt�HRX���7|cп0�C!���㘛J������L�[ġ`(��ƚx���eܸ�ħ��Qb���>)��B��a���B�����Y���4�rM6�|���-/|�¥R�,L��s||
�Oj������܅G���i�V�-c�*�G�’w�4��bm.pH%��=��D#��iD�{��Ѥ��)E�D�U{�$[��ʠ��y��Q��r��G���*����K�ޅ�/�/��I!lS�5Mp��|�"b��Ll]"�/H��Q&#��'�Z,�td�*��&��	��Ƥ��[2����s��E�Rv4�w2B�2��T��Ô�oÿP�̷2��uV�
`7u��t��f%��V�İ��>�.�:��F�g��}�ݪ���=��k�y�s��I����n&�
��\e&)����X�%�7�{�3�p��E����7��U�&��'3�k�4�=�
1�H#�����>���9Zt��s��[/�F��$]ou[�
��X�=��r�x�����Z��L��h�à8�N�27��Ǐe螇ku�#��^�q#��!6m]��Ǥ��w\�\�É�����z>hS��E%�?BH��^Q��z�:Ed�;�^uF���J��z~r5�ߧprO��[�W�����~���b�p�"�fx��}+p1�)��������'���JO�='��i
T9���g@�F���A���H�د��ȧް[�k���n�l�R�A5V��n����8 E�h�/P�˸Ɏ�y���cקF������a^�G�}�rt��"�M��iZ�o��װv{���Ů@�2Mc����x��5*�OLZk��Ķz
�xJ��H�Ɓ�����--��tԃ��^�{~����9\����f��Z�����yn�.(��i�Z>"8ch�mi�T%�/�kH�QIf�?l�m�E[��<�2�=�#`�Cw�{[��{�GFm[�c��*ߓ+A0|�*�)]�V�+���7�kG��iZD�hI��V����Żs|үb⪝�m����KI�n���c`y�~�PKEePQ[2&@HF!pip/_vendor/html5lib/constants.py�}�w9���+8����c�x��X��Y�%�ꖏ�庺jk��I2K�L*���}�<�}�I�����ׯ,F�@ �E��{���(�2���7iV�y��e�V�~���(���y�L"?
���3/�=j��E%�G��޿��.MB����?��'e�+/�|U���¼S����D�SV��y/7��A�6*V����ի�����FɍG���i�FI�5��ȞA���j�?Ͳ�/����((s��S
�=��Y�J��T�����y�gIxGIx&ET�K���ˏ���W�ٽ�x���8\z�m��m~0�����*H���*�r��\ϕ��ry��"�����v|/Q���M��P�E���w5��[�����Iћ����b�Hi���S��������$?O�g��g��E�=�%%�,�Տ��%F��o���	�܁iZy�V�!N�Q%�0iF��쉩6��(PJg�?Wu/�� L;jnK��N��Eoš�ȼ�`_;���X�%j:�i����[��$M�u ���$;�94y�2F��0?�UOp�������ZEO�J�5�_n�{�����\Y��E�-RS�V�u�t�n��U���g�rU��Ĺ
�e;kkխ�"��������~]�y�����ˮR������7�o/zA�z8i
��Z6Y�y�[](+}�V���V��B���b����hy��v�t��e;8ڔw��;_&�^�zO��?;t�զ5{�-}���~X�V}U0�O��i�޳��5��zָF��j���BU�u3��Z��"��YgfV�t5�f\6�0�e�]����Ό���9(7q�{���N�t�Ql2�&�Ά��GJ�i��R�S/�Z��!@u��GgU���?��Y�'�u��X=�er]��V����'=�m����/��+[���5��z���
h�*�m.8{d7S��۱�ߞ��i9�ÃJ_;��zOy�l_+�h���<��H��
��׈�MW3�楱�4�z�0s����b�7;�2-^�Rn�r��/�7n����m����y�Ӈ�'/Ԏ��2��f��#ݎf�O��Pn��԰~p�yoi����W�#
Tw5B{�nE�A6H[�v7n���:��Ew�*�==x�W%�? �'j�kaUP��X�6�����lfy���C��d\���Q�5m�U,2mϭ�^�Q���|�
mnDM\�fjw��u=p�C����Mi��:�Z���D=�����}UE�N�#�l���Ϥm�VV�wj��������ԡ���:��w-�(I�lU�c����U�j���M�u��t�Z�#i����n� KS����S(ב�yX�Q�� ����N7�U��Jz�KII�WIz��,K�0-��*ds�`���Q+��|c[ۨ���0��=���z�<˟��v"Ke�F]Uc%��ھ�m��Y{c?��<m*x��5��8�����= �ײ9:۶Vܦ+�w��L��ʎ���e���?{GI���5���B/
+DVB���#��2�N:T�l����Wh�O9[^�g��I݁��͞�F��z�Q=s��m��5ZV�|G��U�)�Z�=�"zU�x�H�„MU��织p�p�-�6�#H՚%^�Vݻ����������d��|�	L�m��܋�i�#��K��[���~EݶV�J��d)s�Sss%��ܓF�<ީ]mi{|ڦ�4=�,���:�-C�L�^ELv��mq{�������lۃ�����//H7U��[��0x1�S�M��J	s��7x��Q��2�6�ޠ
ҩ��m�W7���R�b��������aa�aa��Y8|q�U,na���,t����T�k�Y����*�[�{�R�$ig"ϭO��^����z�
���1��to�Zv����w0O����Q]���H���mޤi��_��Ha�f��`x����x����N'�(B��ٔ�^iW����p{u�:�F-��Y��z_���A�u]����p���3��pN�z�w��q� �m*W�n���ڬ�wX���]��nW:Ԑ��e�ANyO�z�ǹs��������f#Ko�N��j�.�h������(+�W���k�䪐�PMS
�jGh8V��dך�ڦ�,�i];8�cK���T]�W���:����߂�m|�h�Vw4U+L�*����>�z�.���)�dl�V�K�:�:���h??բ\GWv�mKq�U�������V�{F��5m��,�?��6��T5�֠{W�m�V�_�C�1��*���p-)��o{[ε.KVzOM���ɵG_1�_!
�Z{��5���Z뾂{�=X-��_�������,�`��\o�M�&��3�mYd��LX�&�H$��G�����W4�f�m_���u�6tπ�z��UsK�P�n�FG�q�gѦ�__�oUd+�j2�� ����1�t]����n�(0����:4���lp����yq���eb�Vi\�u}�6H�jy�h�U�hM'���#�v���R�C��y_u��.���A�6�ngQ��ߪ��F3���Y?�uiҀ��=����L�p%zH�,�j��U���B���ҿ�wԼX�k�Li݅�����j�Q�k4����ͷ�|s{{��v�"͖����7w�=����o�*��?o/�2���]`���؆�NM��]�T��x?���Y1}�"I���
��c-��O7j�6ڨ����/a���ӿU�=�(�V�����=�lbe�=�A�{U4w7Q��N���]�a��(�����4����$؃_9�T�F{)ҽn�1E����{��DY����m����1��˹����IPDE=�>{�H�E���C:�{��{��r����m	׻�e�vS��Š�t��p��k���!)��jOGM��W�����gՀ�jU����G;�0��߇�%/�h�r�#����h�~��Ne?�~-�/s�Q��(N��:�z7���أsj�P�3����R�pOc~�G�2K��>����'�`>,���G�hO���f��{�%\��==YDa�f�"Z��uZ���1�6~��9=�d/˫��p~��?ރ��뜪���ڇ��tEbD�Y���h�-Þr��lg��+�V�]�{<�����%M%��$��I��ne鲅�_=W��^T�ۑ�9��w�9�ӝ��ի:_�C�Gj+r��(޳�W���*���+Y��(�=Ka��1VI�s�����G�l2�nOߚ�g�Щ){�&��d��
�}��!=�C�Z�D���q�{7@�#� �n���a�^[��~��{�ٍ� �cN�=�v�ϣ�[�5r���u�s��ˬ�}��1<ԩ��eXu�f�R��?�;��m��z��e^|����yA)sAQW�c6��Õg�o�R�j7�Lt���ҀW@T�,����C�
�y��3q4Z��V����h�Q�,���bL�A>W�����֭�~���wK�͓M�aLD�E�,b�(wA��
�ej(�`���s/��Y��jG����6-�"n�[��ٔV�RYX����h%�ȧ�)����7�,\ht��G�w�˼ R/2/�+�[/
Т6���ޕ�N+�̢;MT�~[�4��8L�ʮ:]�E
3����/yMt���l�����O�/�hm����
�n��0_�>��4�:��R���7�+��� <��
�~�#�V����	��o�߂�Ȱ�)$X�n��L��ꧡȯ����5̪-�D����/��ZB���W�׳c����Tsb3Ӏ]�4(�r
��q
ܮV�W�WT�V�8)~�������~a���_#�nB/ެ����T�J�F�jA��c6%*��	ѯ"z�&m�)���o`?�	��O��B�?_V?EPf���[[m��xX^���3@-����lS{��Z�2�26�-̶�-<�ۨ�%i�Z��U]�ߘI��N�~[�ni�Qu�XT'����OC�MT95Ipj~���W�Z��D���~�e��k�Z�*���T�ni��"\�ʄ�z��m�h!
]�W�T�U?���l��^�����c4D������7Qx;O�:��ߥw��+k����篔S���;��R���5�Skh���[h����m�j\�$��~�s��d��a��y\�Ez�ʬ:���NjǦ�ڽt9IՁط�_�������M��
�y�=����|�gil�o�(�,�T��<�d�ه���t
,�� (Y�آh
zH��	㢕���:��
xW��Ij�Ji���	�e��{�ԧ�T��.U�Ч�q����N�E�m�j��"F(��z.���~���{q�ѳo{׺
��Q����T��Et�P�&�,ϊ�����؋Hٲ��3}ȫ�����v��/�|�b��/e����p����T��\U�ڵޱYk�
����j��XуdEӌ��Qt�ކ������y��oqK�.�y��W�lI�"՝�|G5��GA��
'a�y�hޝn%RȖ��V��J�f�S_�G�gO�=��o��t�B��?��(�o�5á��7W�Uu�r�j����W�V����kd�:4��_�ǏT't��.�
A�۫�bڭ�M��]���#���Q����hn�ҡݶ�*iU�k��:�d�7YuԷ��~��@_����ݓʤ>y�{҆���َ"U�O����͏jG��[o�?�(|��	��gT�咽��y�VϹ�*kF�<��NV;8ړS"�V�O��7���BI=
V���ۀ�+��g�,�M��?~^�բH��&
¯+��(�"�~��Z���q{�'�U��Q��̢�"Z�qm���q�ڸ�(Z��e��d����*��?�����2�
5�jkLS���˹ں���Y�!>���&�=
�71R��Y�x}*�5m6�ۋ��-R��1�����4AQ�Km����/�4J���yE��c8k��:֩��2�ի�Q��P�K\=K�o��f����V�˙�TV�MX��O�^��U��I^�5�^����_<r5Ԯǣ���>����{����^�����O��UT��x4z�P
��|~wz����i]�ppl��u
Nz��w�/�z�8�����˓���zoO>��*w��bu��.�LU�E�������E������c�U���7�7���ir84M6M��z��?�����oʍ�r�IOU����.O.zg�>�jہ�&
������g[��!9jH��<���㪿×�ҷ�O�_��^6�}y���緯.�~일|y��i��O�vF������Ք�ј{Rv�o���ù�h�ڧZ�/O>��645
}�44�p���<����u車9$=���5�a����'��?��ޟu�t��������tK�~��'�x��
���w�����t��Z-�V`N5�b�Q"�x����rC��QS�e�\�p�bS��-�ms;ˡw�lQ�~�Y�[��T�L������OoZ3Y��(6�ނ�h��6s�T����������z4K�ON�*�y�Pg;
N��cH���i��4�`��#��s`�c���9p��\g��&=S�US�x���.}z~r��L�E寪
�Y��X.v\̴�����֛��M�W蔷Y�u�(�x�'gqT�d�r�OZϾ�:з4���x~��pUl ��x��}M
.����M��Q�7�8�B��
}]d5�ڜ�q�l�N��ZћZ�:�u���~4�k��7蓠�������45XI7���ؠ6���U�T)
m��	�;ۆ۱�:���8��@���T?��"��VH#	�u�e�{�`�����^1��|eZL��n���#߆F��>�y؍X���L��10Y��q�-r0�,h��j}g+j��ԠX������0Ȧ�&�6����7�á��~���M6�i�i���1�C�F��F��3E��6��A�6��$CHx�{k�DD��I�6s\Wrx�DI��5S�e�(`�/u�q3�wsTT%Ӟ�e��hz������fx�U\ơ�E14�J��()s`'�!f�X"��^`ѨN]���#�"-�&$�P�D���,�?�ޥ���l�� ��Y��Z8pS�;:"YfeHc��R�pAg���fƩ�B��Y�>*�P$��~�K�2Ks#y���P�U�l��١��kR�*Eʼ�1sS�ӿ�@�O?1��`���\�F��	�:�8_�16C{jM�2� !�A�؂�6�(��V�,���1?t`J*�;u�p¶q���!���%VB]�O$�N��'&�����Β2��V�1��􉃴8�_���J�}�\[H:w�5�69ɲ��t�_S\��¢�w)>����Kv�.e����t;Z���
-�.��l*�\�$����U���;=�4߇Y���O�@�]~:���t�E�\.D�����R8#��r�+dM��dӄ6�$�7�f<a�v<�"�)��B�u�Db�-���'
zۦUg��ٕ��X��޽6�C��g�o�Y��@���qS	�u�ra�1��I�%w��{w�-�ً��Zg������>z�*���
��o��O���'ed33���\��y�$�@&6���Y�i?���1�x��(,�w$�V)_dH�(��YT���h��+p���h���~��n4�;�9�f�~�>o�6�S�*$M�+V3�^��a���6_�?_�l@���:�����(�H�����X�WB��Z��F2�/5��9������d$�A�ox-c1c�_�NM!�C x�6@M�
�a��C#��X��^±6��#t�Y='�I�g2v�/B���`n��*�ت��"i�1�Z��#����K
k����3�P۴�2�zs�����Ͳ1���WW�@�3���0c��&��J�?�d�����g��I�"¶r���'U'��Y!ޔ��}�����c|h�s^�F��b��%����4���@Bg0���κPbά�<�`��i����K�^�j�#tJ����9�5x�_Gu8���	j�P�ʚ_�kQ}�[��^Vp؟�:"�ҟ��:#qn۟C�:�5�X�sV\8g�� CH��b}�n���f6�/b��'�1�Ŷ�F'�����tl��0c�M��"�e���s�z�*V=��6��Q���Ej4�z
r��f����щ�vzmZ���^Tk���L��!ZĐ/��<�n΁H̪x�\����3�pY/8ȃ�Յ���\X�D�,J@��[_%�����;$r���h35�.ߠn�Ji��a��V��E�n���D�T�3k��eKcoGn�;�2ͫ8E�<�-1��a����/z#cm>-��9�]fQu���>���q�%��+�\0QG=l>��1L}Ia�.�"�/vq���� �-�/��>��m�yi�����_�I��v�#�e����r��XN)zm�S�L�,�"�J	=\G™AU�X��ƻ�wGL�"�0A�=�(���@R,Q�`:�&��cv�̩ p�	�(|�N^sh�t���_�v���-�5�8xx�K��+o�BR��N��p��0V[l���Z���:W�g�b���̬�bo�%Y�;�������5�\I�x'WR��cq�	�.\z�*�Kl��T��ȿzQ��FG:v��E�7��Ϭ�lC��.����ܞxg��Q�w�w��+�,��4�Pj�'��<"�M&vp�p`�>Ag�CF�ӼI@�a�	�u"�SFJ[޷QvO�+RE4�>;$\g�]�d�hХp�D:llՑm�2J2�8%�j�'�-рNM��@���
��(�7��2ٲ�P9�Bc�_�Bw��c����&��NJkXw���*�ۨ(��C�!������+�����v{;��@t�5�Y}��Q��6֔��aM�Z��E�֟�y�����U���:�6�����ePRZU����m��{0�P�*�E[���}`���5ܮ
-�vՖ����9����Y`�,uh�暼���j��w.gh�AY��q�;�$09_F�ߟq����Nű�{��Tl��S8�����>���h8�~o�+`�����u�"~z���2#��:�3>�3�����k܎��0ٞ�w�,���a��!���Pq����:�Yc�:s�)\�!�	���:@e�I��8>�0��������Q����ԞU�#����>�R)�g�L��fT?�jfT��#�n} ��U�K�4Ļ��y�%�i	7���!
�����P��@k�=�l����x��=�m"��+��xBPV^`��M7i&��I@7أ}�=�� ��W*�c��,�=�F��C����t�0��{��8<{�l�B�:0��ń�(B�s�9����"FS?��2�n�fyL%�|
@oaʶyes����`}�8Ȧ�>}�5��J�f���g�|*idDg�E�8����F���XQu咃-��#��*";V>�B!���WV�|.�"�=�QV�{b�m���;��/�v'��tF�q��8�-;h:�B�R5���;�����%�0bP�Z�u(<��+T�!NS�ӯ���0��q�d�0]��F޵��`c�>�u�3�,�i��֕T'��%D��e	C �dwL57�ӟ�EŨ���Z�v�V�N�*�����sGq��S���$�RU)W�5���|�م��3�@`��5�g���v���l���M`U3�T��'4��@g
����T1m��YVOm��a�ʬ���F�;q�r���}~u��\�',�C��?�
��{weI��Bp���7�?�k6!��:P}��L��]
3��]�io��kF�m�^Z�� .����1B�l_I��}H8Ζ9�s�1^���qVa,��dκ�&#�tDLƂ�
���M�e�eqM�Δ]%�p���c ��κ`N�X08U�
#��s���3C'F��)�2�YJ�c$�Y�Y����ʈ�3�Y�:�E�GQ�cYƑ�MBe`�A��X��A�$"Ym$��D��ih8o��Q:��5����C�
p��ueJX�v	]�_},�NH�����Tn�<C��s
��Cs>���Z��q{�c��,�'�rij|��l�|�����e���9�d��} *�
8VmdK}O#��1߇��9|3܉2�l�93�?6�S�/�
��	-�e���wz�m� ���33���HC67RƦ��O�ò�[��a��1��ą����h�gt�G�?��4b,䏝F�X�ď4��O�ˌ��?���4��~���:`)�	�T���O�����/�~����Of��ƍR�̎��rۈs🥋�������Ӧ�fi������+��><��{y�	�������<7[/�2n�2x��?#huGp9d\�rz�0԰�����=$�{�yV���:P#Sz�ó��&'��;A��E~�@'��P���	�WO`�<��	�cO�H�k��ކ���4��PP��Q��>��8��0���Ev�c(�=DHYAMSl�dP��s� ����-������,bWX���[�P��ZZ�PBq�E�oO���O���7�~R#ڋ�>
��mhF8���:(ѱ�h�r�04cK<lD��G�%�oCnFjA#��^a��'�l���ɆF�0�o� ��ћ?�c��F�����S Ό`������ظ�������~�u��Cg.2�s�KSua�cw�Q���#�Wc7�<q�8��:�D�.�!gy���X"`�5�L:$�=5�(th�x��8��25]�r3�^UB���zni�[��N�癇��"�W4����qU`Z����6��F�bn/�f.ϣ�O6�T?r8E
"b7�i@Z����m��T�djC�yȯ�-W�4�»ҔhY4GOz�l:@�
�=�s?J��!�n�@��ݲm�_y�͞▙]�;Z|�a���+��������^
"t���~CCz�4ձ*:&���A
r����O�?|@�����7���
7o��ғK�_��
&��CKGH�w�M0@�]!졠E�v"n��t�w��#x8C�?~���	�3��ϻ7�l2p����g��gvޔ�3���[é[é[>é[����N���΄��=ؙ�x�_>g8��i�������L}�? ��N��4�z��>w���|E��ͮh�Y;��x(�ǰ�X��7�F<�F����$&�����$&����
��Ҿ!5b-�!5b��!v�g7���l;�&�a[�W�g7�u��Jdz��Y��1��p�vޚoq�rb��<m�������F�W9d��T�xF��=��B ��h0v7���6f!���o=*y�E���Ny�
1�ة9�2T��M�Fp	n�=.y"'�~)a���)�"�F�b�\��͐o=�G�{I��^B��Ԫ/�9^�2�0!=0��ya�����m�����\�0�l���x���M	���耙H����Nv4��ȏ��fjL���xPބ��s�~V�Q�D枃B����\���!ee6�Oƽ��hP�Zg�
y3�Z�d�
�]$b;�'���%������s��x)��
ʼH����q�Ĵ/�<���I06l�4x�M&V]���OyGO�`���1�ٸ��,�9������T��'�}�sS��\���� 8��GD�Y�!CZ=< �����$X��* eI���.H�C��2P=@�2���h/|�7tI?$x�	P���D"p��G�Ύ�����I�V��F�ɕ�H��m�z��%������R�$��
}}�$��d��f��K�-R��Y�
Hp�,L�>�Й|��.�eک�ۘ�0 �׉�B�o�>��v	U�f�ܒ
�P&6F��Zp�X�܎��T#�O�J�g0�H������z�Bo�Q��=�������*5Yr�)^w�&<�h�ͺ0~Ѫ�����"ʡUSd>�7�"+ƌި�pW>~y����@��=�#�	cs'��և�DK�X!
p�GXe�l#�;<�`Q{(aC���܄��O�;�wR-�*��O3���s��RctG�i7��f�ܘ��w�������MG�HAe���qZ�pbZ�Ev�Q���H��C���"�p��&�B*�ݤi"L�?rPH�K��Y���Q&nA1pf�
:�˔P�;
�� ��^HTx(�g&01ƃF��W�L�39A�b��znE}�hI�_�%��G�
O)�,��d�2����κ�_
@�]h�B<{�!��!�x8�B�g0�!�Y�N�j1z�;k�߆!�!�i��˅�r,��.1$�((o5���w�=�B��{���f�Z
�)cjtLP�(*�/0��Hy�ȫ�s���q"��`d�~qU�C D	��e~"b&L��/?C���P�$�\58�m��{(���8{���'�sc�0"ᵈ)��[��5GP񬢂���"s�d����R��_#�D��b!0W�q������K�h9��g�8%������\��}�ݢb�3�h.�/��u`HĘ3l�f�@>Qx�״�HD���p�	���KU�&m�'�]�p��g����&��`�k&�B�T7Ax����b&��@�	� �*ل���-|������
�6.��c�Iڮ�}�u���5�<��
ab�C<���ȝ�Ϲ���(��v�y�`X��܂Μ`c{�B�!�%t��Q�X &@L��9#��С@PF�ZNC	�9�Tˑ@C�o�T�c�'T��!�+ط>ͧ��%F�=���o�\\�/��;��-�1��D6��z�>-\H\Zo�{��,����ZO֛�G�$DM��#\{Z�	c��k����+QT�"&�!H�ˊ���jD
����`��&�}I��J�Ҷ�� ΍,����Rm��J⑎�؅c���(h���r{&�P0��f���U�c0�v
��H�Y���v6ˮ|�e����5}p�u�K>�p;M�ik��	���3�7k��)���,�v8 ��md�.�z�V>�=:Ʊ�vL�md�u�D�H6E���0[��&�
K%��x#�T"W"l4{�EoQ< �Eg�^y�(F|g�+/��!UÁ�C�+�nj�{�h�.�Q�w%�La4`*�B�,	�|07�Wa�ӎ�m�P�U���@�JJE��L�[C�ȾJӫ�S�X4��(W�Ae�m>t��`���]y���t�_݋\�^�oVH�トcE���:`ch���}B�u��-�8��H���̶I@�D���d4#��/���D	����;�D-��!�(Y �>
�>t���Fa���Q n���9��IQ�S�c�}4C���]ʜM���I��l���=xc��t\M�
��@�XԚ�IDCD�+8%�N�FI�^%1ʣ0'��/y��~��xU\nk���Vf��!8�P���x6J����)�m���)��Ѷ��u�Y�:�;f	Ñ��U��d�mv
�1c�l��
���bĈW��<CFmd}�O�`�!��`���.?	3��i�w���'=��{gȍ��p%?��w�_#�+��hu�(��W֧L������ㆣ�e�K%}:��IkF�Wb�b��#'�l9��D|�n^���SG�!f�c�X���=b�'��U������!���gڇ@���U&>~�C,^ <f0�00!AQ�6nc@�˴Y��8�B٭�3�$.�7l*�O�!�1�+M�F� O�^%hO1Ş"o4<8
܂�+j��z^�`z�;�;�x.���n��œxnf�O���F�+����
�����UcJ`��I�1�]�	�'�b�Ii�l��e���0.���b�/�䣃� �)�aʜQ��8?��S�:��u�<hq�/�^
ߜ��,��/Q c�>£�J8b��gz�&�*&����wh��2ZZ�,ћb�+ۄ���l'��q��v쐚��P���c�H5����� v�w���f����!���8͘�"3aLxM�B��H^����*E@Jl�dA7[��������▐����f�������0ڸ���1�&�~	�,҇?P�Xi�U�P�Ѡ|�Xt`�psv��˯A�`/^�%�|����U�Br�J/b�SK-$D�z�|�lV�r1��t|�s|����8?e5��/U1����G�����B��&ΒS��e�G-P�Ô�@Ǖ&q��!!����-_�P�o�;qq��(*2լ;��G8p��{�X�dEJ5�Q�=�`�3Z�y����p��ݧ�AF�r��[�{쒐����v9??o����!`8�L����	��i:pr�0Nև�K��7��Y�y%���3 �b��U�.����&6�SZ;��+�&T��/�+5���8d8��j�Y �K�P2�mw7�-WAnX�5'���q�
z�7l�@N�#
^�C<z!0�3���g!\`���Hi5%�\ca�q0c\![��-d�ǚw"��e�>�����z�L���`8VBJՇM�A�κPzmiD�Γ6
�s!�P����HBg]0�I#@Q����{Wzu�X"JB�}��4W��$j�l�_>\��WI�:�$b㪨c���h�1�z���0�u���
��u�'�9��i�D|��I%��HQ��AV\�N�|��s�R�j�@����d}Q-q����?���'!��`қ#�a�Kى���C �h�<֔��>��!�ݫ��₫��`����I(�8��b�I�ye2�7���3l��:`b_�����݈��۠D/�
:B�=py��o�a8ټC�y��`BiK!�%Mq�!ܯ�&�L���f��s�>gTBf�����C�p}I3��5c���f5D�bHN8-L��wU�I�P�;�����X�[4s�E	YI��A�iE�7��l)�E�Dt���a��ԁ����2���Ò��S]�2C����&�ҕ�ŵ�V��;�N��K��ܧa^ą�����'�B�p�P{�}�.�~b�E+	��ߩ���%�����o[��&B)5�&&Q���s+�Z	%�Z���-x���1%�J�?�E�xD,�l5,m�X��q�k�HOUP�$�`�0�+��7.j魎n�LX(���-�
��YG#�:��6���8���E�I"Jz_�xdh5�pr��-s�����L~ԡ�_;�آ�5?A���0�ą�Q� ��!���
����6x�l�,YxW��{�wr�w�3�%�H�S��Dp
����}�ˊ>���̍���,.�&��,��`��v<��k�Z��OA�\&0m�	XO�&@��X�����%�FnQ��q���^`������F܂�K�)�6��)Ěu�.ڴOE��]_���e���g��!d�N��#p����$�խ�&�A+�(�lIr������4TJ���IK9U�����[A�tT�Z����C�Pڀ�O��:�Z_^�߃���v�����K�8�@\*
���g��#��}���)�?�T]�xRN�e0�{pP�r���t�*:u?�ʧ�0r��(ы���ȻJ9�����Y��R�ik���51R���$zZ��xk'�����, �!�M7!=����T>ۉ w(�;��p���pRA����#UYbͮ�c��\װ��ͺ�h�Yѐ`FYc[�W�3��zη��#�]�ű�κ`\F�)������`>8C��Fxt����څ��:���#DքO:&��Äa3P��\-?L��G#8o��
��mj*��!��EMf������ǽn�K��!��#�}c�V0��7N�$_<��Y�g�*}�XV�(�g���G���rz�킝�K�2%]v�t
&d.U�"���W��OO�m�(:~
.J7���t.5f&���i�<����5t���'�)n�LGf��V�W8G��O��$hL�Hg(�~ybS4'R
�c!��$�ɸA}g��o%q�߼��nG�:ag1a����
��Q�Dz�1�D0(�l
8��ə�qN�b~��D�ZҴR+�����b�f42*/�P4�)��.R'b��ʌl<�a6�X�BO���ߔ��;A�����i��}�3��D��b���k��u�a��mIϝ�S�ʵ�+�.@���&
��!3	��9�,�܍�2y�0��Kƶ�D��:8 ��T����C�Y�&�(��2��EN�|��%�"s3�mF7#��!�1��GcFЕ		��ȱ����!#�*���J�3��R
��U�C��U
���JF\,	��
��n��w)Ј�K�p���&��`|��g��KJ�R�R@&‘Y�Y_�?"ߥ�M���,�(�R�� �W#P��ex�DpF#�"Ea@�C�ŵ�9c�VQ��M�>�A��y����y��`V�:�[��`�^M`�DF:���H���Y���S�U���>��)�.R�@	��"�D;�&p]B9�Pto����ye*HLȘh
�
j�ѭ�L�O�<�1�~t,��h%�b(���?���d"��������O�"7f@�OnyA#B��rj��+NJ�6�!�Í�lc��B�e�74�J�Ƹv�2�M��fO�J6�S�\+}Za)%��N�!x��;���t�)�R���)�(d�C�
���υ0L�)ֹO[�C@yGsL`^�}�'���� ��b]�7��T
o�&f6��r�5���Pb�C,�j��r�
F���R�s��9[�jcF��*
kK��<9bجl>$4D��. ��z�y0aT��!;~bn-Ԉ����t��f�'��W�,SB���
�jGh3_���4�%=�4�
�b(7N��TdXz�������pz�7d0}��OpzF+`0�\��4�9��r�:$�|�
r�r�=_��ڥ�k/_�R`���Gi���XG�v�N��=�RH�g0]6��
�<]��(�2|C�D�!�9ڏ��(���4�aT��P1�u|�_��p1���	���78t_��S�C��ȆY84�R+��Y�(�'��'��x����X
Q9|��뻢_���t���=�c�ծo��[�8�C�M~V��C��̫�R�� w(�&`l���;TBc���)��E�L��0���/�	0���tNmx�s�]��sJ��%��4�Q�n�(�J�W�ݝ���A_S
DS��$����jK�s8q����D�X��ƈ��'��pb"P[R���w��HM���Ђ_n��ϧ�9���C���Q1l�b��Iz3)d�y,N�;b��c��Y�i��?n�k�wSI�6rƲ�x�'��&1c}R,+7Q"x~٨k���y9��ݬ�yɃ w(4/���.�X�eFТ$
��
a�=�l�GM`_ު�3��%D?ºVx�x�n���lm��@��.�3¿3*�W��8�)˜�`G8O.�ݓ��*�B�E�!�Z*�"�o�?xw,�=����@�8�eߘ;X��F��w(�@\q�'յ��4k�`���������*��̑ΜP��%�.�(i=%He��\i�3�ttʋ[�
J�@aϭ����`�(�6��-Ҝx�hY��`+��*`[�� ��űo���+A��ؒM��!���o�D�4E��eN�iV�C�:t�(v��
%V����F0 x�S��"ۄ_"�#\;(:ۀ)��nA�D���B>Q�g����!U��tz��Zh��n���S����w)N�����w�I��U
U��ې!��i�_RRF�\g](�\��ɸ�Y�sD�h���Z]����4<��Y,>�i[�[�pK���h�/����g�и|�ɘ�R��'�f��y(0��,��ˎe5s��X���8�E�q޸>4G�m��'>!g�5|Lp��3�<�:B�Ii�˹D�7:&���/����(1�`�	��̆T�c�0����}�[×�Xh�`:�1�M)���>�f���;cTo��3��|G�r�4��ؑZ7r@����$�"��QH�.$�PI��=�z�s9w8G#>a����a��*>ćt�3�E�~�(G�C$�����Fm;��:T�w�/�d�B^���S�QP^���U�*(9�C$a)�^��!��oB���!XaA�����I�V�u�F�G���t<��,��V��'�ʎZj`;h�p���%Z~��\��rխ8�E��m����#�H���
S "���q�[{�����
9k�j"'�6�@t�Ș�;>�������y`�r'��j����?vq����,z(񎾬h��],*9\T�F�i$zg�N<�a��o�yP���XM	�;|��.\��DP����Y8�:C	a�)gw���1lN�5ut�ܻ��=oI	�9��A0�u/���Dm���|]~L�Yf럑�=|i����5�yߑ���{��!�q���/25���H6;��`d_~��\q�K8�`��"hF6_l���8C�֧�� Ǘ�<�~���5_
�#��mB`ݻ�z�H9sj��äx�L�����ϪL��_ѿz�괩F����>`��ޓ��
:���
��	`�F��hR�[�3��
�D�l����0j��nc���N��=i=~�}��M{�Ѝ��Ӷ�$��V����{e`�~���頕�1`F~�e:ja�����N���󴕟ɌR�V~�&����;�6�턠��� ����|j�G���F~Ѓ�v\�p�^���&��>>M�BA�����z+�~�(��a�)��|�郅Q:K�p��4n[I�z.)Ȥ�|P>}x�6��ϣ�_oy�,/2�:��
]�8��y��
��o��(в���=z���EtW����Uo�f��罛^��o�Z(�����g�e
���(6�~������ы4[~3�N��y�ܦ�?o/���}����X5��^��N�»H��T�����0k�~�m-�Ǐ?zQ��U�����Y��+�0�Ey�����_=e��0�p�.J6e�T�����jӴ���*�'<��Í����մ]��_PKEePQ�����D��#pip/_vendor/html5lib/html5parser.py�}k��6��w�
FS{�ٕ�Wv���۱��?ʞ}T�q�r$H��Ԓ��J*����I���=Q�<	4�F���htϋ|����պ ggQ�\�E��e��+r�~��Yr��I���u�L�9K��qZޛ�U���]�l��2�"�l���lI�x��e9����$���=^�ڮ��0&��Y���UY$^�����d�O�0+���|��3R�>M�G��$��۸��!���D�g2ͳ����o��"�)W񔼼��xJ�OG��$��jE��?�R�x12M��UJ���E$�%٢~0��U\�,���zEU�8���,^��}Q-�7YEE\љ��'YU7����ezB�T�2%��k]V��$��yU�9������m�R���
���~=��?���!Vx��}$��(ɫ/S��n�;�w�ތ�#|<��ӑ:����>y����I�&�����Ţ<<�F����Y�#
u
�qd%6:=Q^D�$%�4�$Q~�/2�"�����&�!�#
�E����R+�B3@�2(Ly����d��S�:�~�)���r�,ȆMxQ� t�g�"v}���՗x�J����ٳP���|�_�V!�������
�==�g�gOW�N.��CqO��=}�^=�r���S>�h}�狪Z=x��l&�'��X<x��w�=�����Gq=��͜�ӯ�{����{b��J:��51Y��~�~�w�+Z�4Cߟ�����`��V��%U����P�������r�5�����+�K8=H_����?��R5L��$�OZ>�c	r�W�$��OϟUr	��e�X<߿�׷�ޝ���������o�>��]\+�!���
��lF�9���:��u6�m�/|}�
��D�
>��,#���!��
�QBDɟ|�L+�|�nb�ɽ��'%ݺބ
O�rhT�O2���1%CY{�$��k>����n�8C�޳*�^�j}�L��Z%>YУI8��y�ا���C! �+j����%���T�8�)H�l�!��c�ϣ�*/��<�R	(��$�CllR���zޓ,��hJ���=~�gt4�Ӧ��k*�f�;��c�
*$V�ƻ�x��b�"/�4�L��F�#�.b���4:w�	�M"X��(�EM)�?�zJ�E�TE�^\h0$sj[�H}��1EE����q���sRt�P�E�i����*�@�9Kp8#��$��S��GK���2��"J�EID'@�3t��D5]k�x!�q�Vst-$��Z�UE(D|�Za�O�PAI�1��6�9N脱��4��Ww�=����IQV|��Yua�Mt�k����>��E�����L�zsJ�aþ$�c�KZ���=���8}�3�9����C6t�;��5H1ι��|T���Pl�(L����	dt#
��#t_�(K�,�EBg%[����H�zK⸆��E��5cNE�0��1B��Ej�~͝�_C1JF��l��,HI���b��[���a]�ѭ��:j�F���	c�ᵲ!Hڰ`�\2����Nb�Ι�"��}�SX�yFw�50|\�5�S���뤸,уh�&KJq�Hy���9��U\qQK�+�&(6�{ ���X6�u�ł���j@�%#��(��Q@233�'x�A ���b?���x�Z=>��R��r�o���ђ�`")N�J�m����SW�n��
���lBAV+�0�{:8'���?ӭw��S���
���r�]\�o�$]�@�*s��b�.�Q�jK���h�� _ӭ��)5��Wq���1�t���4�al�*�K�U�
�/�V>������U�0���A*`�{U�+���db�����`�4�@i@A�ya"�
�dY]㒱#*~��6c�=|�f����U��	�'
��p3B�/�іb��N�@Q:~�d��y_�}C���	��xf4tu�9}�y[|��(ô��^paU���?E@��qF���T(P�jf-��i��<|:`��g�p��ć0�&�Ŋ��Ѩ�p]��noqV�ty}�e>?��F��+4Raf�Vi2E�0K�;�M�U����HC �і��/3v����Y�ҍv�}�)y�>�@y
d^y�p:��*��~��gQ+s��Y��S���f���R�e��1;��^)��ϧ�d]��+�0*I�@�r��ߪL$z,�s��V�b��`��[��Tj��[�{Q�.�Y��Y
�:��g]W��Vˡ��g��NǏ>K1�z�����]͍��
��
��	���eC{������-�>6)�myc��,9T�Ig�yT�
Z�S���,��_�PU
qb�-��S�
��x{��-x�{K
�r�x�V��h��LSi�л�0`C15:�i���TO@2�ϸ����O$-�n��t���-f��"[��%�8��i�B\s�䥇��>�����['P���
�:����j1h1���Nr�ގ�-�;)�E[2��C�����=?P	�^��������U�� *փ���P�(7�AT�m=Z7�t�:�}��;5��(=�d�;5�J:}��U�Ԥ*/�h�WW�4M6~��H.�X/ӼD»ށs{j=�^f�&%��Y*|�mz�QVx�'�1��`+S�%�C�q���lM�覍??3�w�u�1�_U[���DߔJ�ќ��ճ��~�z�ZQ8~�v.^H��b�c¢�bH�XaB�&�͆5�ICmO1�J~�ڰ�$s_{�K����
���Ժ�ˢ�{��Z��O!i:fG}ʁ<|�Am��,*�s�n�gp�~N�I�N�'�H���8�
�$�z��,�e��o<�cd3Pa�n���I��3g�yBf#VO6��Ѡ22�q�&2��E��^��m��K�=����8n$pFǸ�9�)��œ8���r�H��!�y�����;���L����
�9JLvq_�Ϟ\�8��V;qė
?�a'��q�@v��|���F�E�x�8�,`Е��)�DNT���1T�X���|���)�x����xp�\��9�9�}�`yZ�=��d���__\����uY�����g2�^�w0����י8�TI��Q��AD�#�'3V�XƗ�If3���NT���>�o����QŽC��3t��WTBD�Cep�0�0~q�}��Cm�:��>G���ըu�F?#��6X�ڪ>����b5��Z�kCa5`���k��J���#A����q�i�:q[g���t��#�$��A����?Ô~�]oK�D��!�2/�tч��)�N'��
��ts�ٙW�2��3ov�1����C�ZA���5r�nPT�$�'�]�j�޾������]��}�7�+�{��@��i�&��<ϫ�2��O�O��,���"_�x�<]/��� ��4h�����J=j�[q��J�������'�О,Ps5tF�d>+����g�7e��<�q�a��/�tf�x�&~n����|8Qkj���
P��dz���2�Yy���"_�3��r��_n� ��V<>x�Xź)�5��1��0/��a�T1���#��E�j���
�8�dk�h���vu� TӤ�q*�|�l�=���!҆a`�
���o�oAB3����Ԩ����;}����iD�>?y���󿟼��	n� I��r��bY�kl�x�`xM�kph���y�O�\'Y
`0���~�Eo�N�Q��(�	�p>ؖr��i=���f��&K��i���o�D�	O���*.��/p	XC�泒;����͊�T�`�J�`�<�	��U���QtI��{��Q�ϐ�ȣb�YS�rS?�qZ��|�ŀ���v��&��J0J��<
��p�DϢ����Z(B9��>��9����)�>e�����Ͽ�U�V1�^R�H��!~�w|���k]���
��Xk�ֺZa�γ3tŧ��	m��W�:N���'/��	�`㮓���xqN�5������C%c����z���QZQ�sO�- p+T���>���2��~�y��y�X�v�H��`Lp�����>1�;�F,y�E8WP��UnvvV�yEɑ.9�B��a��w	�=?�yI��Gϭ؃C���d@v_�б�H��J7���3���蜮�+����2Z��#C��)G��]^�&3T�@��[eCu[T	�I
ރ��4߀H��5��nL�΂
Ž~�x�}�� ʯHQ$��&nr�B�=~�C���I�p�T����BZ���X��P�~[ZQ��"C͛�
�<]���r�SZb��SJ�|�gT݊p�)s�`�I�����-2��*�WSxCq�k��1����
�4)��4.�9-�Q
�ʱm�F#��ZA�H�W�.@��"C�b"aЇ/?li�����Q�d��a��KJ�����`�ۂ�UT̅W�V3'V�!�h�M}�>Q��d�DѡM/�V��J)CUUl�[![�@�,H~�Jq�5A����ӑPf
G�`�I��Xg�W�\|��-a���Q� �p︭0�K���t�SR8`:j��I(
�Į��N�!�7ӽ)���:��t�J;n��eF�@"���F��M�%�nX�/9�$W	J�*O�閮�l�/�nهm��7H�߼~=;��N��NNV�j����`&�q�'�R�47�r���g�ĔW+կ��<���QN6�ʸۡ�V�D�������򠬣$�9ۋ�{8(��Q�eR�-��4@��1�����Ķ7Ԯ�s_W�=M\�6�,���OCE�i�b)>�
Μ-5��4,A�w�t_�r�'�W跍��Ƣ��m[�R��bA�؋[�P��iۉֱ��L���u�	S߰[_L��F��s՚*,�]Ea�n�O�	V?��V_��uѯ��tN���B�y1p[��C-(���V��L']�n��}%�hp���Qnm���e�Բ@�����b��R����1��:��+h��\���e�%���%�)���JH02�P��$�*7ʬ�c��+9�Ⲏ��ԙrΈlS��z
q�<(�tI�����	wt��x�(z��w�<|��уM~�����*.�9��L�d���2���"�hH����^�$��+�S@)�"i0&o�ǽ��X�4��إ}����t��GCO&��9N���^�s
6_��՗T����}|Yv�c�E�U�;�����/	��L����
#1���L��2�������*��G�4�`�{�~/|�ؓ����F���Hi�r� ��r9Ya5�BX��|%����$�=*����n�`p���՗�� i�%.�޿�1E���J3��Wpb�d�?M����?=|ttT�)`�����Ҕ���y�P���-��P��@`&������ݤ�r�Elq��PjԜW����@r�ԉ�7O�������ݹ.�NfE<�9v�@�ƪأJٯ���"�Aا.jGI莦ׇ��"�����?=��Q�k@����D��<	&�\�&�n�yE�B���-�_��i]���Z�1W�b�A���#J�o��'���sbܓ�"�G�P�#���7�UJ��E���8c��E��JΗ���:@�\=z�>ě[��j�&�u�1F�fFU��O���{�p�=m|;�؁0v!���eT�4CF4<��Ku�N��33>�f���-F}���]�掹Hg��tv�p�M��/�j��ʁ#욆���űqZ��]1:wIz\ŋ��6�{�u�����I��;7H�sV����~�V�c�0/�R�qs <��Sb���H��bP����|"R"$��u�{8_��
��Q�p��u��.Z7`�ع�>�Ȃ�e Vv�w�1��߈�`����Z����1�o�
�����n�`�op8f�?f�B�!|�X���=�nlj|��c��,�h+�����t���.���Aҁ�^�k�犛OVx�F�2F8c4���0��i�}�{�,If�*�p��r[S�4��{����F&\��c�Nߘw����&��ʆ'�jg��L���֠�Nԥr82�0��ȭ����q5s(�Tw[s
�t�V32���W�i���L�>=���5=���l��Pl�
g����;�]k���c��rSQ��,T��`9��8Ϭ��=���c�]��g{g�*G5�`[�4-*��u��t�%����b~Ħ��Xh�~�늝!_�tM�
��A*��q��x� 2��q[��� �9q���h��6�1x_�WR����WyW����)�	N�q���[��v.��%��D��n�͔����0�O����gEeYLy�%��!I0g��C���tB������QDΝ�Yoc���?R���ƍ¨MdƏZ��z��͸\�Lm�ɋ�r��i������[���ъ�2:aMR}����5%�7�4���	7hd*���j�]��z8�IR����!��q�_m�]΢{|�����+,�A�)�X*�D^�DڔQ�����Q�u/��w�V���UG�j׳ۺ�VnЏ�6��j��O�Ԇ��ۚ����G�-���33�Z�pAq/UMbpa&H=�%�qa�Y�ʔ��k��!C�0{��_qS�g�y��D���	E"�a.����
� ���Nd��%m�ĦoU�����v�χ7�vV�O(�p�0K�%:vT	�R�й
X-������{��V�O�r�$�D]���ӝ�/J���B�_S�V>���8!)�Y��+�C5�9�Wh
=(�R��W�tz1��g�uY��8�P!K"��H��Q�	M�f�أ�ܥ���T$�=!��p&ئ�3&����Rn��2�PM���)����\'i���$�豭�!VƬ��OyK�k�KFޗ��>g`n���\�AQ� z��^͢�`�<�/&�$�Y`͚oJ
��(� 
����a�>P�8rr3��m�O�:է��P�K�����s�5]����a��T	�,Z�P=2�,��*���yXPg�Ep�[j��$��z��/{�!��q���T�_nnj�x���'|[�wt5C��Ђ�qN��/�1|xl[Þ�%�ˤ ����mĞ���͉���7���Q�K���Π�^���K�k�#T���t>�rg�U����c�r	BX��g���-W�|��5��KBػ�lW����[;��4Fq�Y`*#HbP��1�:�<]��,�xNc�NLu(�P���۱���hZ�?m�%��N!P�B6s����6`�#ס��J|8�P��D� ����8�`s�X��QH��|�.�>����U1$�kH���T��؟ǞT�XD�X���'��4��{�\Uu�uc3��?���l����8��
��Xr��4�Zv>��%:�����&��+�۸�4�M����
K�6�K�iq���M��#�\6!�e�:��GO�Ґ@�Y��Ǔ��b"��gBdAp;�⣴S_)�x3�_�]E��ԄS�$f�K�*�W�����G��ϸ2��/#���A�.�]�;��"�s�A�S�{BS�1�|��w���^?��W�J�(9���W�ȆJ8�>"�r*�$�m`�bm���� �F��4)��1'��pBӮ=���|zI���ḉ3Lp7��ӥ�'Uƺ��!q�!�Oܮ;�1��(��3��l྾��-$�V�����>2�:���Е����>:�<�y��dYY�i���b�Q澅����UocU}ц�;*��~H?U�徒n*��.N7�Ā�Q�NS���&�@0��o��ʼnmD�h��;E���x�\�J��2Φ6�z�1aQ�rx
nj2��3A%3��g鵘��[�A�L�Ӧ�����1b�g;�B
k��`j1�myC����ʐ�1�$��`fCq��j��3ç�f����͏�C77���y'3s:�F�~�rCt�
U.I����vS��B�ݧ�Я��r�Z\�y��3OM�>,�p���2��s�Sr���\ێ(������B���Ӕj���U\$T�<�uT��-33}���+��4 ;��o����oRCN�����qtg� �J�4�םk'�PM.�7zNg�)�8�zqg��$uv����}��9�^����L�m���oiBg��|nV��%�%b6k/?3���	Z��^�j9~ZA��v��˻�CԶ1D�L�1�ޤ'�(�?a]߅�юE��0N���id��"|@�ͬ�6��lV@&A��䊙�\ZGݭ��]�X�Zw�V��ꗐ�1wW	�w��6�{��wn��K����u]������b�O[�H؇T�7LE<'�_91�x�A<�P�@�
w<>A�-|~ �w\f��b
����>��z�6Q�.~��گ���;Qwk�w.�։��o�v�9�蚈Z��k4Tu�ֻ���g�g��f��p��E����>�-=}?w�����Jr�����^	����ܫ��e�����(�����s���e1–Wꋶ���9F�`qi���yE���m\�{M�{��{C��m��̡���‰�,WwKJ��]�4�^�?����ذ_�a��vҲ�o�(bE��,�˓�͈��z�z�?�q7`���}>0�
���Δ�f��)���)��$��.�?`�1/�1+�rRf���E'�<�mD�R�m��i�O������ޑ�Pn��֓;����%�L�h'Gr�P"���f"��91���7�����V��zk���h��7�>�=��AP�,�?�|���ߔo����xFVt��1�K�&�88<�q��@�3@����<�1q�̀m�5�SQ��eV��Ax\�?Ҩ����֛���>H�4>'�Q��F�c>���'�Z�k&�6�\U!��J���!��� �Y���Jt7<�#
J����{���%�n�bVR�bI�^��������zB�SS|�?�i���X!�P�T�^mm��J�M~'3�j��m�Px�iQ�h�5s��rA���ʪ�^��Ч��evͫ��8r-�6q�Vo/�X1�5���׹`}Z�xUY�4����i]-�`��6�\��w|0$�/�D����!p$#taxbH�0:�!�z
���Axn8�-._!��~�l-Z隬I��>Q]������0����4����˘�َP�t��~(�jGH8&v�w'8�ͮc"iJ�̀e�5�1|#�i*�v��>��������[�X��t�{�c�3�FXl��=�ݽ����u2��x�����?>�^�`�hC$Yd���
�E�b��EI���ӗu��Z�ʻ ,����Hz����A{��8�:�.0ds}�\�ȿ������L����M�u	�M��[�����յ��5���n��ʫ�otM�6)W)H�e*=F�u�����s�2p�/H� 1�����K^�W$�5p�d>'s���	���H`~�?~�Q��OS.1`�Ԕ�Y��?��4��b��#d�~�յ{��۷: vW�2�����G=Qg�G��#�b�~�s���„���g�G 
�ٕ���oq�/�G�3���Ϫ���j|�P��.����M}
�� ΖK���黱$5��aگ�>��6�4���|��q�
����5��n3Ը0�����
˂���@�%�B
��]�߁�sAJjk������\�ByCJ)����!�������-�/�n�-�y@�JW4>..i�)�Ǿ\��bDW4�:�R���!0Ȋ�LV�F�x��(^Xm*a��W����6��C�㚵��D�h�̌���K<��()(!Sn\q��#���pO|�����=���c�{
V��g�ֺeq;��8�֗pOR��<��H��7�����eH�-9H�徣U9I�H��
?�3oo�,b���Y�J���{x�v���o��6�cX�vk��vڌ}���*����mp���X�c�f0Ku7=6П֩Z]�w�̝3'7Q�2M�3r��9vg�
����z�1����� �C$�^�@�����-��b��ٓo��#������4��n�ڮ#��u��H	a�����xN'R4Θ�Ŕ���(Ny�TK�0'㥖W�/uC�Y���Udz܁��A-�URB+�|��o�����F5�DK*��.�^��p�t'����*��i�5�c��^�k.�<tV{�=d�iU~}{tϚ�ª��c�=_��������P���Ә�[�Yb&c�a_�3�"�nj�.��1Hv������((	"�ɞ���P�x�F�HPo�WA��(�ʢ(J8��F�I r��5z�
V"�,�kYPعF���b��lߦ��(�=V��]�k���Kh�������0��-��6ˣ���W��)9�$����|�b������g@�0[3��if@i�Ϳ�3藪�R�M�;��b/�܌\e���Aj�kZL4 b�H���:\Er��_�K<�S)W&ǥ�r����"&�����d^�Keṗ�5Y6���j�acP�n���*�l?�<��@��n��:H���F��2o�FIrJPp	����l��N$L���ܛ
6E��e|=��+eM���ص��t���p��%2�R�˄3�f�O�g���j��ȢMd����ˤ��ҲL�B����cC�U�t�(�mt?��Y�8��WMa�Z�q�'�J/�_l�������%�W���yY��#���W4�	t.1��F1�U��0Ir$,���@V)��7���|K�}�6k ::�<#�$�s�w}�z
:��T�L���L8X(/��(F�ဎ(,�^�Ouf_}�W|������$2C��iM�q��9�u@��tU!�8��,�}�<�*���>*�w	@�C�z�;n)"�H��#WO-���c�]M��5���%["s�̗nC�4�[��s㶛ND{[H����'��
�H?�����oγ�ٔ"6o�(��82Q(�u��'H�%(�L[��A�
8�Kf��d��kp����8�sXIP����':i�z$�'Д�o��+�ɪ��B:'t��^���'p�M�*f�r����vEdG����x9�/?���w�0	�cVUn\Ֆ��� Lo����
؇��ϸ��l�+���Ch�q�v
Vhpr�p�qVOcH��ӧX��.?��Դn��r\�;����6�f�c$4�S��;qHw�I�9{���j�5�����Q��KT���:_OS8pekk�?���}$��0����C�I���6��w%��"��Sbs;��#�l$���i#X�R�=��1P8|��Zlp��M
H/,(RHq9�G��
.�����T�b�~�E�!,xL_�աB%���?�†"f<c����;�ϱ1�
�f�w��|B�&l^\���G!W���}�k�;�Ŗui��_�JeWR��I��^��C^&�b{8�
SToʮ��p����l~*��m�R9��c덶+�Yfhx�����}`�T��k��^��Afy(��Q���?6��-:u��صۋ}��M�V}��-8^�	�~p��d�7�T}5m��gH���Ӕ"��Έ��ړ�$�!����D=:��9g�=ߕ��yۣUtp�i����Lޡ.W{�����Lvl�Np�Ӕ���Z�%|��<����p`њ��6�T�E��9O6f��\ٲ[�[���]������[kiӮ?���/�M���q����A��:��ה�)o��R���%��{b��.�	Ig���<Y(�2�5${4��d�ў�w/!�4�x�Fcc쎧}�hP��h�\�y+P}X��9`7Md^mz�q��F����p�̲HrdO���M�!�;U�Y8([pe*�L�a���R���#Y���h�`�6�X��,�2NS����1��y��|bյ:�z����Ö����#_�a��XF^(�"I�4�v�!�Zm~Y����\Y%�2��v�	R����q|�,��%�ҽ�mI��aX4
�Hqv0)S���F�u�Rk("��S�*u�Nԟ�i!&��v)M)��0�	c�G6Tq\K� 7���R6Zy�%v�qd�<|���H��ꂟ�
_^�T��>:J:�+u޻:�8�B�.��B���x�q]�{K��=�e��\�,��Eh4$�	���u�ڎzE�=��{g�����g/&��7wܪ�bӶvj���n���}���[��ܼ��@7����E߮Z{���|m��}f٘o��d�Ƅcnq��6U��C�\[*n����t��z-?�\Ԅ��}ej�JY���ʖ�4��N�E�!��h�gge�W���%�T|�d�6�����"���5�p!$P����-\�jQ����dV
����E�����˴#xj[EG)�H�G:����ߡ��Ǘ�??y���%�ȃ�w\�H���-&d�[Y��=d�
���� %�D��qG£�4��Y���W#��mt�&v���g�O�h"OHm���c:�&��c�݋�}w{)&�$u؟��|n�'/$m6�B�nJ��4f������A��Q	��?D
NU�Fh�~u'9v�e^�Y�����#������g���Z��,�2�<*d�4\�R+n}��d�3+>PXoG�+A�j9��.\"5�D�̟�X�EIu�ae�o�V��3L�����M,0�'��w��5vC.�9�3�|�>�T�5R#hDS�x�+�H'�fD��5_�jk���%�u=�u���"%�G ����Gz3o���|]�k9�z)�:N���0)SѼ�{&�1�e�H�_5J���|�xkKQR��E���!��� �<po����G���{4�fR���=����#`�CP�"{��6k���j��c�CI;W���cT	�K��J�'��q�4��a[h����8mKN 0혵��X)�8%a%{�L;�!�;�3,_y��)|�v��	N�Z�I�MB`,�y��a�+�-��]ȸ@I���|�����Y��c���'0�K�{����*a0�|�W{:��
��c7|����W���U���<�Q��4��6�Ҙ�!43�36�`�2�.'›��Ϛ�5�Z`��S�X��M3�ew�A�q$K��Bs���F��~k��p��Ӟa6��b�:V����&������+co\nۍ�݀��r�m�v�Z�1�$WY��}8���pe�Qy���k��J��aE��q��P�=}H\�Q��m���(���S�OU�'':���\1�*�r�ߩC�i�p���px˜�jWif;;K��:;�,�q�(��_n����T��=!C8�HP&�y��B+3�]��N
-~����@j�&��9������S�u'�-5���I;�p�my�Ո����V\�X$��.	7��/��e�恹�����v�A@Q�T�O��j�KT_Z�RsJ-?�g�#A���u��>��b�C�r:U����!W:r�fNl�"�i�TՖ���&#W��$�^ر�z�`��������1��%6.2�p�o�έ��Ģ�1�n{]s��z�7U��B>I�V�����v2�"sQg�ŕ��<�Ȍ�Z���4�*H$��ʹ�x:��Pa��P��u���e1�n��`�r�Z�aN-��Z
�o��ti��O��Ҕ;/�{
�Fe�LRp�U��Ly�&%1��J��E1>��I��;kc
@�Y��n�:k���eG�=�U�s��Ny�
w8�n	�I�V�͍����B�S�d�۵��C�v=�,��h�醼�y׏=�������4�����X�!v��{�;1ugB?�^�ʌ��K��8҄�beRv�.��N�ܓX���(D��;��ʷm����G�a�{<�&˩���$u<u
�j���!Ae�Kr�
����+��9z�	oW���ណ�B{<����ԡ��xG��pO��}�8��q@����mܝ�n���(�)4P�{x;�y�IZ��7�d�Q�4��-�.m���[�cW�
���7>�o�N�>۫�̦�\[���A�?ؾ�mۏ�1Y��y���N��Dϳ-�/��(Ϣ�|f⒒
ς����b���?���i׸�Q5@�3J$n0!�\*;����J�+pvӜ�.ږkZ}qwl�{9]1yh��v��CV�/�>$s}�G;Q�[k��C�t1��K��n�:��Q�Z�(�*��л���;�`K-�4�ƚ� ��?#1�t���[U�݋�x�c�0�ؙ�|䚎E��kL(�M?KB4	x�AڞZ�EO�?�֯Ŭ�hy(�L;
]=��=4L��@�|��C���~�!ܤ
!T
oZE7q=�v��S��:x����<�PE>��ۘ�Z}̽v�{��I7�V:�t���f)���i�Cl���`>TJ���NN�W�x�]�[�X��e��wBV��Z�L��&.��ٵt�f�.3`�D}��*qs�^���Oٻ!e�%�����)VC?�m7����gj���G�aϮob7e����K;�bpY�y��m93Y$��k2I�h�:�_��V���¼'ðk>�� �_�I�v�ׄ(�������h�^�рt�@c�nw
!&>=�0���������@Y�dX��5�Sw-�o�0��·˾/c��5�q�g�{�e�$U�������w�Wcn_k�U(c��I�7�lle#0��H]m�Q>aƝ	&�j%6�A���(ܬ7����-Q�'�D��J.�������ڠ�l��X~�g���{ii�t�Bv�L�ӷ�G��z�����07�*�,v�C�0�kOQ�yk��,�
rN+B�:��h(EJ3)��������;�8��KN�M���o�S9y��D��v��.X�0%��ERW=`�	{�\�IEw�K��4��Z�������fM�YL�TQ���V=���ы5���$F*�[d��&��=ho칏��WjH����O#�L��b��3��y�Mxe����*gQ<�UzTɦ+s��E$�������T��&d�ۓ�*�٧�ݘ�,4�c� ��͜�mu9ڍ)0��]��r-�Õ0�iJ���le�8��e��8pg�^��K��j��=Xq���g;�f�
�"6���o��ߑ��{���$���>T<�����!}�E���\5<��#ɮ9��c�ɴ�u�e��YM}=��y�f���������k��G��O���������2�D�U���<��T�w�%�Ǔs�"�X�#�R{�Qjgɼe�j%u����Y�ë�v=�����4-�o<�׺�>��J��y��L�2�i�H��P���{sGeڸZ�{Җ�Yք�jU�>�Z7K�qE�y�X��~����.sf�����(Ea���k'�Y�i��(OD<���(ͨ3'��T���������H��z����A@��*�(q���B��O��0H%�g���]�������c���k�
����={��x���e����۸mQ3(�s�/<���ן�y�i�5~m��Φ1�A�>�q^�xVcQ�!�FQ��^c�˒ʈ��W��?yOZ��������X�B�x�_�j��G����֚y����s��U�߭u���{����
r�)T�9�iN�i\�����U�v���*]r�$������8_S�9���mu�����{�{���6no���]1M2�"�%��@M���>�S�>{ZlEbo��7�rO�Th3�
�]�„���ŏ�ҧ�KOƋ���E���ׯ��#r��PU��HU�z�Ϲ�5��MYM𽙯��j�,�C�E?x�?���ځ��k2d[is�`]K-r8�Ua*�T�>�!srI����0�?T�eb"�������O�u�g.�j�J+I��9KO����fAv��v&�Rou�k���U�w���-���%��C�<�\���з�nЩTw�G�p�҆c&�!���D�񄱝��B�J��Gy:����2
qf��s*v'��83��^����Z46o+��&���{kW�֕����!�v��jx��z��<
m#�N۠܆f���M6#_(��f�0G��z�x�<�l̘��3~��&��9��;��")����z
�qt�[���ee�/.�N8�F�;�7�>���goUmI~�X��ߐI�����z<mq�����ΕO|�W��3>�+�޿Ldm;�Jwb�n؊���"����7'T\�3ؚ�ԏ-D�WM��甾�akw<�<�>U�*��Pީ�Z��{��;�N�*F?X2���4^S��t���G�=�ea�?1�Y��@"�r�b�7��Nc�6H�6�t	�N��v%z�����i�4�a�V�1L-��7�#lB�9*8X��kqPTp��(���7?������nW���N�d5���]���C�
H���G��_ˤ����@�"7r�,�PS��N�ܴ��K��`����ZoɈ���=�ЭHﭓ��	����Ң8��Q�ZwCu��0��o��
�����>�^�5��e]�#��2��z��fm�B�T��\�
B�y�eoZ:v��[�v4����X J웄�
��h�\�tp
��&<��>[,�]�,h��87S

w����Puֲ���*��Q�@"~r�����ͶM~�
�����آ:wןn�K^fn�Q�Y�f+L�bg�k���lM���5K��jhO��
�{ϱ��ڝ\ZT�i���f�Ŗd�w۞�尰�;��͚�d��"�o,�Ȼ����-b���_��&�$i�ޓ�y��i�UG$���u�.)��b�\��T��l�[R%qJ��}CNW�|pN�[��hb�^��b@���a�
��_���fQL<0���>�m����y���1K_���]�E�>���v��M��.��ߛ�b�����������oO�rhz�Y� @<R���MBZ�#5�������$sy��J{bW���a
ǵ=s��Hu�E�+��#�|Ȅ����z��s�uoj��O���1�$���N�~�w�^}M�,6|�F�c6g��Q��h�=���A[����l+�h�x��j^�1h+/	�C
�dA���(�<EW~�&�<�iͫ��71��h�5̱d^1?®��C�o��c�9r����1�ns�R��� j�(�Ѹ��!����<�'��#ۘXw�C�K���x����	���՗)aX7��d�;���H_a�O�?PKEePQ�s���="pip/_vendor/html5lib/serializer.py�;ks�6��+PzQ[Y�ݦ�ʖwr�ng�M�vn�{h��$���lug��=I��(ٻ3��P�ȃ��y�<OW$�eQ�,_ei^:i\,P�G$�k.x��H��0�X��4sD��l�Y��X��
O����d��@����HBA��.a��<�G�q�K��l��,�!S�<�D4)j�G�1[1�7"�4�M�E�g �`y8it�6<yт6��K���\K�3�@�{@;"AY�J+0d,�#^�n5����N��˴`5�W�CA���ƿ�<�[l��Ļ���;�5���Ze<f��Ń[��[o�F�-h�y�����<�z�	\�p}׷p���;��כ��&��6�+���5�y<�'������z_|'��	pq����p���.�r2��)�r
<}�髛��7��x��My��ի=�!�|?����o�k���|������w���Ω�s*�{����7 �85Kd��3g�h��\e(��o1K|�����xyC2����y���Y��_M�1Ě��É�搈{��U�(��F=U%�߯I�$�D�CrAN�$�-��$-���"�/�OJVQX��`�������D���$W�a,J�fZ��)ϯ�w��f{�!,�� �#H2�܃��G�������C�!� ���^��I����_��io��%]eg#�rQ�;+±��K��8�_�؜,�U��١�g��f	���"#q���T����/UV��s���'o����/��Ŵf[��M���X}e�#�2YR� ���q:�����L��?A��m�A̓Τq�s�U�*��#�wk�mbڝ��2�dY��� �|�<�4����-���=��C��M	�yKԮ���@�m��e�4�@.��3�,fh�ܦ�PȎ����l�ַ�Mp���]���p��eh��y��)��(�Uh�v��B�y�����r:���5`B�����N��l*z��RM�o�vi�{�x�ƈ��!�����$+�Œk�1��a����b��4a#�?��y�f��
�<�z H�dDb#Ez�"]��B>P��9g�Q�HD�/�؉��iî�84t�
aKaBU�(��[�%�����'(�BgT�����$�L�L�P߯c>7x����C����҂�<$�
i��좑�a&"T�����#$��F~��� �2��2�!A�:�߶�7�VЍ������T�����|�F����������X�8�O�I�q&�IW���it!�2����%�"���IT��K�ϟ?O��2-�<0�ռ��/@;��l:0Z]��_�W�(v0��f��s��b��d0�YͶa3�p>Jj�U9`��|Hh�#lЅ�s�粍&XӸ�Iۋe�����T)�m�
��1�
�xyfF0c���2�hn�LDl��>Zltmif'șP��U3�2Y`H��)�A��f����!9!MFec�֖����b�Ư���z<��:�q�&��"dqL�#&EgK:cA/��
r��Ń+�T�`���Y��]*�V	M��?���:|M!u<�����9���)�����ց�eb��kY��!�e?��6���h�]���h�`�@�x`���s̬��~�Q�@���@�
M�Q��ڄ��d�HrlU�����dzAP�A���UX�Y�����n�"����O�H�C��{Q��j;g��<o�YHT�"�<}��5cK�� �wW���;�K���E�d��OD�H�ĺC�T4~�!𢡊��W
e�:P��I0��k([��6k�N��xw"�pIxcD���X���I� g�X��.{ 
- ��XlV4�^,��4�Q�-twҹ|NA�,� ��aU��BƳ��Iny��\�_;`°�L���:_BCe�������P�������mQ����0�b���O�4�!I�
���H�,�؟@���DH�<Te�\Í�?}�u
�E<�5�h�+2�RA^�{�?�������T��A'�����Ҏ�-��5�/+���o �AdE��	c�_#S��
*��0���	�i����!ˊ�ww��>ú=�Q��y�`��Ĩ
)���o�Pq�dG2�0�LZ��\�eA4��Oޅ
:c�0`l���ٕ�'��$���C�8�HV�P��*t��tn�]���7����W�LN���bc��% �x��.z��(b�pL.Nj1F�e~|a	���{�	�;q��I�+��:Api5Ƣ�ңR09*�`�B��>kD�P2XX�<D
D~QYR�M�9���kܪ��ƹ,�Z�:g���>Ip�(��^��K6�iY�S��^A����<�X>�(���g��[�N�G����X��N�*�g�fKe9c�9t��)?c��� "��(f��L�c&cu��&���? ����'92�ae:ֽ��0��-d����^'���v���j���%�,�8�(� !�l���%NW2x!�� ��[��C��AS�
PuJ"�%)����.X�=���6��t	�G��\�T7 �q�\-ɵ���&İ��9lԲ�F����&�Ag�¿5�ƶ��Y��V��ؠ[�C�]x��l�P�e����H��q�e.%K���ZU5�;$��p1��uZ���;����EG�8
�E�y���i���@t/�ng*��(7���_��Sn�W�ٵ��U���[�j;��}�����ޚq��P�A��e)FTY 	Q�����?�JB�4h�B����,�
�X]4t�W��hu�:���JQ����F������o:��-e��b���7u�k]3+0"�Z*d*l+�?�yM-r�2���#_�+��srP=���!˵:��=z0
�]������!���G�Q��pP���LX�P��`+YC�,`�ŵs����7��Y̔x��PBt��"�W�Ͽz�����$/�5���m�-Q�DV�b�y��ݾ���S2 ?��?�#�4D,n(�
D��^�<r����˟��>�G��'�?�P�M��~����k0�����.�$.�#L�s�T/7��bY�՘H��'cQƱ�[����t��g�(�m���2��r7�<��nd�v���y��|�Y���{�B�s���6rsh
���sl�=ns�1�Ue�V���4�V�\T�\�x�9��S���t�޿�~��':J�-V����F���-��v��&�Z���C���ب�N��Gx��q���b��&���R��0Z��n+7�b�I-{���p��q]ɂJ����0;�?PmS U�?��mLH�7��ln���'�-�w�K���d�ĺ�9�TR�wB�+��~��; G��q�������`��l���}u�s�Wv����e38D۞2v���{�i���$��nr�OI�ۃ�hN�H~
�m�z�y�C]�A=���d0�1��K�jf�2����H�j=�'u���\��m|����CFu,���uph@TS7!{�m^�@9�`Dh���(�z<g�z�W;�x��E��W:��z�n�:���b�FW�VWH���ށ�8��~�z0t�2SAiV�������Uv�KN�SE���*RCF^�M�e클��7��[��k>u��6���ہ~[6��'�7�Z��	���^�ŕ�#�fY̹��-;��w_��Y�o�[�
��s���
:���1��ea)��JxkM��pu��T����⢩�{�.]I�e%�U���Ot�vt�ۡ95�hzzD�I�::z!��.�囪U��Ix���3�����xg��с�>k��V�*rr����viS�� F��p[��ݫ�_`�k�j���ý������ٺ4�;vsQr)�e}�%чb��"�4�Ǒ�h�8O��ck_��q���8;�:g^��O�+����r�u��8̍�0�$7�:dz��rO�9��}��Pw��9t��ny��q���P/'�Ǧ��-X���Q��]��զ �v�#�]����ޘspV��C��Ξ�-��;��!���G5�����7�>�L.���/�˫���{I�vy���g�C"���΁g��=Sd�G*�4�4'6����w1*^�3v�]�,����m�R���h~y"��zk�U��_l�?PKEePQ��]TZm&pip/_vendor/html5lib/_trie/__init__.py5�A
�0��}E�,��_x)S;(�ut���U�cIt;�(�ڜ�P�l^1�ŴU��{��"�zlI6ۙT*{��ǐ�?�\�(�>���5�7PKEePQ灦�#pip/_vendor/html5lib/_trie/_base.py�SKk�0��W��M���RX�C
�ҐCn!��j%3#'kJ�{%˛�>Bu���1k�;�R��'�̮�@��mP�{�y3l���w��-Jk��,D�a% ��o-6!by���Ku�q�����D�V7�4��w�u��*�9��U��L��c�M,��5RM�Z1BFjO"�c]��5�ƁF�+��ٯ�É)��k\X��Umq�h����m��H�Dk�C*��
q�5J�4z�Ð�j�Ƨp�7�s�8U���0��e�H�_rP�݄m��˿ǘ[�2Ae��\?�=K��#6�'�d�ԣ'wE�63�L=^$���G�ֻ
r�����ë��q�ʤRQ�����;��/pw�0_V��ԅ܈��T&��O�5?�}�W�i�Yh;E^�79�ԁ��T1u�E|�n���PKEePQKOn�� pip/_vendor/html5lib/_trie/py.py�U�n�0��+>Q� ��:�E{�ɷ  hi/J�I%��w��E�N�@Q�,��pf9�[gO eۇޡ�@�κ����񻀆�ɓ5�j۠��)�6Rtԕ�Mc]��<�<^;�Ʋy�Ì�_Rc&���q������_��,�j���Ŵ��e����m�� ��[����и�cٙւ���Q��Ec�u����[��W/�".�X4��s։ݽ�+��{���#��wyvi��JI��7��_�g�؈��Ma��#�\����:K&D.��f �')�jk��\�G%&rL܌�X��L<u_7�C����11o�E��'��W��>0����;�-�����:#�!b�9�v�8�ó��&�� ���/�;���X��&f�p����ݮ�:����kJT̞��rIj�wɖx�������DV%��rsrY(_��1�=���$��b]��F���U
��
>m�e�F��� �JFpe"���BF�rd^��v�������o�GIb/��<xu��L�PKEePQ(pip/_vendor/html5lib/filters/__init__.pyPKEePQ����6pip/_vendor/html5lib/filters/alphabeticalattributes.pyuR���0��+_�1������B!({���%#���_�9��6�A��轙�'�1`L?����"Sp�Y�5t�b�
����6td�e��RQ�Z�Y�GLt͵�9jYhi�;��}�-E�Q��y����SeY� ��e�cc����>Ĝ�=�ȜHR�S���V�3^<�Fl	����d�L�o���Z�p���ߔk	t#�0��-�sr�S��y#����3�<R�E<���"�B�.T>
#��f�ۘ�)ֳ�\ȶ�>�e���f[Ú��[�)�W��>*u�Y�/V>��Gb�G�o�7r4��v�Wb�n����ZFC��ȃ��S�A�gW�3�^�U��1�/<�5�_�	����P�	^��j{�Raz�5\�M�-�=PW][w�X�Q9�j[�x?�=ܞ��D�T�^�f	w�7B�9oP�%�-��/PKEePQ"��ĕ$pip/_vendor/html5lib/filters/base.pye�A
�0�~��	�>��k�!G*�U,��CL1to�Վ����B���[��_UR5�k^`�+K^�f�&6*>�s.$�
ON͙d}Q���i����'�P�%P�O���r��c7����V��q�3��<6w2oV~��?�ѷFJ_u_PKEePQ�?�3pip/_vendor/html5lib/filters/inject_meta_charset.py�V�r�0��:Ì��&��I'����2��bԀDВԓɿW+d6&N���ݷ��V��*X�5�DE�*d�^��F���)Kē�B�)���UQ.*�k�K	c�q��<ϋs�5���
�ݬهs�����1j�\�����4������7�~,���	��e��R���.@��8	�����(А�S�U]�0e 
O!W.��zQGЌ;n^�qΫ�s�3����L�q,v�7!�͓�`F��
��;��
[Sz;kA�[|����8��N�F���KSTJ�6>�:JU-�=���(�aP�t��[9��\R���3H��Kbd��|z�=�:C��
o���cl���1�ճ��Y��>���2�3����(q������
ʜ�~r}Ξf��X�|[�!׌�(C,#x��S+��D.�W� �) ���t hN��k��9	7�3S�B�0{���V�
m���El���Ҳ�'�n&'.I�q𞂻=���^����N�m5B�ֽo��b�x��x�
��@_nS�S���ǻ� o0]2Z�1\"P���w�p���U�]4���~Ͱȿ�������OUqϼ9��C�J���:�Bj�������X����ygؙtX:s�a:&�I伟�ף�ӭ�N�����k*��~y^�d!�!���ǝ�v֌��&�G.��J<��K@�bКW���y����}�ဦ&m�nV�2�R�#�u��ن��٦x�D�9}W�����8�7`r�l:?��6�xI���O��{CS��cͽ�PKEePQ��d�l;$pip/_vendor/html5lib/filters/lint.py�V�j�0��S�	�~�@.F�Ba��nJpU���jK�$��F�}G����(�Zn"K���t2�
�㬲��8Q�J[�F�Ÿ��C*��JΡ�"Q)ƹ��yn� s�(��e�td�kKd���v[b�ڃn�ي%��Қ�P�M�4sxV"]�X �ox��k��Z&}��~(!���,�$����i#t�E�z��~��/�ɲ��P��y�ҀZ+�����.��ٜ6?�9h.�>��2�%��>
ZI�?Ō�"��q̳9U���g%(T��F����G���6�6<���ER��+�.�~l�ޤz=�l�����
�}
��(֪B�z�֦*�۵rd9�:��J�L�Ѥ����H�8��$U����,��[�\\kw	���q���r���b�@d5�8Cvc�����́���n�z��~�R�w[#�>DN��Ͼ�0�UIt��*���`�;�we<�;�Wk�`#�S�O&mO��l��Vb��)�K�Ng������t�6���zF��ֺP��Mi?f=��X�b�����i����h�5>\9�2U�>Ӱ�
n9��+�=uo�W�c��DTE�	'ҽg����$�t6����H�Y��=��E��]�ԅ��8��دh"u�w�M
���L	uk�/�"�2��YY/�m�C���qm��<,�R���n�-���Xj^���O�+�.���?!�xJ]������kz3��R�O0�F=R�hn9Έ�3Q�M����g��yd�u�����S<��)��\$�)[���zP��;�f���	_�6j����Z�\�B�s�c�aAS�Ĩ;}�OR�4/�W˷"��"�+��m(`+0O�PKEePQu�*�\),pip/_vendor/html5lib/filters/optionaltags.py�YK��6��`��ր�"I�C�(���C�C�40h�^�D��w�ߙ�dQeK�w�CH�c8��7��x�Uɖ���\.Y^n�����*vV.�s�D~��\U)�Uy��\�����f�<��7���&+�1�c^�-�[�����l6�K��^���Y~g1�ɬ�.+f���j%䚙"���b]��c��}�v�9{w���J��J�ls�F�t&[6x�k�[nX�,��R��e!���v\�����:F)P��q2��q0�r��[.C3���A�)���Z̙ޝ����f�B�:�wl��rm?�Yߢ@v[3���7�t��9�$Sn�
���7<*^� ���2��'n��w�,|�?TbP��D��<$�T!� ���}s�L)�
�3G˶v#9�W�nw�'�фFq�ƖEҕ���b�����lb	�Y�l%�*sk� v��\��ɫ��W^��<�p��ly&Y��g�n��L�H��0��]��ű ��콣���P��adf��h��Zm�C��\��f���Z{<Qk^5O�`З/_ް� =+��ƷBԳ�e���hؒ�q���x�qm��z'ω�z�Þ���Ά�Rbq���#|�����Lnmd�c��η6���/�#�W�Lê\J�s+�=�}0K�>˟�����20r�m��:Z[o1�cQ5��c�9�����S(��q��=z�AxeO�t��=��㛵*
�0Z�n�-]����(�79*q���%�%��X#b�؋�LwZ�j>];�B�u�y��k������>�kW��
��7�9�tp�͈�A	f�~
8#i=�F��
ֺdY�Df�m�>Iɂ�f~1f��l<Z��W;���c�{�O�V)�܎��M�".R��v�`@��d�9�&��� �&�b
�@p-#�|5�i�cǑh�6>$U��5A��V�J����.�CF0�2�C$TҜnP�d�<\���!���s��y��q{�׫�o]Y��unZ�Y��u~�x�ħSz��>u�Ov(r���ɔ�ڷ+��FhI�	cP�:9{cA�P�X�a�ҸHT�&�ܚ�[�xB�l�L3`��<�R8eX3w�<S3/s�T�%������Ff��lT�z|B
wl�@Q	d���4�JU!b�"�hG���፥D!�06�/��@$�d�`%�`d;�d"l����P<Q�v/�3��2.���@�m���r,CO�
�}�g�,`g�N���Pw�����"��T���.�@�V�L��9�/�|	�op���uJ�v��	��B.�iL��F l7df��o�
����s7}L��szJ}��G���[�A���I��{�!�'M��t��ʧƧtO~��=NE�s����K��F�Wt}=���	��+bT�S�QAh�΄��H�(��SZ�8�\UkC�/S� �������<�-o�ߛ�����)�2�f��uW��~����5��Fw)z|աϪ:pȪ��W�9E�/l������b���"�Lk�wI3`8�L��v�?Ik����(��X�k��Ш�:��w���7�+����k4�]C��Gh��=�ѻP���+9�n���q�3=!�O}�8�//I%��*鶎PixxMפ���*�fZ�^�&�Z�QsY^��T���-�.N��=�O�{t�F�0�G`j��$��ui{���9�!��n�l�Xw~N5.-[/?�:��_PKEePQQ�aM	i)pip/_vendor/html5lib/filters/sanitizer.py�=�w������qIZ"�i�l��q�6���r��$�wA�~���O������%�\�Ryw0����h4��璇L�(X�,	6:���e����%��
�<x��:Wg��k�7�rf�i��<���d�P�����o����"Xe�H��7aZdi��Y��UU��Y�񻘳pC��d�E�ӥA�F��
�j�$<��x��<f!���U� �:(Tp�f�@����)	�����#�
����"U��zC�}V� �<R���htdX�X�
]H�X"�3�a`*���I��P��	�(�,�Xh.Y����:��O;&S��U�]���ZĪ��,��J�\���x�ɹw�$��N!c��E�$08�湪;��
\O�f�nIY�U�U'��J�q�b��8p\�~1nts`kf�ZC��(�ߨ��
K���D�G� >H�(8�+��Xy+Ms�,<h�GGӣ�zb�0��$���R�B%`K��т�F�p8�����IɋI�ҫ1e|s��xzr�x���Pf�>� E��Jy�$�Q#�c�AR"����,=�b�A���S�i)>�.���0N��-�0�%ƃ��=��7$�<>�؋��Y�����0R�4[K��X(���=㊸f`]=H+�4E�řG�"�Gp�X<�������z�e%x�!�a�$�nԃ�e^EXe��"�Acl8�|�l����)����[O��=��{�'<ʼnG�E����G�n�~�=rs��h̖>��9t�k���H%�c5!>(|^�O�\�ό��ccR~�}���	D�^�r��=�zx��}�%���
}:\쩭X�!S��?T�d�a�J ��d�O���#��IKq��ICD�1:����'l&���,�h�A�pV����j-)�=(_98;�g~���]+<��e����Y�yC��1�ú�A`��å�h�l��d���*6���*�"״������3*�(���C��i��mX�3�7v�>p�rH�H;/����>IwJ��Fk�:�p�lT͏3l�:X�IDk�G��8�H��z��YJOm�Q��T@c�J��Y<��=ğ�A�� Y�3�9�E�n�"5HB���(_ъ�"(�V�<R��^0�������a�Q�<L4��>?���-���-)g�E�d�6�A�����nP�f��qI(%��?>��)�#d�~�n��Y��qRE�5���CS�3�P6�â�vB��3h�=��C��(uoj-*3
Q�МZV~���Oo��l��`3Oz��5,y�i�,��VY���nA���X�	��l��0K�[��*[ea���;�,����t������rvl}�1�R�Iۭu�tcmQ��@1�k�0g�i��0�V:T�`��TQER�ӵ� 
��V.���nxx˝Y�jװ�)g�tQ��[;�;
؀�͡K+x%\��D7²�%�	L���x��f 8gk��g�S,�}d�,���+\��x�U����‘�J�^S<��)AOC��d�jk'��a��v�&�;�5J��ۋ�uI����傰3yN)��Q�BAA�)�@LrGs6ˡx��c*�]�+��E������`Y��S��]`��|��
5��&O
��u'.m�C�B��D#`�]�B��L�;Do���L�Lg���r��6�CX"�i3��T)!�iF�N��
s'9�vҝe�+R8�1����LLz�	�V"LW�)B��On��s8�9q��.���r]����c�+Ē��1�u�;[�����5��o�ݑ ���^���`E����劲K
�LL!�=�2���;S�]N��Ey�3m�����}�,҈;34��Cs�6�ltC���1e���/�!�'�l�Ԗ�Z8mn�T_�,.\��%��V&�2�D�Z����f���ң�'H2d%&i�xH�>����"�_������i1����DO9g0)�`<X\uC�Qvaʼn�T�.�`G�3dE�>�;��mJhdL�.�
�iXJ��X`$�u���(�f�gz�:&�4)<�NJZi͇l?e�I����1ߺ^�4GDz�x�$�.���\�Gdi��vl��:|`)4��,�(��x\���aÂG�f��Ba!a���k�%�Q���W����"�QyS!w�!�5����4�A�-\U^.3��-�ڍU�Ό�`f~"���H�E>�(���L�39�x�W������c��T�T��J���!�]8�X;z��Y����VMFp����X"��Qv�,(ux�l�!��)����;\_9ԯ�v �8\�QyϺZM�G*��wCB��@��I�yƢ��!�,�?К[Jd�����P8�~�[���!
.s�S@���p*�.wf�dV%�K~UBF�e��H�e�L�E�Pn�6�o�n�p�}%�jE�6(�,���|;�-�8+3H_�L��x|y��̑{�n"�
����R�)�[�J�����t'np|�O�/���kj��,��5�u�{q�?�p�
�h��D\�IA��&<�tv7q��TA��t�t�Y���̔�Xy�Io �]oe��5(@x"�Bg��]J�aY�vT(����Z��e�^T�	~��ga�?XJ�j���[�܍����N�Xn�iҎFhgO�.��zGo�_���D�18��GC���2�@�;���;�1�N/`�A�V��wn4�4-ELL�pJ�t�z7b�9���W��u1t��’���f�(Yy@+�g��震\p��� B'<��|ҙ�3){G�?gY�*�ޕI�ٻ��f�jQHA}U[�:6��H�қ�C�	�����V��E�tȿT�z�\U���9�P�w'h��N,�B*b׍�m��ν<8�<���r���U6�B6-�����0�X���9aS�{'Ⱥ��Tl@���G����������SLm�I��ر\,%I�R`�C��-�s-�R���1/c�Y$�X�d�j��ps�bV� �3<��T��$�v
Y�F��<�P�tJʩ��"!��P�=T�<�[f�����������d�	:�`C��߆U)�t�b��3�/k(�6]ĎV��Z��hg����
e�Zr�`���SY�KU )	��wH��m�eV}�Ձ�E�fw�y��h��7pӥnz����2�4�6$�a&;-0nT���#���D
ۢ2��궹�D�{�[m�To�
��Y��k���N����P!��h���>��T�}���Ҫ8j�-�5�ټ�l׌���U���b�›&#h�}[�F��µl�f-9oz�C�E�%��5
[q^��-Z��������B
&�yf�}�I+Uն{�
1�0ג�ɼ%���[��� ��O
�hJ���m����I�=L�dG�D�#9�˞ǥ��B�^�6��I��d}6̬r�J�n��6�ֆ�ɩ5Ii�j���)Ø��G�4���M?x
���軐a+ �ymI��AZg����4m��<Ny3;��y�K��V�+�J��
*��j�6�i�Xe�Z�ZÓZ5�l��mΨ�F�&��t�d����4oA	�-�=�Z��}ޅ,�Qw�\��c$����H�7D��N�x<6U�~�b���p���*0]=gy6�X����������6�/�fl���쿟�s~s|�}�>��t��JH�`.�<g�d��Ϫ���lt`!��|;�����J{xH���WJ��3w���6d�[�d�ċ���ć�����^^���
���e������3��h4���@Q�s�J�$�V�?��qyj��lpŒ\�S
�	ڬMO��ی �Y,��XL�W��ǝDA�Β�>�@���st�^7�?����u�rN��s|�~�G��!�mzNB������;5����|��^�|N+���k�a�4�U���1�v���,����H���f�7`ĠT�`aC��%�nD�zi����z��	Ԫ�lM
M����p�]�m�~}yX�5�_�e-�����]WK��T��J�����(W;�eI�tx}�?���xdk�ӌ��˦>~D��is�o����|m�6l˱��\���;lhY��
H_�f:���xEY
�8l� �`ڀ�w�Oh�RCC�2��%�'��2��[}�v��	l����QC���T�5)M�I�>n:o]��mӶ�ﺼ��
�7y�At��WZ.���,���d�����.�+�� ��D��^Ug���/����ub
|d^ �U�e�D�$e|�l�
�"�
�9U��0Љ�ۍ�Ū��m{���,,I}�a�	���6��ҏ������V�~����_.�_\������.O0�Z+��{��%����>|x��w��pq9.{1l�s=ad:1�:bxN��|�C���7-��[�{����?^\Z���u�_޾�ɇ^j�_m��m��f�u��7�/`�-�SiZӇ_�^�me�g
H���7��@�T��|��As/�'f2~^�|D�"e�/�.V��4x~Z��M��E��X?���u��.�����ؖ��`ً������k�|os/(�W_?}�����xΆ��ɵIXJQmh$8��r~���*�m���S�\��ʸ+��V�y�r5·�M�RkO��6]������4���\�񹧭�O׶�oV�5�Y��bP���'�����Q&�okc���-�>�+s3�����t�Z�u!{���
��M�7��Z�qw��σ�ks�u[�!����;�:�L#�d��HZS4��pd�u�.�δA�q0����뉩27�&S+�ߣ�	�P���K¾լ��Y��c���PxBLi��.�WM�7r�ǼD�4�C#�,�N�M��9��7!�аVT$�bH /��0�v�?��L�M0!`jЂA���]��m���v�} t��b�	�3ʼn��%:ZVU���v��|�@�o���-�zyt�c{��;2'���dx�}V`���ܣ!��'�8b�^��2��X��|��Nѭ���ӔIբ,0�0S�$�$�A~�L0��fuH�K,NR=ڨ\�U�r2��x}�����w�����Z���}��[���.�
��L�s�-p^İ�aX�G[UNqKn[�W�}^5?]�^E�KF.5Z�]�5�2o}q�~�t:q��wx�C�3��^]u�u�d1��XCl�!�w^�AtO%��Jq�����g�G����r/c��8��(̍JO�%<�0�H
��`��J8���K��#���&h<%��]�"��4��B����&���|9q�VO�'����G��W�No�_^O��A0��6N�	�\�g�T�u�W�+�9��$H���0b��Ku�W�� A7Tp������W���Q��ſqR�P�	�ڝ�N�R-�֚�������8��дJ���"r��z1
�m�[W��eps0�iR2T��q,�$UU:pl�H�&`.4O X��9���8x��G��J}0�R5��Y�3�A���\�*U7M���n��Ó=z�XU���.�s<!P���N'�y�聹�gf��0~���:��v�~��o�`�;�	������Q�J)dH��&���h�G-��*E��E�F'0���̢Mo��c������>�?㩱�h��>�~�
Hչ�y��M֞W�F�_'Wg'�=�_�f�7�׻��~|u��w7��Q�4���\]G':^O�O��&��Y̱�	�ݣ)�\Ͱax:�����͓�3x���4�k�����h�d��zR&<�b�J�p:�:F>�:L�Ӂ>+�MS�Rb� ҂��`�ut���m,�QS��<>W|\�^���u�*����g������+��Is�Vy�wݜ�߸����NC�>���+��V�@�c�:<:���En��
D��V�f?���T+:~���:z_���/ﯣ�yz��^�_VO�0����ݽH��>�s}���?�?���s(�m�3�4�4|�b)9�u�
r
�?���^��þY�T����PKEePQ`r���*pip/_vendor/html5lib/filters/whitespace.py��Mo�0�����6��u@C��Z,=�C��U�,�܏��Q��FN;`:�H>|I��顮�я�d?�A�Q��z������Z6��ZI�V(�X���Xp�B9
��l�v^h��mZ�E��G:-�
��흰�!�c�=\�彑:[Yr�v7_�ծ�^}�~��EJ�Ra����p��Sk�p�JEY[ο��hqηF)18t�xG�N��R�`��O^X݂k�$#ƺ�1�����.E�T���}��D����%���V�$= [����-�u�PuQvXC�D>�vƂ7�Q�'��Q���C�Lq{v��8�.���H���8�L|���h[��=a����|�Y+]I��k��3�S]�n'U!��܇�q�W��z�;}[s�X[�:~8�v��<�:���{3���[ӎ�覞�g����1|���I�*礒s�kxG��f�=O�>KT�14~��E��7m���4��v��cvW����/PKEePQ�9qZg�-pip/_vendor/html5lib/treeadapters/__init__.pymQ�j1��)��l<�"� Xh���RBvw�`̤IV��l�Z��fg8�+��U.�`0‰:h��GX{�Y��i!����O%����[���0&D��Tjv�	�Sܒe�9�<�mɃ�;J۸7�F�8���~��ܠ
[ݛ���̟OkjO�~����tܷ��}�N�}\�7�^
R
0�ìpʇ������V�6��^2�E��Ҁ=�S>��ݍ/�_z���g�R�H���Y���s�EJ��򭤼lLՁLQ�z�>�Ɏ��:_N�V�L`�C\�A�R��f��S�3�i���2�#X�Q�
��=��|9C��g��K��xq�C�PKEePQR�)T�+pip/_vendor/html5lib/treeadapters/genshi.py�T�k�0~�_qhl���$�!���Qm9�jKF�����}:�N�8-}��X�}����J��$ymjŒxYIe�>iYԆ%�9����R�P�ʌ%7L�B{^�6�L���R��ȷ5-Y��(�*h����
!Z/C�Fv��_����,��ǯ��y�ȤQ��♩`�]���G�A�Q�Y��5Pw�9܌�=4�30�D�5j���,ŋ���MkF1˔�3�`�7R��;w���..�7췁9�bw�%z{f��q=U�B�|G�DⳐ���dq����MB ����w���"�Ҫb"�[�5���
4oqC�gE�V���OɅ�� -��������&��oUfK�zTV���Q�	U�Ҙ ��\(��ȟ��;�&��¾�~�M暽jw�7Q�i�p���|��~/`��}��k��5��Ė�#-j�b�-�ķX�qPȩ}�����ܚ��kc�d�S�������%�B��jۖD"C�����_�+��4`�/�Q��B�%�\{T�!7(�{-/e���5���$���꧂�w��z��:�>i�\3�K~+�5��r���f��@
��L~n�F���PKEePQ�i��D�(pip/_vendor/html5lib/treeadapters/sax.py�UM��0��W:�������CC!-�`��8Q#KF��YJ�{G����A���a������HJmMEQw��X ��X���y,��*y�N�A�ei*,��h�r���ب܉cN�EQ�=A�{o�3a��KӪ1>�K��ڻHZ��4�V���.�Z��<�h[��p����X�(S
�
f��kE� �-�� T�.Ih�z�@+�qp�5'>7$"R1�*����z���G��N�J�I8�K���~Rr�@��)���
�o6�,�ݎ��N㼁�a؂!z��hHm�~3r.��(`a'��>�r���M�5$9I{�t�����	jb�/@���_���/e�˛=�?6!��i����/��N��N�޷԰� ��0Q���,�� ����C���:�t�i8��(�^�M6˹�n^�t�?k��0��:9Q�/Ll|��K�,�]}��ݏ�[\��JA]}|!g��W����ե��(쟢�÷�	+Jz�]8~�61��Ֆ1b~�n��4M(�V87Ipxv���#�8г��6/z���5c�LP�=);�<OPKEePQe�kLS-pip/_vendor/html5lib/treebuilders/__init__.py�V�n�F}�W��@o/�u��@������V�H�f���.%�E��3��x��%q�왙3g9�ͮ�p�`���vP��1`�<lmJm�P��=��-�E��]
?޿�9+]���,�wPxTAI��LOء,��5�+��.�� cA�#ze V�"������ȹ�Q!�L��k��z��
޴Ė���/����K�)0��
B݄=�X!h��T!�7��
��
��+q�a��2�r;���`�Y�J�}��[�žNўRl��)���, �q�����-��f��j�Fƭ�#(l��K�S�ut�R�Z��������T�
�6�#O�k�p�n�i�"���~�n6�}djG�"�����8����gR�4x������vlJP1z�m"�0낀:ް6�K��(��Մs�a�b�F����å	��^+�g�x:!�.�U�3�mT��y&��
R�O1����,�
���X���c�A��!)�9�;�A�t,Z�%2�,�&��v��'*&�+���!��ѲJ��l4iz��Ư���G��O��K��ש�E�(�{3T��"w�3d��K��eú��HgPTFkG�\2���mT����$N�0%Y��j���l6�e��u��5���5o��T�68CJ\��K��$�%#Dfmtd+-F����M�Jܩ��5�.�^�7� "W�?Y�Q��1��{����^ݑ�pq��>,V\P?�}*@��z�G�͟t��6��������
V��4ͪ�,#�q��,�+N@t�G\��>A&����2
��<&���JW�H���K�,`x������Ŷ����69��5���;O9ȇ��t���'�3>\�ÕݺO��菃[fJ�I&�/I�w4uTڨ�I��3�	��rE�j$�2�?�Ȝ���/�4L��Z��
8�9�U����N�OV0�i<߇�n��h�:v��z��e1��D����J�,]	�}�tO�pT��m�O{��kKl�Rs	t��C�3?�6����Ta?{1Cf�c�~���}��ׯ_�k��������e��	���]M]��j�u.�>t�K	��ܸ%,��!�R)L�iu�l|u�ƶ(�����z�������ߐ�+���m����.O��I����L�]赁}pL�L�5��P���N0��|w�n�A!~M�8�2�YF�X�Ҿ��ԚLt��;I��r[�o%f>f0p�|��C3�l��f!�Xs�(h:��:�ߩ}�d�v�Y_:�O�4�T�pX���q%ߠ��r�pdaR�W��>�5x��sZ�_����f��'�^�o5�<w<mF�p:G&;�#�PKEePQ>>h���8)pip/_vendor/html5lib/treebuilders/base.py�ko��� 8��7���P]q�KZM$F{��5�%�Z*Kn�5��3Cr��R���CQq�]r^�7��Fm���5m#no��lUc�Ӫj���ߧl!�K-U=em-K���4��>["�����E�PM��Lj�����.+�R����h�D�j+�ճJl<�2��*qYkј��Q��[^
}v��]��lÛ��ь7�I�'l�5�}��L�,JÄ��a׻V�����������=C��F�m#�UÖ��pc�#�F��o�����	�'�8{A�9{�j�T%��\��[x������1 �E�f��n2e��@�dJ�Gw�1����~�r��ͦ�L�͓�)T��3a�j䠜��Ci�U$阬�v���m��&E��PKsf�5�F���B8�W�q ������gggeŵ�X��U���R5����΃�lu*��i���p!�`����v�,��90��Fp#a:�^�x���32F��74�Rr�Biք��vz�yp�f��,h�v$��`�`�jI;˶����UC6�vKo�l7��$���8��q��U+�(�v[I�?�>z���K��V㱰h��c���/�[�y�%�;��O#�T�#g(�`
x��4f�Y�e�p�f�*�m�٦�ղ.�X�U��"��(�捬�L��
cx��@B��p��M�����y-T�W|2^s^�fw	,�;	$n���6�S�@�{q�1�GlT��d=�=����O�{h�tjOdr�S��
��Oؔ`�v�����rS<��6�z�F~��C�-���4������I�LB�6�t�=i3dOQ�#B���M
�"q�GVm3
�:)x4����	y��p����l�Z�ų�QMO��~�]pç���Z�Ѣ���Z���s�!�S�UZ��'xG�pM�҆7d�L���cS����,�"�bCDeC�B3�?�w{ղ�r�6_�����#��!��@$�KH�>8N>&Kw�USP���/P����q��˸Ղ�Fz5�Z?щ�w4y�g�U��9<veOVrt�Ȳ��2o�F��
�5���(o�6�e�1+��n��SG��_�^���D�O��u0��D!�]��V6�az�b�B�_A�dȒЪ�v1��j\�K��a���<��lzN����ȨC�ۏ?��Ι^�΀�n�Y+tZP��
R�5��6b$��'@vz���V'iT�CtgZV�F)CN��!&,�j���'(ȁ���KKu�}���>��\�Vת�K��)|����~��ymse���6jڐ�Lْ1eh;�{_�\	�]i�{񼫇}-8FO���|�/�w-�������a�C�f�l��*�K>�:]�f�7�2ɯ���T<os�m�G��;x^�O�����"KV���}��C����x�ygL=�@1�{�L;�����Ot�.({�jA�`Z�?ʦ�����
�C럝�=�̤��+p�߷��T��sm�;��QV��.��]����[�@���lu_I�)c��S��!��퀹3;
�oW/�μ�}�p<���=�Xh����3/����+	b!5v<�pJ�%xG�r���fj)���d��WY�����-��HB�����>P:�8�z�P�7|���t���tX�����5�2-�M�ę�����Tmc��(��Z��z>��]fGFH�8�me^v���\3�٣G�ݮ�}S�f���ɓ'�>P�H}y`�q;l�0i�di���5%�΂-��,Xz0�Mz����)�~��dj-���!v_b�ꕒ؟β������?������%Z�zK���IOC):����`K�)*ԙ+a�a�H(�|E��r�v؏��gG�w���rMIl�*կ������(���7��pZT(�1���0�ԍ��3��"��ݾX��Ԓ."J��.+2�ܮ���}Gc���5Ф�ߏ=���oΒk�kw
7�Fj)9��D�����O���Ą� @ܵ�
Yck�\T��;pqz�Y��N�����P4��i�w"����O�k���8)-�1[4���еUӖ�kH<�U����j��n+]�`�9�6b��.!������(�R����&��V�U �I�*��{i<��H����[�Z�}�X�b�5�����,��5�P�U�Vx���һ	_�j!g��;�=��w�]��b�u~���J���L���	:<i��s�r-oBv�_^`��|�Z�I���{���M8p]5D���PԟF��	|<4��'�CŸ6��>�oP+���VO�������38��x=#xSI��m;�
��A�z0�����rT�1�����?}�&jH�&�\��	"y�e]�Q�m86@��D_e�{��Q�~�18�ƿ�0ҍfl�M銯F�������~{�p��D#��^p�k݁��q�����駎
��nYh�]݅㰳�	k6A�
���hs�&[�O�8�
���@��>����Q��W�kQ��;�����B��0;aCRx�ai
S&������D�0I����,�o�tBBK�u�QQb�܏kB�U��Y.���K�h�S)ykoM��
�i�����5�Vn�&�u���G:bCNns�&�`�+S��YS�Z)�f�[Q�;3*�l��.>\���נmEQ��[��������%��k�#{�m�*Y^.��I�H�!�ل���Q�\w"(�f�������S�v�\?�=���ki������-�Y�Ԣ��zųxY��
asg�DA�fkG���.K�K�coo]���z��47l�=�:h`Њ��8�y�|�crH�þ�;��x�#Qj�Qt�Fz7\�۱��	�y@~^":�7�Ɨ6�_�uI���s���/�ō^�����}o����";ɇ����qp�|9Vx�YV@tDi��� ӷ��l�e��T���i0/�S+�!����1�q���Xy��s<ܰ�a���L��s��V�n�C����e=X>��r022ѡ^�ǿ���Ψ&#��
��Vl �W����^���Ќ–Ν�`����M0�&x����'O*D��*��e'�C��z�0�c�U<��ZK�_x����+7�3�{�2Y�G��q]��(�M�t7�����K��w06�O$��n��ErU��Ff�5�R�
)�8���:��}��!�M��I�(��k�ɳ��s���A�*�*��Ri��q��Y
�'%�ܶ	�|���`���6O�"{��,��NIg���S���!��$�O�<��@5��}8�:١��گ�\��)�V62a��n�IHt�e�}���N�;ه3�l33W1S륯E��+$6|���݆�V�dv��8ٔT��1.�F�/MKK�9��F�u��(���D��a�6y�������J֑
���ø�L���#^�x��pKl����H�8�$��Y���+�uh�=
G.�=��[�0Pz��m.5��C4��N��Q1��H2-��Vr�%H��$�;�h�O3�L���f�9�d����~a�Z7���s/�֋��J�.�ؒ@�K>m�
�THHi^����/��86�N���ʑ9t���@���a"�
��)��hH��]��r`�-z�'L��E�%�#��C1�b�������y#��������o�P��D�����\�Z��*�X��\_䦘�Ʒ������'�!-=S��PKEePQP����"(pip/_vendor/html5lib/treebuilders/dom.py�]o�6�ݿ�UD^��ˀ`)�&�VlI��6���Ht�U�<�J�a?~G��H����l��}��x_�Vh�X6���b��j]��[V
'��{�r�@��5%ͪ�,
�I�6�Lx�9� x��ZV�8��f��e��mA.�zM˻	y�Ț�r󢮫��=�q���?x	�I��U���@V���5AW �D->��&�I��j�[̈Z��2`�qə��4D�W��qF:�E�i���)�{��ި�VN����j���EN��z(Ȋ��sN[u�::A�݉��
�:��2�Q�#�-��XČ����$���-`��7q	��!�&�C%�I+� #�ob�7�a�t�e�ڪPh6A�h�Ä.��4DF��7�N
�)#`~ީ����,HR02�2��sT�%�ϫ��߲�`NN�٤,S/�T���H@W7���Ē�����F���
���1J¹B�l�]{�c����:ɝ�I�#�P��\{�9)�/�Q�O`�Du��2/�2r�OKػܥm���Ű���5��&.��6���c&h�]���˧��2(�z,��Ȩ�AK%q��1)�{P�6��9)������X��IP�i=;��d��y�m�9N��;��jr"ŵ%ူK���cAv:�_����,�&h,��2��3)�:�&A֫Ŷ�KW{y54PXd��_j��-�j���W�,=���vۢ �[����a\��MI�VY'��#�#�[��Y�P�L�>��5k��~JIh��;Y���A��Nf�fnkRUW�%®z3ev<�
h%�������5k+�m.���!���sn2p�͛9�Cq�Fax���.)�E&ǚ�kG�W~�~>��~�!b��"ı�ʴ���V��ybM�SI�i�^/��ƣr��v�{��P-�Nl�t�6+��2C���,*,�{��a�!��R��#�ǂ��
k̈́��eK��1(����w�7�=_�<�I<���h�$��G
;�Ԭ�f5��8ca*����:r�D7yҔ
#�����n�-W�� �ӛ7�=l*z��K��������E,���g[�Ƨp�M�ڗށ(߬u~��7R��W{��֍�#;��ۂf�H�8�l� r��z%2����ZQP¨Vy@P���f��-��%�<�ԥ
g�9�.*��A]''z��i)ZD�bԩ0l#����n�;��U�*�XQ��	Y⦐�媖�d�DS:�he�t�:JE%u{[���,��PZ�\=ɪ{���Ku��iKv�Dz�w��y;ym�Ԡ�ߩ����@��	�����d
������Щ��%��p;�q����A�;�صe��ˆ};�ýH���:�л2�2��졟O�~9F�(�Ƕ�,e�Y[�!T�Y�I�`$Ā]�-���,$���X�P��� �A.�$��p����_���.~�-���/d=K{OHl�׼8`�~F��au�b�CJ�+�\v��7.�2�w|�AU��J�}��~NT�$��-�O3�45ۻn����3o��F�d�=i
~}����j�����B�oh_�줺^�Нu�J�a�1*�(
{H_���`�ڇ�(�g���
�!4����Y$���M��C���2Cb)�[ʼ�)2Dv~B���afb�a2u��N��w5���ы�t��3��YϮ/w�#�xx(\��p�X@�7پ>G�.n�k$�����[@�X'�����gc�Hx*��a���p��&�QdI��[�ў�:���5bH����[���7���Z@c���?5*
��w$��<��F�c�Ec��ZLÉ^�L�a�K?�d�>2L�uT
/�9���W�y;�L�*Å߁�}��,�ZW��S1�kӏg�ʪ*�88�5�ޕ���ىȝ�7ǭ;���hj�w�rv���u!^;;���Z7�p
%	�ˤ�i��zchJ�9��2J��h�jW�f�ø��A��3�����V��x5i2q)��a}?����UL'�PKEePQM�ЇR
$2*pip/_vendor/html5lib/treebuilders/etree.py��n�6�}���aD���4�A�@��[�H`�h�3��FD�ij���$��4'ݗ��ֲt�7�˦ڠ$Ynٶ!I��M]5�GZ[F�{��|�Ӽ*#�-��HR�4���Tdo���ǂ,�b$e$;�iJ(�͖�K��q�#eV51͟4+F�X�5��ԓ�(�����߫DZ~��)Q��gI��@rS�/Ҫ�����
Q�
�5�5H�eyѾ�Tٶ W8eU�W?f3�WICV�F�n� a�Gx�ۗ���/a�r�g�YF�hE��]C��m^d�	/�!%㏮7��3a��(��������\<��va/���;�h�z�f�<uf9-0�2䦎o��J~qu�$/s�$!%�2&�:C.n�������o"�=pDJ�h�e�0��wx
�,:ϻZ��s�Z��^��"���?!��ۂ�L�}�f�"x�CX�"aEnj����7҈\\���5�*�=��IJ�+�Ҏ��q�c�	�	D�/��2Q�?N�S�S&ⷶ;U��p�(a7�c(��PW!K�!�ш\���n�q$Q�QоV�AѮI��&�
�|�c!���ϟ�J�oh�N�C�2YV�"�L��2�G��k�GXE�A	��X���퐊n8dI��w��^�8-n�^5���S������bh6%����4A�Ja� g�!�&�PT;�X�e�=J�$���7�`0-@�yx(Z��!��w�s��p˪A��}�v��B�(
ɥtἯ�R�	@���p~��1��ݿ�����0����C +O�s���v����Fl;�K���hk���햅~�:d�_j)���[\Ɩ�w������|&��
���bb��S%rTs̷��*��<e� � �I@x��(�G��aF���g�Ǫ*B�X4�*Hi��;�Ẇ�[@Um���<�X�)�X'�/^��Ƕœ�yK��Đ/՗7}A�2#O@��)s�ŻP�
�c�/��Q�}�
�@�;��렑
�I�~�c�;%]��,�zvޖU,�X?�$���G��3����6�!����v(
w�'�Z��D!�=�T��M�ɩ��$���~x�9�	J���`��V�����2�wZ�4_�$���m˒7��PI��T&���^*����b�7��9C��[�A��0��þRb$Az"�$����*iY�ˏo��6�|2#!�v�uN�:��OϞL�wy�T�>����Tb:�X�����Ϸ⹧��WqW��B��DV�}GLHV�	2���w(I��_(�x�sJ�ӥ�����]���h�g����2���Oc�f˧{�U >�{��� V���	�����c�*���=�yL'�M�g{�~K���{��l]��n�N�%���wU�ճ�i��5��>yz�A��S�^g�������߽{q����y0֝)�fl�9�S���\��T�}��*��~�0�L�'�t,�~WB�P��ba�oI�co��t�m�+S8�~�e�㬡�;d
��7���۵���Z��ΛSbb�C�����.��]��v��՟���O�7�3'�e��&�E�oҴ��r��T:�1�‹D�Y��+�v�����W�o�ӕv#̚
h�Z#kƹ�����g�u�'�WF����)��`:����t :u�)E����t:��+4������]�!�)ӹ�Y��b��z�Ε>G��I��'�k���9������z�^�P8���Gi��,���=���>�e��i�&tY�c���wrK�׷�d�Ӈ��c>rp�_-L7*
���:�a�ďߝ��?;;7�!�1��B��xcPmHuG���O^��O�8���Z�9Ni��[���f��o�}�`����=��#����s�;8��@� vDv�4��x�Tۚ���|ݐe.&���X>��]I����6�(��D~9�k��o��L��:�����;nN�l?<�����@/5����W_�	l	�I�����O�Ao��S-K���;JO����lZ5P��D�����)]���bc0:���5�������C�v�����N�(Pt�8��F�U:�UR�J���+��j�|*��_U^���l�+1]�g�w\�rKIv��~oIC��6�H��/_�s�βIJK�#��<��}z늼`��g��[�u��`�s%ބ�i-}��ﯙ��c!~dc�Wg?���~|�����+:w�r�Օ���GlZ�旿^;$�Q���S������ݭ���:|�K���(�U��%n�������7���sS��Ƭ�\��yo��Zs9�0V���H!��v66�8�q��6I�.�m'���v`���ͧ�� ѶX=�1�Z��
�ێȉ��I�8
2՜��ʅ �hG�&���y��0Jz
s�`*˃~��E�̨���BOK[��d{�sn��qƠrr���6Y~��Ȟ�-D��"�!Ƭ]��|O���X�ۢ��r�z7�9^BG=\~�'|�kH/��:�Ò�ϻ�vo���nV�=���3�>Y��l����Y�!ě�/B�/�PKEePQ����9/pip/_vendor/html5lib/treebuilders/etree_lxml.py�ks��~B�GT"3��Cg��f�l_����s�4�q]DBc�T	�>5��.$��칖3���b_�]�.� ޕi�3�*+›�ꬸ#�����&�X]1��-+Z�"r
ﳔQ�f��.I���l�d=)WbjA�졝��ے�l��9y��u��0
	�*z��5M�9L�g$ix]n�ن���tִ&ˊ�{�d�#c��r�%Wi�Xp`���LMz��(�&l+�'��#��?�eI���	!Ve����$Y� ��&�V%���&�k��&���� ��E�0�����Z��2�mA&�)J�N&��A&Z���bI�Ts��m��PrNk����V@L� �LV�,�WM�T,�I���$t�˼�Y,���4{�xVs�YR�,γ�U4�#���i�)H�!k��,=�I�8�L�GI��+��@���	�G0����]&��wM�D����`���ɥ������.���C���US\5��O����)]W���M������8�c�;��Gҳ�m���V�e���p��9Yf�N\��L@�&ϯ��\W
���.�����77[p�0�=����_���g�l2QV)���ɗa@y�"�4��rN�8���\�j�ɕH�
,+�:�C���\X�l0��2����ls��� `�p@\�5�� �ih���X�æ�L��P��}Y8L����=����I��
V���.��V#�.��ta ���txV��G�:��)|���$�4- &�
Y�u�	�VJWM� R�!�[ʁ�eU�m�@i�dj�돬�h���U����AjgŪ�~�� *�n�(�4GB��/�y	���)_+K�tC@��^H���H����Ԑ7[�֔Ӻ�:�#p�
�}8�T.,>G�
���d`��P=DҬ��(U�z`@W�'@��"լ*h~~}ާk�����Y
ۖw�~܉���=��'�Ә׸���_��|v����9�!D��VX��sv���D�c�����>IȖ�����J}�4C��y�y�瘣` ϔL��$��L�!/fs��Y
pP��~ט���}/+�@�[�aa��Cr���S�9�9]{�P�s��Ԟ�rp-H�D���.�`.�[� z#�� a�"9�Q��(M���7���ѴnNo�bA^�E0���aVR]�����I�r��Ã܉��pg�m��|1���"=*�̖lB��~���#����a�E�����n5��`�j��}I��r���]����b|�SsZ�7�N�:�lS�KK#���Acu���Ue�
�뛋X=���vV�f/�?���)��u�뭶1G��xܷ+߉���&{N��:��z�y8;��av���&�m�̖�LH�@-ʻ��|�ϋ���
3\>�S1��`�tFٳB�����aGD=���v�v����0{�<�h��:Ä̆�J���a��y���9bu��M84���w�
��p��Yv(̣s��ȣ�N��)������� m�*����D6�)�6D1E��MI�{b��mMåکR��G�A�[�a��V��4������;AMVH��\�Ul]B�%�`'M���C<>��|R1灇�I�~��h`Zoְ��r�3]�X C������a�v�u�f������Rt�R��	���f),��Rѩk��κ]�Wmc����|��D��D��܀#.o4C����������$�S�C�5'_,::�L9�X��C=bap��G'2ZqQvG���Z&�!��#�n��J�LLX�
U=���]����mUybョ��IJ�V����ׅ�ѯ���&��wo�f 3�]��
.b�\U��/8C���b��t��6*E��Ku/;�T=󞌪��{�١\�Wm:�%�F��mg���7�&}�Iɪ�����{���{(3'uv0���<:�����RY�s��v�$��z��ݭ�16��ysv^O�)�����jۯs�C��7�?��q���]}�^f?���i@��o�2<6ij�$�<���S�@�K{l�0
hF}�S��~�z��}���?�rT�@�(��wΊ���ɘ���j�Q���0s����T��.��f𜱍|�F��z�Q��h���a�T�.���:=�܊j�#7�ϖ�^,�,���wM�$��[i�/͝!͈��:v%�u�^p�58���{,�[>�Z9��e��z�u��f�Bz�T~�r��1>w�(����JJ H��k96[`b狝9`�gkZ�ϲC�����
_�C-x���'��6�;�(����� ��j}���^�%ê�͡է��V�*<m	��SPn,���n�Wr�GL9����?^����!F�d�r�sa�ZTC�SK]8���UJ��HB�U�^]m�q��з��
�ި�]���P�Tҗ�0]=e��n�v���q{��:Q �~�%h˰s'e��Qk=p��C�k��!9Z�8�H��7�H���ݟ�V�޹ƹ�ɤ^x�Im0��)�!z�oNo[z��ýM�߽�A�[��3�u;f^J�V� %�PqT؞��j�vw.
GYF]޳�ЗJD���
:����~cW��~�Z�$,ې�-��{�0�˅���m��N�p��{��m���e�e�M�K=�{3R������#�eq�#�ڱ�ӔZD����{�qLi���ؒì,fK+q�(u"/���x��{c��;q8.hdぴ��w�TO�w4+�9T\/6c؉�o�{B���w�����>B��`[�+zY�]Y���|́x�|h�u2�ٛXh*���(�?���L�8W7���ՃD/�cY�C:��`~�S\~�Qg���FE����^��s_��Ҙ�
A����V 󜥑����,/�L�4\��̣>�ԼJ\��伤l�{W?"��*�?��d�n��:��s��@��ws����i|��z���Q��Ja��9�¾�D�{���+C7/���NaL��-��\���噼9%�^"�	��U���! �{Eţ�[;��Nn�xg ~��2<��3�rANEW��S90|��	zq%u(����2-�̙����=�WSBZ�oW�
+؄�C�A�d�����?M�d����T_pj����L��4D5rvl��C�2p���`�%X)�3��ħ7���j��%�@�rc��*��ˏ�ǟ~���y���o�WWW�>���~�֐R��b`�K�a���刼۱`K��v�2r���Xh�������T�*��
3�����Y/����y]��e���L�V�f. b<�\�
�F���'��,����m�Q�
����\+�/��um�2Z����@�aоT�	��䢇�4��h����^Ay���?���}�5��Z
�0�'	�εL3�Jڅ�my�-֏�-��$�����N�i6DB���iL�![�>_ѩ���1!�����=���*�k=m��3��6A0�PKEePQ�vj��W,pip/_vendor/html5lib/treewalkers/__init__.py�Xߏ�6~�_��8��`�c�(��ak�5�:\�@g+�Y�,�Ҭ�>R�o;���wI$�#E~��a�b-%���
�R������9�B��s]����\Y8�Tl�v\ղ����������׆C�#x��;�
���o���<V�3ˁ!Ñ�ϝ;?�=e��vO��U��:i&yJ�uu��'<D�D�n��wЏX�{rT�	��l�b��`}|)�S$p܋x����0FK|�w���� ��1L�q�x�2V��C5�0�m�S�l������#�b�o��)��^�w
��N�F:Ҕ�y���3��Q��Ma�4�v·��v��A��`���n��M��)�Y�e�u��ׯY�Y\—�A t�"\a��PǔQ��������G���,���gN�k�'��x*޳\�¸�*�pvw��v&�"�cn��`l�G9�R��A8:�B��
��e0-Š{>�;4z���(u�dA��"���C��4\�
�?�r���P��՛_{Ah���KO
�Y����3m��X��i̤8��BblY�!:(}TT�G�|�n�8�{�B�[��d�t�c+�6���o2+R����u���㙽@?���!��Vʺ'�����l�~�N���j��9Хι��"�>&O��L
W���F�ט�J�0����8�F5���@��uM�A�V7��(<��ڄ�1S��N���6��\6��HyU��ݱ,��s��X��/����)��^�~�e�˒�-���R��vv{������h�R�q�7Zq��^�b�^�2���v�ݐ����|(�÷���#F���E}��D�r�޵�}
>|X��7�A�?�{9}��D#	q���o�;_�,Oi/2Nj�b񫓋�.���~�J�^�	��}&�݄wa���¿�=�Y��q����_��=�q��QjC���m�vL��|N�	�-���oC��;�D���
4]��2�ϭ�I7Cw�دp-*
%̲p=i���r�� C��	|�/�礳���*�M��cצ;H՛��?{�y����f�x�T�'p�훷�;��ʩ�Ճ���bSf-�*@6+,MԾ���7�Gn<���u,q��s	�)��;�}�Y���Q�o�̞�s��Oq@޹a�O��mb~�v�Y~�l��y�anýŞ�id��>%&h+>���KG�·C�@Xw�!�@֍���\�� R44��2?o����u�<��6��~�2/��B��<��hҵX��%��K7éS��P?%)��XR�	G[��"�^+>��uo:���MAj|�s�M� N�&#�6ǧ��D��(Cj��d�%C�3��9��y�Ԡ5�8�F����1\�P��@h@�+���o�3*��#�S0\ng�tO1�QM>u{I��⌨؛�jm�u/л�)�=�a�<��0�0��UO�z����J�>{�O>���N���dLj���y����Ϸ7�~H��/B��Y"6��I/P��1���eN�rR�jũ�H��u2Vc
�2��߰6G����0R�yG����y��%�����u�[3�7��lӻ��c��|��u?1<-�Y�90{]�X�g�v�<����M&%8�sJ����	,��ԧo�\�Q���~/�QҺ��b�#�S�_�GU�>H��PKEePQ!-�B4(pip/_vendor/html5lib/treewalkers/base.py��n�6�]_���W���",��m��NѸ� �i���Ȓ!QI�"��sx�H����ż�����*K�d>_���|N�v�f��e�ƅ`s5����Ɉ	ӈ�c.XF���VH��6G�	LDm��a��&"7�	ݲ|GC���mʣI̶�GD��nhFC���s� �1���.N?��Lg���x������_ri�vbvO/ޙ!���>�����ŧ�?�H�����O4�a�L���,��ڹ�<�$A��f>�^�M<-NcJi�q�V��fCO՞V���ƓZ�hr�v����LO����W3-��/)O�j;C��˜�9�,p�.��Pi;�q9'�!���O�D�7,�!�L�	�O�
��dCo�.�~��Btp=��^��0�{$]�X���Ǟ�/#����	�Q���Hʣ�Ԑ������:^	�l-���)�0ϦR���X�Khϖ̧%�d�(�8J�ow*�Y4ɲ4�PN��|�*�%�hR�DA*c�;.6R�5DkB �r�f5݀�RMa6�2����d�1��M*�6P(䛏N�⻨�Hv�����v'�gt�5-ˀ�"�"�����Qƒ�WPaX�=&�d]\�{�@Y���R8/^�@g� !�![�T��)O�`�
�|Y��.
���5dK��m�d��CR&`[S�X�j�BZ�̮k��Cʁa�MZ�Q2*�B͢-��i�^�Q�����@�&���4J�k��iɇr���8XJ"��*��?�L)�
x���
F8�2�/;#�\j�y�U�ߡO�k$���`84��PU�$�t]_��h��˪�k���
�Y�2�`_�6(�ˊ��6�&��v��ہ��PO�`]`"͂\F�N�K�`U�y�4���bQc
=�],�%�z\�~��W��n�9999!�9݈m�[̗�D���A>^R8�u�j�u��k8w	�\�2�ڇ/E.H��W�/G����V�uu=l��<G
x,�4]����i�}+�A@pZ�L�A�⃇�X�e�\�&J1y>�������'�Oo�g��/O'�r��
�
�o�0��z�)���W��-��8~\��Wd�"���-�����q�C��5{y��аWA̒#�����"5�|�-"��V�wyYm�>ԅWL:������9pdV��R�
��~Cr|�$�U\�t�G����S�zJUѧ)��^��SE�X*��3�ZG��e����C����m��[�3E��jk�K}ݰ�l�&�`�k����H	f�ed(3t��Že��Va���:�mF�$��A�Z�oiQ$7Iz�5҈��U�
ԿѰJ^���vk��������%�j�P�5��r��qn	��[<�yš��k�P���r�!�����yO��#5{2��7
0��
E�|)��́�./�Xܢ)�25_X$��}?������r����Z�+$`ȧ�/��/+��1�/zA#��릩�?k�C��-z���$�*s��s�I�����mpԏ�M�W]ue�l��h�6G�N뚔Y�^��^��e��C��ȋ(k���kٴM�~ԧA+���R���u��R�V��b�C���D��}q���{��t#U��QT�˽��u=�8ޤ�q��N�̀������	�UY��zd��r�.�CK_C��B���
�!Q��Ěl���f�&{��~@!��VW*5�����'MyPA3��8QK��[D��|Zn���ƍ�.�e��M�nR�#vHX]�ސ�m*{#�)����ko��Q����PKEePQe�o���'pip/_vendor/html5lib/treewalkers/dom.py�T�n�0��+x�BP�CV
�
8rӢ(Z%D�$e�(��%ij�b��A�̛�7Y��BYVv��e�Um#���NAv�Ǩ`G&YSc��,o
�8S (��W�����~;�!�������J�R�D�+��C��;�;!�F_��CzP�gP�t�2.}	�Ĩ��1����Gzj�VVI�I��}L�,��g$��c�Yt��Uh����}�݁�|[�_y�
�m�
L�X�|� ���vc|Vm��:{��t���K2�xd�Fy7����6�e�T)!�
��33���.#�3�|�k,��A��p�~p��'�|�{��C��8�E��m�Ʋ�9�w�%��@�3orʉ���k:�]��ps=��GU��\����
=�Q���_��!_��^/L�L����Qr���9r���a��34��v�[��O�ߟ.�gy]ve*zO����.oz1�1!�-�����倝QxS�L�c�z�H���^Ss��PKEePQ���C��)pip/_vendor/html5lib/treewalkers/etree.py�Xmo�6��_��_�N�v��z@�8E�%)2�`d#�m"�Hʍ1�ٖ�R`�6!�e���ޑ����Y�,kS+H&�T��[]��@�|�X&6B���X]��� �€�R{ޒ0�RJH
���Je� ;��ܐg^�*N6Pd����o]�Q�X%f[A�s�\������ˬ�p�SS����<�W���Wl����+!!�
~�y~
�7�z��������
�ZH��$�P:ϫ����c��ӛG�Q�}ۓ2����[�f���c��Y�Tr�����2#!�˲���VZl�a.<f�5��R�8��J��E�!;�p%����O�]0�VqeDZK�v2SP)�m2�
+{/è4%�Rd�ָ��k����/�����>㚙A4�"��Xb�_Я�K��`�c���l���p�A��a�]3/��Y����)H��b)���w|���#�O�ȓ)h���]?~O�K�W�7po�?��>Ck\�&@����ҐhS��Ɇ(v��(�bG���\�g�$�f���1O�t�A.#��o� C��3ǔ2���ij��K���~`)��4m�������Y��6���Ӣ`���{�ڧ)�������ƨ�F$�p���a8�
Sb��KQ�&Xsm�-����9���	��8m�dO�N~��]Γ뫫9e�
�]�D/C���o=��X �ѦS�x���?>�~��$���D�µiS��_շR��YE�Q��r}���8J�2=����?0�2�踁�{uN<��#��n���^�C;�&�:���[�ث�(��v�Ҿo�M�Ɗy8�b;�H8T̚��1�AW<����fm�*�J/�	Ah42]G���@d���c���4��
�5��L
m
B��x�ȑ��f0.#���q;�' �Q_��]�`XK{g\�^R7�
<��Ӝ��g��w�{�Cm��I(��!�"]��ҝgBis��[�7Uf�?bw���1���a՞�X#��y;�y��8�
�B;vV�GO��4FI#6-�si��tg���(����^��P�
L��'B���� cǤA���\��b<�ѯZ�Q�"kx5u��m�L�Å���UЙ/�&7!;b�G#�����ذ�ϔ�g�I��O��E�����}��#I>�{T�ퟪ�n/H�?��<ܥ��>��e]�C!�<y:n4�c�
mq�%�z�L���絿B\؟4�J7��F��[E�
PKEePQ0Dty�.pip/_vendor/html5lib/treewalkers/etree_lxml.py�X[o�6~�� \t�0Gh��-��
�i�yh��h���Ғ@R���w�)Qv��e�Y<���w��F{�$�JW�%	���е*D�Yb��I�\�"��*�i��Dp�$j�A���qr`yV�X�c���Q'�T��K!X�H5"�d�$��y�k!q܋f�iɘ}������v�M$۲cYc��ʚ�f�}���b2�dlCX��J˙�n&>|C�DE���7��x��K�	�br�i����wG�j��QCDgi�M�J9����N�ؘ
��PzV��kl�=Ix�u���9�싯b&؞���u�j�>%�a�y5i״<u05L�Y��|S�<��T�/�}�nL��bv_�H��r�r��x�1AIN�,�.pe�<Mx�}��Ii�O*)�(j�1e�&��3��k!e!}K��7�#Ƌ���[�n�/�(f���J�"��нp@�*�q�`��Jtn��6�cSdڬ�(͂�0���;M�|f�@���=�Ȫ�hA��f;��z���u��M�\Jp�@ǜ`��I�sRGq��J�F�� 
���V�g_��D�����g�t�j�|�t�e�M�3�h��'�-�
�G��*]͈l
i	�[�U���V�w�ƘK!����lN@�\|xҾh��m_C[�QE����Ĝ��þ��^���Z�,9��k�g�h��8l�%?h,]6a���	-�3
�XK9���Q�8�]�UM
c��#;�T��:cG�2�R��L�F2"W��?o�m��3*�H�Wg()�__q��^�M�uQ��
��-�>�%b��J��y��E�R3�⹞`��)�I����#�!�q����,���֭�����^��^�7Wt-�-��l�s�]�����n�t�.�͉�J�r�)!w]UL%���C�W�}��,�!�@=�`��/�.`�����x0+3?!B��
�snF���]W�t���װ�c� U���[��ap�UhI�)�M�S��ZLE I̥�@�u�E�g䥚��JpC�r񴜻��)o�m�3���JV�iͽ-l�߿�����q9��TPa�k�������<:#���a�{�:qD(��nӑ�𾝞1l@������=���[{5��=0�}���oo�%�E��4�o��FП�o��W�x�-�?O�$6D���K7�o�g�Y3�B3�9�'R_f=�=����� 6�f��6�+و/���)�"�a��,�R����(B`i>7d���G��Jz��i��@E�0�2[<j��1�_�;
�ٳ��$}9��	�WC�Q���ǝ��y��?��
�~�)�V���f�v������0�W��/l:9�4�izڋGX��+ÿ&���ӛ^@~%������ \*���
�.�XxF�_�w���2��:�\��V7_�qe+.�MAĆt����(��ڿz?��v&��S���y[s2�����|a$�9��RP����G���pW��)I`@V)4#��5K)b5�{��i�0`���@�/�N�<X��Ӵ�N��_��������� �Mg���G��4���z�ԯ��d`Z����׻�6T�5M?c�L�B�R)S@�v8m����{e���u/��
PKEePQ_m�	*pip/_vendor/html5lib/treewalkers/genshi.py�U�n�0��+��0g��: �,�a��v��u(
C��T�,�����m'�k{Mu�%��|䓔:�(JK[E �.,��ei1��qFhŠT"�	FRX,�4�IJ;T�Q�b]���8�{.~�����ͷh�جo��5���2�u�~�m��h{SaT�ze�Z��z�����`y�٬�a����
��2�+k��-������=��q�Ēa�������f�|�yn$���R��(0(�f��;�R�)`�@A�hxB���=�Um�ZJ�$��“����Х�9l��T5�S̙ui�qi��u��F��fu����	�5��x(�����^�O����zo)�mM_(.k����Y�Ȟ���?u�q&���S���gB%�p�D'v^�d�y-�n\�w���x��Hg��֝�L�K��*�6V�y������$jc��۫[��@ek��%rdܝP�g^�!��Y����4�w	z((̀>G�����z)}�Ns�X�]>�\^�w-����w�9��}�.���/��ٌ8i
\D��}���9]sn�M@�rvy�nBm]�wj(�y�m_Pz'�Q�<�{:g�2V~������R8*���x�JX�Ql^�.���B�e��Wo;�����y�G�Ltl��|M���=�{D��R�b�I�T��y�2��T@IN'�PKEePQG\�3:pip/_vendor/idna/__init__.pyK+��U�+HL�NLO�OI,IT��-�/*Q��/K-*��ϋ��J�J�/J��jqPKEePQ�H���pip/_vendor/idna/codec.py�WKo�@��W,�j�$�|(m�����T��'�6��>T
⿳�ď�EZQ�C��|3��x��|���@d�r���א��S|4G:��O/��"
V��/Q�Ҍ��U͕\�ХY6I�-����z�g�7��o�m��f����M�EQE����FM}����Q��UCH�hc�b�s��,��T�Cۋ4��^�h����H�jK�+&uk+��;�
f5%l����ٯe
[�R;�	W��(
(-���:xX
EY�,G���U�ɋ�ZO��:,�o��l�)L/\��nW�7{ԇ�l����֡V�5�a���ƥ�q=7�Ҍ�x�
�R�Bwhe�Z&d|t��3�Xü��7]�>��'�&Er���B�@C
���G�#@�Z��c%��{����1
vA͂"�
 ߍ��Px��Gj�m^��]���J��j�l�`�x K�d&��m�N�Ԧ�3��O�F?��r��$�Z����ȕ�n���AW�F�/�����fP�_����T�> y�;���>�?�v@L����f[�����6�]��WG�Jq�[X�]��G��6�*΋~R"	�
��+�y{�l����@G[�}�R�[@��g�E�3��&�����+d
c,+B�l���Zf�:�����O.q�Y$n�\?��%�T� �h�;���`\�Ma�Z�2��~�ӛ�V��`�k�y�}��b�м`
O�50��2!5�I�
�;�����7{qݛ�߂n�:����<<�M�}�<H|��w�we��c�pM*��,�
PKEePQ|��p��pip/_vendor/idna/compat.py]�;�0��b��P��
�E@�&
p��H�l���ܟD��g��y3
G:, 3�Ҿ7�0|`�0҃��Z���\�r�%�:�>�~&�E�%��>"����	Աژ"���DXLm�]KǦ9�cL�XiVV�d(+�PKEePQ�4,,�.pip/_vendor/idna/core.py�ko�8�� �
'N�נ^�M�m��tѦ����%��F�t�����o��DR��ݻ��8E�{�3CF,]�1��,e9�a�C��~^RN��|*�!1'0R�⏼I`4�NV�WPˁE�&9�I�����1��4��jĘs4G�z�%�#}������F^o�	X�i���+F�"�1�՗b29$_�)��RDф�����z44���4M4�ҫ�5�i��'=
��U#7��S�}u�⌱�
>���W ��>z�9A�! YxP�2��X��V�@w�s���˘��X)!d��g�zIC��U�
dg�����B�@c0�c@���$�9� �$=���v���ix
�e)(n�����=@v�D<����(G��)
y�	{~Cl,�K	
O����$"$rmqd�X�a��j�@���˙`c0y�&j����&��z��0N�>�P�5�Jn��>+�9a�1`_!g$/X��4;�/x�h��!R?5*=�ᗃ����a�j�R��}
<+�G�~�m�|,M��r�W.)@�t��ӯ����oxcp�53�>�
*�$Y�7�JYðC?�ٴ���ǜ��.YA,���B�&�!��XC���68<>��\D:<��{Qܐ�v!\�$@��9��u%
? +b���&-bp�$~DK�p��©E��<!�S�>\�צ�%$�L�L��MĪ
���FF�bM8rIف�Zj����0'��Es�y��>*�czK�/p4�T�*%�,_�o�FH����W��A�J_' ��,�TR���6GF2��.�����]y�!�^�����fΒ�T���8	�Pe
cR��X:���	v�*ju0b��r�n7�yk��a�m��k�xnFrS=�ށ�;*<�b�R[�R�[�:I��kRֽ$l�?f���逄\�uyh��6����L}ߧ��R|���/���w�]v*D��^!�ZA�ˀ���]��<�$ʕ+�����<uy��Wq�t�eW[~�}2WB�
���6⏶_i��b�^��s�Ƕ�
Ac��k.&�J��i��S�H�א�+߈��ɻ���|�@S��;��wc�A���x/{�m1��n��km�ܗ�	[��0��{�� �dfQ�ޞ��]	d�9űN�	kdVJ�y���zg��ؕL�k�-��d%�$I5�uM�N�����7�|�AE�Ho���$���H��V�n07�*[�ה�2K8zK��|��~��Q
�ʱ���v+��C @�Z@��-�H�`���"1�T
�O��uf
�*�F"d �
Kk
O�Գ�]�^�� ��� [܉b�_�?JV�گ��@i�p8�'�^��$����()-h��}_�h��.7��?��E�ld�7l��!RN��{�0�}����q>^�ܠ�^;�
���(az���dB(�&N�r!�(A�{�y�_�<�%J�!P|���[KQ¤�[��6+��d��YW��gr���Ց_z��.��.�V�HDŽfI� 2�;}v��wT�L�?Z]�	z.%��0��ACh-2*��M�3��3�]fM�?��z����X}��Vg4�W6����5���h;��bk�5(nX�&�F��7|�~_���hyb�� ��ކ���*<�ގ�-�\��;�@�
8�
'��Dܷ�u��
N�"�63y����,�����E�#	C�+��,z�I���hIZ�FZ�i�6�f�D��PIt���r�\s�Ugb�|�	�%�3��}�l?�㐨Vm�G��	d�v+�����3ф�坊{N�g�ٱ�#����kۻ1N�uz��~w9�hxW��S��~����+��1���I#�V$��/.�~����&g��=�Mɭ���`�a��K*�/�[�,=�ިP��úE��9P-��}_&R&�Eg�P��q���tw��F���?�T�>��oac?�x�0�6]��u�E��Ⱦ��Wn���.� ��4D�t�I�i�c��@�-���9;h��[��;~a�qk�
gYm[��y��8MV�B��S�I'��t�A�uTm+�/RPUV�el/��fo��\Q������j��m����.;�_�QH(Z@��s{m���Lg�m�q�I�؅㰁�&���������Jd��k��[r��~��X81�#-�$E�jC�tE��>����Ez�k�i�kk������vu5��@�A�\��tRN1�7`h�ݜ���q6�5�6C��p����s�E���D�SWU���?��U�$�3���>I�Aٔ��ˏG3qo% �c5.�R��?� �ŕ��9)-r("��U�ˈLO%z@���)�XHj��	���B�g�@YRre��U��Ϥ��Myj��-D�P��P��?��/KC
�Z^���ʙ�V����c�:�.��rH&�Su��"MߠD5G��}�Lknc�zկΝMk�wY;��֦'�L�(���]2�(�Υ��PdT�H��(LB���j+�;1��d	h#;�M�4�'�m�;�Ƀ
W�(��N�_�>�5��԰����Y��M��)�N�*?Qɚ���tM��_&fz��C��\���r��vz�5ڵ��|�f.<���/�x��=%
�\3s�0�$_�=���ܺċX]]����~���YL!}��S�<�ޤ^�+n�-�W�E��<�H{����?�j66�v����5Y���HQIK�m��q�,$�6�L�8�`�/�n�k��	�s�˼�c�Yzz>�7XǞl��$K�m7�x�Z'�����"����}I��~��?�E���B{��lv�*=��\������g:���g
϶ޢ�6�PKEePQ׬J4o#n�pip/_vendor/idna/idnadata.py�}K�%7��^��0^������6��Nj��|d�<�Ԑd{F�w3/��Α��
��c�F���|��������.����_>���?��a�d�������/?��������_�o����~����}��_~�+��믾�y��O���I��O�߷���ۿ��O_����\���F�re����|r��\#ȉ����
rg�y2y�y"[8�����x�&��_Pvٙ��g���g�}�}p�x��]f���/�{�>��#~�	�OU�
tz}}�����"����~�s��gd�|���[�y�K�F?��5ݻ3��$U��_��%�r/��e����`N4����O���]��ͯFò��o����-&���z�ߥ���n�7��z��"�Q�x^���7��w;��2��m��j��V�����r3lyRO=�^��&��P�UڄWo~,��a��X��۸�T���e�W�i�_��^ҾҠQ8��&/�i�QN��ww���=��1����f��]z���1z����?���	�P���j�Ѝ��F�w�߱�^Z��ᷭ��c�O{�����d�t�\r���y �P/t?Ag��!���f��.Ӌ;�T���r"��,r�`�/��?��?~�˟���L��?��,�TW=WW#WW+W;U�~��S���K5p5r5q5sυ[+�6n5n�\\�\]\���pq�q��
��
�����o(\e~C�*�����70��j|Ʒ|�:n�\e~#����F�7V�dd~#󛙅�,��cTX'��u�d��N�˜c.<F�Ǩ�f�0����cTy�*�Q�1�<F�Ǩ�U���`5�v��N�.��;�l<��Ƿ�6�9�Ƿ�6��6��6����x|�o��5_��5_��5_��5_��5�gc}6�ט_c~��5�ט��v�3�����og~;�ۙ��v�3�����og~;�ۙ��<�����<X���`}�σ�y�;�����w0������;�����d~'38'���vc�so��G�f�n�r=]ŏ��!+�ƨ��������Z�Z�ڸj�s������⮘_��w\e~=��_����Z���ƭƭ̯���_Wد+qr�Y8���X8���X8���X8���X8�r��!�pR�*+Cb�$�71�����of~3���f�73���ͬ��?3���!3��1�Ka~ف,��e���U�0���-���Ǘ��da��Y؁,�@��=�M}�3��2�g6��M}�,�ɚ3Ys&Kr�$'Kr��L֜�N�w2������d~���.�w1���]��b~�����5]�4�U^�U^�U^�U^�U^�՘�����?n�j�ڹ:�:���JcT�zW�ޕ�we�]�ݕ�wM�ob~�ݕ�jʹsR٨V6���je�Z��uW��j�,�L�H�G�G�G�G�G�G�G�G�G�G5ٹ:�J.b�ŭ���,힫�//=*�5*�5*�5j�Q�F�F�F�F�F�F� �5*�5�`38x@�;��E;��^Y���]'����;�{��G�'�g�>��&u�z��������� ��?�A������� ��?�A�������(�G�?
�Q��������(�G�?
�Q��������$�'�?	�I�O����$�'�?	�I�O����,�g�?�Y������,�g�?�Y������"���E�/����_��"�׋�suR�_�ԣ���-���.x���2Uƣ�xT�*�Qe<��G��h2Mƣ�x4�&�ф�&�7�	�M�o����߄�M�7�߄�M�7�߄�yw�_�Z�v}~�_���U;�л^�^�޾���O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&�槒���|p/T�S�WBPBTm�?���-����h�SB�?J�_s���qa^JpJ�JPyL��=���"Hyg�!4%����B_��[K�c�<dɹ	�c+�(ҥH�T�"]2r�
�^����/��"*!)!kE	U	M�0�EW��?�����Py4�GSy�3SBW�3fK	7��|b���y�ə�WBPBTBRBVBQBUBS�)�+a(a*a)A^��.%�<��é<��é<��é<��é<��é<��é<��é<��ë<���)�N�-�6��� ���MHJ�J(J�JhJ0%t%%L%,%�L��*���*Ө���;i�I;M�i�{wEڝ<�k�];��4)!+��St�z�?1%��u�>�Ot于ܸ�:h��������CGN�{�<�A��A��j��}e�\@�6a0a��G���������L	]	C	S	K	���é<��é<��é<��é<��é<��é<��é<��é<��ë<��ë<��ë<��ë<��ë<��ë<��ë<��ë<��#�<��#�<��#�<��#�<��#�<��#�<��#�<��#�<��#�<��#�<�=�g�/ߌ�ӏ�����W��������7�x����y-���O��U(sb"��d��IV��@�L s؅�KR�
ȕ�
d�(�:ȜGvM�9��:�lCOd܎q;�v�����9�v���c��q�q;��@��8ϸ=p{���3nܞq{��7g�9ܞqC�+�C"�$�p�00@d��Иl sFf O&/�9�("�(r�Q� s��ɐ���d�
�F�*��"D%��J,�Q%U�'�	&�`�%Y4a�%W4���"��I�h�̸aM���f�Ό;�def�Ό;w��B�Ό;7�(�ܜ��
p�]������]a��9��!�ڱ�u[Xc4���]�\弱
��V�׮��"��UU�K�%i�q�
��x�i̎Aޜ�����1<��v��1���A!�wR�$!�@�;LAgS�|�Gv<r0;2,L�n�N�1���'N8!�ɢ�Ք�v('�:8n�0�����r1�c�x,ޝ��΂`���by/�{1ndܺ���L/��x�-��x䭙� K�y��zxJ�=%Oɳ���)y��<<%Ϟ�����S��<{J��gO��S��)yxJ�=%Oɳ���)y��<<%Ϟ�����S�x1={Jo���oxJ�=%Oɳ���)y��<<%Ϟ�����S��<{J��gO��S��)yxJ�=%Oɳ�䑇�ك��}<�>�`��i��}<�>>���\Fp��pr<;9N�g'���٢!2����9;���\.�r-�9c�:�B�o0��/D�$�v����B���U
ȕ�d^��h��hЂ�P�2�Dߓ��
d>�a�|�F�Hzgk`�[�k����9,�<�}`k`�[�k��X���>�����>�Q"�@>r#`I��d<���P��^o�����z#{�^od�7���Fx�����7���F�z#��Ȋ�ȑ9B�#+r�������p�
���q��!✡���
ܕq����T<��#+�^o�xd�G⌏��
�l,*�ȑ}�� ���:G>%&6�f�:6��%bn>}#�ю�hG8ڑ�G;��qK4�m�m�ۀ����;��
�yn��;���w�θ;pwƍy'v�݁���'>v�݁[����rbr�0��ܘl w&��Va���d"O�g�8!X>�)N�$��w"�;�N�y'bމ<�D�;�睈y'.9��yމ�w"�;�N�y'bމ<�D�;�睈y'�1�D�w"���N���O>���"OGk��k�x�͸�T��T���"/U"�*��*K��K���J�J�R%�R%a��x���TI�TIX�$^�$,U/U�*��*	K��K���J�J�R%�R%a��x���TI�TIX�$^�$,U/U�*��*	K��K���J�J�R%�R%a��x���TI�TIX�$^�$,U/U�*��*	K��K����Ļ���+�	;P�w�>N�b�`c��4��m&G�Y&2�G��E}�?�dG��8�,�*#����nb��"�B�@�����f��<'���H�y��!���!~���O$v
�o�']lT^��R�=)lO�QyUV
yU�^�ѐW�����o�o�Dzb�<7T�
�����-o�(����� ��;�
;��O�l�/����;�
;���[� & �-���i�Z4�}c��2-$&��z{ȳk[@�sZ���M�^ �#
��Lb�I��L>�5G�2�u�ĥ�#X���AL�#�����6٘<@�L>\�,�U�?�O�7J�}�?�X�#?k� 3���5֠�����/lk���5�X������Xc
kl�
k�
����a��w�
k���56���y�P�Ϊ١���L>쬚��Y5;T��jv�f�H�fg��A9˱C�:+[��uV������cǗ���C�:����y�q>��L�#��ߎ�};[͎P�W���޸��4ذ���p7� >)u㾡V��w���X�u6�˷Ί����Y�;,rg�ܡȝ3�5X5�uV��`��jV���6�g:X�FD'�l�6Rar��
^�up@� V��`eP��S�
V�el��`�6`�+Āe<�3X!b�B8~�?�	ܓ�Q��o@O��	V���[��5���d��P��
1��bB!&��t���g�Ly��}M��O�'f��
1����
���;��4y;h�}��T��k�N��O޲�\��ۉ���G~������!�<���N�YX���>g?/�Y��vU�ŋ�y��}��_|��ϿxX�BX�%��%�xKraKr�����~����ѵ��\x/ڂAY�^b��Z����^.��m�1��LZ��ᯛw0����^��덈�;T&7�����f��F���o|�#�B�#�ovXo�)�l�oX{9���_w&�qg�	��.��7/�oX���fn�'7��
ռ9��n��o8"w���!�r��q��2��q�n�
���,�v:?�|�"c��D`J��;S�����c���v�	�t^B��N�	Ed��
��Џ�y�x	d���H���F	��gݲK����9B�#.��g��!��#�8�Xtxb�u��B��$��8����Յ&�w줄��39�̯ڮ��~�_w�g��uy	���++vY�`<��;��+���
B��R�w���,Г"|���˿��R��<K:��(r�E9�.%�	�d�����0'̫�:�P���x����Uw�&'�D�I�/6v)��&���޹K��MB����5�p��K�c�Й�S�[��C�I̥���Ϊ��aM���%�/�|�r	����=�Xa�.v���竿뢟����9�=n�G�S�K��'C��8F�A'�
�/>"E�ǵ9>C]~�'k��:�C�H�y���l��(1}�|)sK�58˻����k��x&�]JP��K�j<�v)a����5��y��x���L�;�̆�_Rn�X2�,��ܰ�]Z��}\�%�a9���_2�~IqX�%�ay�$��_��~���_��y�>�������_R V~yW� ��-y�V� ��G��?
��Q�G�k�V�(�#�Y��.إ%��/�+��O���'���@��K��u[��u��?m��p���me�4���_�(V~I�X�%�be�T���$�be�}�?\�M�
�K:�*�/��*�/	���;���/�_~���%�-64v)�+�K�Ū�/������X���/�U�_��Հ�	��M�7�?g�=�]�s�+W=-�s%�c�+y��q��㰻�K��An&8
rr�&9ˀ���]�w��u�����.�;�K���/��?��5�������˺u
�����k������?��)�'��:kM��%�5�_�k�\K�p-�ښ���0�5f���,��d���
��_�a�k>�~M�Y�/�-.���-�o�ź�_֕��[��/~�z��\���$�f�>�[�j|������ﱞ�Swc}�k9�M�+o�g��K�<�>��a:lb:���u\wY��qM��`�s�]�t^�~�6����S��>����Əd(Y'~��S�}�{��� ����Oz�wg��K��|��%_"9�G3x���w�R3R�E��&t�}��9,��E�{��]
�����Q�O�~*�a����.���U�
tz]�LЗ��Cg�eׁ�	��M�7�o���
��>ց�XG�
���o�o�߀_� 5�7�o�o�߀���	~~��&�
�%!kt��������.�;�w�߁���C��׌��C���������?��!��O�?�_R���)�'�O�?�
�	�S�O����;&�/���	��K�؂=���q�����Ǎ~���q'S27���e���B��Y~։^"<ҧw��
:�/H�إ���]~��G�*�u�~��~)��߿s'%M�Z^�������9~u�̉S�%��W7�����M�<��_<W��Ň� �|Hn�w�	�Gޗ���EE2�[��d ��|I�'";3�O�w�@�BO�g�Ы��&��♠/�߇�u�����'���?	��I�'�O�?�	���O���,�3�g����s�������,�3��y���
���
���U����
���U�W�*���W_U���Kb�s�&��Kpsn���&��7�߀�	��M���K�Gv����b����z=
=�����
��nB��OЗЏ�K�8���)�%g�8%���3g�8������,��E�g��,b?�g�Y`?����Y�~"g������,��E�g�����]~������,��E�g��,b?�g�Y`?����Y�~��"���~������,��E�g��,b?�gɂ?���R���av�@�B�O����v��.��E�p�.b��p�����'��J[�Z`W����Z�~��"���~������,
��d\�f�Ӏ�����r3�o�o�߀��O<�w鿣�.�w�/	4�C>]��!�.��3π���/v)z2��C����R��C�2��H�K�7[��&��1�#v��A��U�S�F�.�Џܚ�k�$�&��K�8�g׏�%N�j����Y(L�4=�]r��k2+��q���Y��R�NM�����K��R�Tz����w�w��Wz]���t��4dH����ߟ��]��w�KIE;�5�nl-	�6���u���8�]&�߇��~���я�~���K������w/DC�z���[��1�h�<
^#�_C�K9��:{O���>
Q����A×χ	��S����Z�v��إ��+y5,ixv$�i��CԿxF����h�+��+nи��A>�n�{�/�W�xD�
��z��{�8
��#�\Np�m�$�*>�]%����%��&d4���}"q���U�д�NCпx�>�R�*Z�p�M8*Zn�*쮊�r�U�W�3�BD�<�}0rs��� �aW�Û�%l�:
Op!�[��BBCц#+s�!����N���I�~ʮ
G�.Į񽗁s����׽O�TK|<�n��vU|D��|�epu	ӹ������C�䝸1�D��.E��4�	�yJ��.��y��}�N�������	��:�ϸ9Sk�~ȧ_���Dmx���`qix���k �4��\�l
�RN�~ �$!�=)�QQwΘ~J9/!�N�v'��)�A$�87��Gww9�a�9�՝駔�@��zF�9�s�:�	
�4��E*�6�6��ML��x�d��򧔡}��mBB�Ԇ�p��q�
^PA��u�S���k+l�rv�&4���/D�p?v������!=J�p����*x�D�8D���D
!ƻ4m8
'�/:�ϾK�nۄ��a�N0��&�J�	Gw�dv�4� �c����nBD����.+��r��=a&O)񾫠8�nqge�����x=W}K^���}ޏ&>�&44�6���*�v��]jW��	
M�kТ>bo*��/��z僝�YN�yh���Mh�1���L���u6�?J��\�M�hM���L��6�j8|�۟�ӠJ��]
�Q��������	~٥�}ܝ1U��Y�Ҵ�T>f04tmhX�p�z�x 4u���	�߄���
@UEκK�

�tw���Ną{B7��.%�:b�A��w2��Q8<wO8^n�x_��Ň�02���g�l��ᗱإ��P�l��K~?��%��.�:��g����!c��Ȱ	�4�k���Ԅ�����c��8�KI6�4�v�Е��|��K	�nw)�d`h���H�%��ۧ�r�$�vxȻҐ�i�́���e������M�_YAvdr�R�"$�KL�C�h�������ioi�+?�)�4�v̟Rn����d�7��M}��wY���פ�5VO��fI��%�2iCF���	��JX�̵�(>�� ��p��ž<rY��_P�Ue�%�F����^
M��>�h��HظeGF��{�9
�.��pb�{�+p�K�O��}/}x���g)p����/�����Q�����.�o������7�N��	�
1���$����,р-�'��_���PKEePQ�c���pip/_vendor/idna/intranges.py}TM��0��W�X�JD�����j��V{C(2K���Nٕ��;cB�vs���=��f��l���P��VZ�R9<��9t�Fz�L��qh����N�-��ۣ��V��Aل�,G�7\��C�
ZTN8��]�pԦK��:a\����r�G?~̠(���׆�*{���{@�fga�
"}"�_�F���7�m<-;�_i�O�םeE2�,��8�K��F��ꄶ:�U̒�O�=%@�^.�>�H%��R�W[G���[��W�U���vv84dH��+�2�e�M\�N��E�c�b	�5M�<���j�C�'{���:�k�`�:�cA�JX���#�e.����n�[��%�@k)W�}|�����_���f�ǭ�����3kX�~��J.�ߜ����,�'B��d�~ϸ%n�Y��-��әy�]�S?��N����j��+�)�he^>1�L��)��
y�t¸Yn���E��9�Yve�D&C��`T(I��B_OO���-#���:g��^�
�ܡ<?3"��/���b�%�_-�SH��L��X���N*��x���	�̠A+�|FbQ�����dAE�L���!�^s��_���ţ���$l~�3R#m
{R�uXKᐮ�hP�,I��{�J�@�mT|-9�ؗ,��c��F��@w�{y�PWd���Q�N�i;ǒ�����m���=6Rգ����V��ݤ�����h_�k������PKEePQ�k� pip/_vendor/idna/package_data.py��/K-*��ϋ�W�UP7�34P��PKEePQ>3IV�dpip/_vendor/idna/uts46data.py|�W�ו�O�V�LSӮ2�׌�'�dfD?�}�}otDw_
D/Z��͝@Yx���`ˀ�A���B����G���X��_�1j�2�d����k��r�?�����^x��痕�]��;o������]�꫿Z���?���w�n�O~��7�x����ח��s��Y���\��_�Ჷ�g���_���^~������\���}���?f�G��,��,���?)䅷�xm��O�g��w���~��?���/����G˾U���ﺾ���aُ�~��w=�~oY�����ݷ^_�/<�ˮ�Y�W�����|�wd�����w�]3���
�w��2'����6g���]��u���"+��
!�R��"+��
"����("+��
#�҈�8"+���#v5��#��<b+���#��<b+���#��<���Y��+�J���ق�TlA��lA�4lA��l��G�ʣb�Q���b�G�ʣj�G��<��_�Ͳw�j9���⟰��X�,����ϱ��X�<���/���X�"����/���X�2���⟲8],~�����WY�-���|��u��oГv-��� 8�-y��� �wX�.����� �_�8��,�����b[wk���lݭٺ[�u�n�n��r��r]l�߾ZԨS�Z��^��^��^��^��^��^OlAjڶ�z���~��4��kX�5���5�<V
+���G�ʣa�Ѱ�h�԰5�akP�֠��A���gD� �[P�5[P�
[д-[�؂��mAfr[P����G�ʣe�Ѳ�hYy��<ZV-+���G�ʣe�Ѳ�hYy��<ZV-+�䉇y�͖��ZMb�&�V�X�I��$�jk5I3��oWX�I�f#�X��X��<��?������K��ַ�VJih�b�6MzU��J�Ъ}:�r+��
0�O��,bq#[�Ԋ1
aC�heo�($�‡���:�v�?��=���A��fy���GX����<��c,!��Yb���f6��̶C��I>1��S,�y�4�Cd������AA�cy���Y���/�<��.�b944�rhh����%�CC�Y
]a�5����r�:�!�Q�C�c,��i�?�r��>{�2�ͭ�ɭ�ɭwέwέwέwέsɭs���+�6�ɭ#ɭ?�m��[�[WQXyV��Ga�QXyV��Ga�QXyV��Ga�QXyV��Ga�u�`�+��+�=����`��	�����)~0 ��,�
��jVxQW���
�R���	~�^�g���\#�u�'�r�*��5�\�pr� ם�\#�u�'�r�+��5�\8�F��N�1�zH��k���C��8�Ɛ�	N�1�zJ��k�� re�P�,D1$N�$C�8�W��_��X��F� ��*��,�	�A_�]	�����*�!�`\���Q%���`�jT	qϫ���E���n����.��W�mp"�
?�`[���W	�MP�,�'�	��Cq�Ug��~(��*R��;��ʇ���Nk��!9���Ӛ3{d?wZs�i�ŝ�\mDN�Cq�5g�H~(���Z�\ŝ֜\k���Ӛ�krw겅QrwZwr�C��N]v0�C��N]�0�C��N]�0�C��N]�0�C��,]1�C��,]*1j@�C�\��'��*��e��*ɥ��8�	��Cq�.�5�[�P�jù�Fp��[m8��n����i�����-1�f��G�6�t�A�I��t�m���& xۏ��6��m���! T�[�j�A����U�c�� �[�Z���W�
��h�ׂ�Bvk1Ø��1fi����r�oA��ZA��N
5�#�h�9Z��o�j{kX���-�X�4	2�H��˙F	���%O��V��ˢFI�'+�ފ�WoD	bQ��
I�G�[�[�Pa?�I�0?b�(r)�(
5��5�0?���Տ.	p!�]�B�4�����W�5�hB�ғϩGE��U	Ñ|]A��o�j9r}o"Ȝb��X�9����Y3�$�>�9�dA��72{��7�z��1�vKH���!N�cq.u�^,N���<T���I�d^�'�d.��B,�إ��<T��%$sy�(u�cq.�含�k����P	����Fܵ��EE�G�a(�?%�* !1y��
HhL��P	�wp)�����ͬ�b�o�`k^�\��������`�#xs@��y1r�7W�r����V��k�\����+�Z�&v���›8�#[xs�'ydon�$�l�����-��S��<��7wp�G���^N�����l���\�-�h�'Wdo��l��c�\�-�yB��+��7O	prE���N���<'�����8�"xsH��+R�7G8�V�g=�"kws\�micd�>�# �ӏq߇�ݭn6`����h��PK>���'��c#��*��҇�ʂ��-q.w#wwk�WY���%�����4T���B} \���Q�%��;^$}kL�A�ҥKO���Jʝ�3N����f	�!)�I!mi��D4���6���A9�Jy���Rt�K)�H���J5��oW�"s]*�+���n�㷫�S0e�7Qy�rsP��L#���!n25R��fU#�����K�U����U�F��;�5���lVi����֡T�<���E�C��|��sXiv��Ti�@�N����`�2PSi���!���X?� �ζ�4�c��N��vWA��z��敖��H�}*U�*ܧ���|*
A^��K`5�@�W�*�Gz��k z�i-�~T@>4 ��*��}:! (���">e�����mq`I��m����0ZI�"n����+ (�v������"n���J@P����"n�q{��U��eK|r�yA�n��R�3��H=i��32Pj��d���D�
�̴B�yfL4��[�[��9f��
p���n
�]��؀����!��C�p���[D
��	p-2T�OprE��)N��P�>#�����X�U���J�U�@%�Vt��+��&�U��RC(:9r7���,�m}�[�U�:��,�e�*EpͿ�K�L'μ��wt�U���lD{g�� �;�9k�L�N1S�+x�;[�Aw�	:��]@��wv���S@��wv	��[@�ȝ=���W@��w�	�3( h��~Acw�v�H�}vQ@��gC��>��و����.	��첀��Ϯ��쪀��Ϯ	��캀���F}|6& ��qA��= ���
A�1��"�vg�X�J��n����^��>��~����U`��>��}��X'��^�c���,U�V���<w	��rsy�`ۍ*���9&�6�U��sB�m����s��,W1������b.ϝsl�\�\�;�f���q8�C_E���xס��CG\���Wѡ�#����b.�q*n
a���7q�jr7�prm@��?N�� ׻�8�N��j�Kk�wEW���Xӽ+��wŶ��]1;殄	-���cߕֿ��:�w��w�^��Uߕ������w��w�]��Gߕ����]i�["WFH͎��w��o9ɣS}W���3SŜ����ܜ�*z�wū�93Ut��WsK��?���� V�q�+^�-C�b�]�jnM�h�WK�\���+^ͭL�"W�Z��T�]�j��+r�wū���Ud��Ws�*V%����%V1��x57Ŧ�Ոwū���ն�`V���Am���b�=	��v�K��I�Ӷݶ*�ݓ��m�mU,(�'�N��~�b-�=	r�6�SŬ�{ݸYEU$r�\�D�8��UK�n�\�D��8Z���"gsO���T���'���l����G�r6U�l�u9�*r6�č��M9�{�F]Φ���=q�.gSE�枸Q���"gsOܨ��T���'n��l����7�r6U�l�u9�*r6�č���U$k�uɚ*�5�č�)IULI�'nԭ9�b.�=q�n.RY�{�F]����H�č��HU�m�us�jH��_)�ʵ�L���$�V�8��f+Ր���'�J����V�5$e�`%_C6�ZV�5�a�`%_C��FN�H���,�I��[8�"�r�'W�X��������\�U��W��+�)�8�"�r��'W$P�����#�\�2�L��+r%�OprE��)N�Ȏ�?#��i���8�"r��'׊
�j�p}.��\��q��"p�W����~}.rDz�ϏQ��"�J��'�`�s�&J}~Z@��>eT��??+ �f��N0]���BF�sQ
�o|~Q�1$�}��>.	�>.�>��>�
�>�	�>��>F@c��q�DŽ��胍j
k&�B@���m����w��}�����
�����XH��~v���[/Y��Ϗ�+�V57
��R@5��S�%tjm;��V8�r�[.T�v��z��-��2�#�"ɦl�9�7��<�RG2�*��t�0(�ă5���2;���&�5��R��m�V�Bm�y���Πh��s
��6c���K�7+v�f�]Ss���7k�9u����,qפn/5���*o��������ZX���G��wX��0�ga��as�3�t�h�-�Zn=h�M�j�r���­���f�.��='�y�V�s5���M�l��v�ӵm��j�wn�ȯ�v{�lJ+s��!���EQ�!�������2(��s��%��;��=�Z���m}�e���~d�eM=q��$�JO\+��"��V����v�M?<9���@�An�!�Ó��l3���~�������T��%n[��j� q3铪����TmuJܶI�:ф^��#zœ;-�W<�P�����&5'���]��3�\�v۸&
�H7n�8ߙ8ߙ��7�;��f�|g�|g�|g�|g�|g��wvc���I�n�8ߙ��s��L�N>.�L2�]Υ%Υ%Υ%���K
�]6dN��K��K��K�l�L��K��K��K��K��K��K��K�gK�gK�cJ�cJ���L��I��I��I��Iݮ4iͶ�)c�����=@3�=l��=�������[1�6���_H�_H]�-mZ���*u�R�nC�ԍ��nܴ���v�M��i�l�
=���n��4q�㶚M�JSwM�6��L]�������������x���R�R�[kw��j;�����v��Iݐ���Ϋν��{i;�Ю�f۹��[^�vn�]u���B۹��K��k���kN̮��v��v��n�*�v��ڮ{�v��v��v��vM|�5�m�|�]��v��v�w�u}��t��t��t��t�n̹�9}��I;�!Y�5�m�ķ�y��/7R�.��Ȝ	f�3g��3�,�:͜]d�.2g����f�+��9��ϙ�ϙ[����6s�W暯�m۞��;��U�f�d�M(enzJ��:��$X�v���jֶ>!k� ˜��v+��ϙ�g%˝�]]�\]��˪�.�٣����a�n{�C�V��.ϗ�j����-wB�t�)�H(w~剭���ɖ'6���k���8*��]���i�*g�*g�m�m�*p�/����.N�3�s�F�<�-0SxH��p�U�¹����
q;8c$��D��W����6�*܆��N���t[FcP���fs��S��A9'v��ݶ��L쵗;qԑS�X���e�n��m�
7g�hP�C'�:	che��K���1���
�
��͆#�~c�–@��vl��/w]�+���b�rbp���WU`i����#]E��݇7��]?�H(��rW�0���3�rW�R�{��h�ߛ�U4�+��7��Ȭ�������\73���G�N(��*�2\}N�u�Q��Э��&{�)��{�tb������؅yQ�?Q�`(�lcQ����Ś�E��b�U�bw(QY�咝Q��G�KSF��SFO611W�oL��c��E������k���EQ�٫��AYԹ�y��J�^���s�ݲ�U�JÚhT�{�V��JQ�
�FO���U��9��А�hXQ
4���Hwa/\��z�Sw}�����fQ݋�^8�i�_l��f�p�ͨ�02j�Yn*j�q��Q�u��V�pFY�߫��z�%W�_���e����@��K�E�"7�)e����5��rս�O�h.�u���Wm�� e�	��f�U��{E��j���6����g�"�^[��Z��-F-7��,�W��٪������N�-w�aY�����J�{yy��XV��C�8-׉�7
�,�W��"�&�x�����Q���0'��'ޥ%��}��&7��+�:I�>�I�7�^�i�\G����.�+n�'�i�J'gI��q�̨�U��j�$X�I	V���M,-_��m��`y�%XD~DIhɿݽV��Am���٤(ڬ(ڢ��UQh���vEu��@;!��٥�L�nE�gz�(B<ӳWQ�G��ɞAE9�~E����N������C���Ê�/�I	�uT�uL�u\�uB�uR�uJ�uZ�uF�uV�uN�u^�%{=�S��"�kH���'��FQ_�R��"��"��"��"��"�kT�k}�)�1���P?�R��t�.�>��A�
�F~�)ʰ�d��x\I���(pq@��m�S*��
�	���P�^T��K
B
zYA�??Uj�+
B�yUA�9�)��
\�a=�
�d�-�� ԥ�`A�;
�.�Ut���Jn�)XQrk��nE�U
�J�^aQ��+�ۻ[I�zTK�
|�D$��.��YTt�SXQ�U+J�|���EBÎ[����8=�N&/�P'|i��z��1�h���
s;'/��cf�� �aZ�����tL��V��)G�`�Ji�2l$;�[�
(�Y~
�ގ9ʰe�J�^� �d������BH6�+I��W&��8����Y%qg7d�\o�'\�U���+�)���h!5pĬ/(�6�z��[����>"\�3�2D�z,S�`��i%�}.�)
�D
��sJ�\�S��|�(HՀ0U������ ��Z%7B����$h�m���L�0:����V����(ApzI�"�S=o)Cl*{ߗ$(��
�~>���'�B#r��2���D}ܚ��g��bɱU�䵕���=ح`�Z�"j�#��֧�܃	&�
(�g�`S��k���{�/�䵵���	Z�k��C|�;�䵍���H�Y��wDyoU��Q��yyG��NE^��[��wDy�U��Qރ���#��"/��^l'$��jy��VQ%zn�?�9��=�ʟΜ�T��^�h�c�D��g4�1U�gX���"�D����0�1U�'Y�^j^�J�yyW(�E^���"/�
�}U��w���˻By�)��P����+��{�������.���^��uu��%f������zy��y]]�[fRA���Żyae�}]]�?�9G_s�x�s��&�����=�5�[]�?�9�Q����9�����c���.ޟ���(ou���Fy����?��$^W�g2�5�[]�?:�S�z蠟���)o��,�Ny����A�u�[��?:�S����y��V��y��V�폆�딷�o:tޠ������۟�7(o����Ay���'E�
�[����
�[���c�,����mf�"�[����1�89���O\�1�89��۟�c`qrt�Kx�q#�(�gK���U�\�N�dT]|ӫ�N���w[�F9�ҝU�R)���Qu�nEo�sLtT]�ۂ�,�J�Ż��eU�.�'�c<r�'7a|�E�@�,
x�m%��9�8����A�[U����9�8�.ן	�s,qT]�[P����u�ܖE�o�r�F�e뛺\btα�Qu�n��(�ᨺ\��mYDy��uKt��c���r�Ⳳ��V�붾-�(ou����c��r��e�.�3�s8pT]��7z����W���m{y�!�1u�����Ӑ���݆��ԟ��ѓE%�]����千�'�ԟ���e�=�����݆��ԟ�eYQ�Q��O�ֹe���TQ��O�bƲ��֐٭.�(o
��6�Q�Q�2��t#.�Ӑ�m���!��t男��%��)o��K�՝S�꿗8�;���/qbwNy��^����V��Ĺ�9�;�<9���]T��x�w^P%���ײ�*Q�6�-��u��J�Żmy�"�D]�?%<�t�1u�K$�9
|L]�_�����x�EoT0�<�B�G�W*��w+B�5ޣ�1ޫ3X��{�a˸�
��~\�Eӹ���7+��oQįߪ�_�M�^Ϥ��<���M.�?���qH��"~�E������Q��Q��
?��`�q��"~�"~�"~�"~�%E��ˊ��W�Sŧ~�xQ���	5WLB��PseRpB��P&'�\��Ps�L��	5W������MY�W���1���VCs˺���U�+�
̽�����s��&��$�=�&��4�=�&��D�=�&��T�=������'Wˉ�%qKa�&W��܈+r����r\s1�\P��qѭ���eN<]�ĥ
�F���[_���_!'�F\�[��"���\�{,D�3� #������5�g��h��B�	���4Q��&��i�H�&��Ңx��}g���,��̎���*?d!U~�B����T�Q��cR��-�>OX�|�w�����Ӿ3}�w�����Ӿ3�wO�Nf�&�wrM���Nf�&�wr]���Nf'�wrm���Nf'�wr�ք���Ӿ����L����Ӿ����̞���Ӿ�x�w��\S��hІ,�ɼg-s�
�ڳ��W�#���r�

z�H�0w�umɑO�_�X���t!�ho*:޴�_�3��ƥ����Ze!�t����eP�y˼��6e��m�w��^�2�ӏ���\&*B��h��KXHH������ݯ�(p���{��2��m1UA^��Z����'��A`f�S�QNی��\��)���9�5�E9��>fr�=�O���'��U�1�e��=�3��*#�<��Ƀp���XYDC7��R���C��q���v�E��>�ۺ;)�,��[�̄��5E��M�+���7����QM��Bj�"��:~�C͟�V`W��E�_([�V�m�'�ri��(DJ�VlRd{�eQ_1��v��غ����j�"�|(����2PeQ0\�SZ5�]`S�eQ�\.�)m�.�X�\=����%6c\���)�㸫4�������Bn�ϯc����Bt�E�T����\��ˢ���z���~��Z���?dY�HUA�k
B�+�j( 8���dQ~� x�G��(
��G
�_zFA�k?PB��4;�Y�HAhUb�r+
:i��I#�Niv�H��F��4�중fg�4;i��I#�Ni�V)��
�^Y[�%�>A�T��I��e�� (�A�*�xMA�C5D��MAo+�;
�Nq�ہ�,
���>��щ�܉ű��-�*�ۋ��/��gE@�o �W�-�˻���c��s� 
�E�ŗx���PTzWQл��-�k8"�s������_T�.]#I~pB���� ^��F�GT[�zFX��ɭb)�ZK��#�?S��-v�qa��ۯ)	^��[���s��/�����[EXLr{�/���;��0z��� ���)	�'
B�K-"^B�����������A"İ*m��Z������	�YI0�/�(	��b��P7�L*.R�0t���_*B�i���QRt�kG��otkGʢ ��4:�ú����/
,����m(����.��������Κº�i`�T�� ���-�ͺ�`�5S����-/d`&�50dF��������(h��+	*4K���� 5�C5Ws�H�Ac�4KA
��V����b�\M��(���訝Fg�4:j��I;���it�N�)�it�Nc	�H�q��ގ
ltV`�����F'���"��Y�c0�׺��s��E6�Gn[�8Fl�hՙ���Pw�b
�V�/�	�t�.p
ۓ-�+Z��U����%�+��6�b��h�";;2��v+ظ��R�Evc��
�)+\Q̷� XoMA�޺�`�
�t�
�ݶ�)�R$�oG#h>>T��|}�����`���~4|*8�H%���Y#�k�2Xp�N�D?P:����N�3�Bb�A!3�L͠�}�nP�<�0(
�iP�=�29��˰�ʣ3iv��4#0#��$�w��d�njP�T��Jz��X�P\d�҄�b#��,�� ��zu��A�A��)J ��
�t_0�}� �%� ڗ
�dj��A���"^3�A��7�E�i�3�������6�zGQ
}�k�s���_}�� ��WA_�6(40�,��]	B��,]v��74A��CѩW����%��yYAh}�[]Ŋ�W���U��yMAhy^W�!�Rm���MAe?ST��������� ��]K�xW���_(������_)���[5�0�P͢�5�w�b��s
�jbV�P�:Nkb��P�	�j�!�S�:����5+�&�+��X-�5'�kMĊ9��yԡ&b՜�DL�њ��sZ�,A�CM�j"&�hM����`�q�[C']�/�;l��B+N���?R�������	�ȣ3����нR�γ(��D���[��nc��G/*œ��C�b�aE��qqDfa\���tY�a\���.^U����t]Q4�û�A�!EpqBQtC����GC+A_C+A_C݊���E��P�"�k�O�5ԯ�P}
�R}
�V}
�Q}
�U}
�S}
�W}
mP}
mS_�Q_�Q_[Q_[Q_�Q_�k�$,�x�Dy7U�CL��TD��RD��VD��QD��UD��SD�*�J�+r�,�~�Y����T�!E.-�F���%X�pY=�W�qC��:tR�voש�ӊ\�]�B�*�K��"���[�� #uK��[j!n����������,��h����6��?U���
���T�-u�p�hX���h)�9.��թ���b���hX���E)�.��Չ�]�b���hX���E�,����v�(�E0�au�n���5c���I�]�b�,�hXk��E)�2���)�]�b�$�hx�"/��v�x�Ey�gu��<1�ѰzԖ�w��VO���nQ�yy'���M�kS�a
Q��P��yy'��	E^�	�}J��wBy��w�6�<����9E^�	�}A��wJy��u�6�<��Ѱ�O�kS̓\
k0�vm�y�ˣa
�ݮM1Ony4���۵)�-��5hw�6�E��6�nצ���<^t�Ru<�!n����6�\�F�Ż���"�dD]��ة,�JF�Ż���"�dD]���)n#��hD]��ة,�JF�Ż���"�dD]��ة,�JF�Ż���vFy��w;�E���x��SYDy��w;�E���x��SYDy��w;�E���x��SYDy�����vFy��w;���V�6v*�(ou�nc����F���Dst	F�+rC��o����gT��L��5g�K�d~�c���dn���)Lz��<9�C�Bp��($�s2w�jY䔜���Q?9��\�:#O�|Ы����A
�*�,wZs��%(����9�e���ם�Ӛ�"���?˭U���,W�~�L�ьs��XN?sA\j�5�c����\M/�M���
E�IE1�E����l	]�Ё�f�OQh���AEM�QE��<�k�0���c�R�3�����V��P���O�w!�8=pYQ���EUJx��p�����5{��A��k�+
*�^�]Q
h��:�5EA���W*j�S��?�*ݠ�A�qz��b$�7�R�n<�*ݻST�O��@�q��V$����#�8}t�"��*	��'A_�FA_�6)��Ϋ�@6q��j���A_+��.�B_C�A_CC����Z�1�o��zL�����ځ�7A_ׇA_��Wa��u�UXI0=vI�5f^�_���M�bn	7=�[�M��\1������u��(
��Y���-�fV��b��j�.�:��vAQ�2��3;U���q��̎��j@�Eq���N��X�0�S�!V;�콨(�kf�������V��͜5��5sN���͜3�}��
PeL������A_�`��bƸ����h}�g�U�+�-c���ӊ@ZE��bv՘���9�Z̮�z����5��:���FPA_�k�*
���Ы���A��٭�.c
���㊂�f��RTҶ)�۴�b*��65L�ݡ�
�-�;�(��v�*1�2�{B�G["���Q-cV��^s�u@U�Q��j��)�P��8��Qmn05x������=�m
&ϞR#²��3*y��̞Yz[���E�g���JG�G@��R,Θ�}3�k/foh����7�"`�in�F�g�[�]�4ͭ�������k�[�5���p1�47��,���
�����܀y�и����U��X�?�J+8Ƣ�V�'���j1��[����ϭֺ������A_��)���!�����!�d�U�R�c��cjg��;�Ƅm�Nh�����I}C�0��q����	�.�sCڽ�X�ܐ�;��P�/���Av���Nc[sW�b�¹Q�Ƹ��Ԗ�f����c]s7�5�c��
�c�k�[]
v+��S�����J;�h����������e����к�
�wi��1��=�E�;�
166�W�n�L8?h^>گ���ce��	��Ԉ0f6�"��4�;�?�~����O���l�@>D����k:	���k0�1����a���i���
�0S|��yC��W0[|����0�6V=6f�ϟ�6j��4ÄY��#�X������󦷍��Q�@�kT�z�͏i73��Ǵ������f�Ϗ�}a�m~LC�$�ߠ�2�~�&��� ����1�|~B,��'��ʘ�Vi``n��:"�,��a���T:��V;�U�W��%Cӎ'u���!�
w&�������t1#9�1�٫���}��B��jw�)����P���I�<ٺ�ς��ޭ�M�G�+�B���^5սF��t�ad��Ɏʓmy�Y��`n%����ț�]��-��T����a��nE����"�>�NvU��Q�={{a���>E�T���"�9�?�{_�+�~�#���p�%E�k��� =ۻG�կ��P}�j��Q���A_��A_�kQ_kQ_�Q_�A_�A_�A_��A_��A_�[A_}*(]�wX��wD��wT�%�sn�2�w\��wB��wR��wJ�էf��7d���MS&���y
G��9���;��껠��S[�}j�<��Om�N}�-��>�eΈ�S[�ۡ�
�I��ݦ�v�]�4���#EԼy�Ȁ��P��"[AO;AO�Ѯ�)����܁���]��TD?�6ܠ�Ԇy�n��\�~P�G��4��xx�n�O�~P��G��4��x�n�E�+�xhI�be8Y�x|Hy7MO�*�4P[�&�<ϤO�*�*�ۥ��Rk1�)��x����k��#J��:y@I��D<��_["Nү��G��k��$��~��;+~Ǚ��saT����ԕa.�5
"���޻W��\�Y�o�� +��5
=���ݦ�Y9��S�4�
��1�r�G�򑕛ާ�z:����@��f�pW��	>S��?Pv�X!�3�J�o`�p��:�j�k
l�3�E����p��)�&ۄ�
����"��h���"�нKa}�a�Q��?�}���*��?\�f ���B���k ��F|ب��?^<i ����>��Lj/�>�}��	��ۭl��?��>�����Oͅ��^˝��c��z}]���w;���ҫX�c��c�r�u���q�w�1�������B�3�L����ٕ�7�˙����kj^E��Ʈ��L�;��}��<f �9s�1_��}��a �9�i�������B�sÇ�>g��U���5F���#B�ӛ��U���s�
�>g���B�ߌ�:��
��1
N��\o̡�E!s��>�M5�B�sA�w<�����G��1Qn�FE����+��+��U"�"8oh'�Wb�:�|�yE�/R�
�c%�n���V��όkJ�El]I�ȸ�$ČqSI㖒1V�����bd�
a�B�X12�b�� ��s�Ѝ����l�܆&Yc�64���g�W�>�V8�q�V�1w�;�c�84A3ǡ	˜9M��qh�0f�C�1reT�(����!�QFt����xNQ�W�)
���L,Q�W�)
�*�8EA_e�(諌�}�����2~S�UFo�����MQ�q�ۑ�J��ʸ�ޠ�?Ȯ!���p�>p����M����#}a��1�e���^�q�=g�d�/teG��s�>��#q+q���B�/tRi�0����/t�n�0~;�6���c���*.��<�Sl�����(�1Eh�7�W�)���+�#Y]^"���T)�t�1�"d:Nh]G�cv�UE��.�"J��!��kd�L�z�+.�Q-c��Aml0����a�A�nE�}�"f��(�*-�1�	�K�(�?��z\�Qŋ�G���a���NE��9�[�bk>9�mY�ҎG��wcJو�阢T҂0Ei��>EA���0C���&(U4^����k��T�x
����arRU�5�M�j���IU��03���&&U���FA�U#�����A�PMe�9I�u㘔;9�
��׎a�kǰӵc���1�w���v��^;ȍ��{�E%AuϿeP���?Wt��;�	����Ê" �,1Ai�[�&(Mu�s���n����4խ�=v��V_��/��/(j
)�N���K���T�eE)��}�Y`�[[gl�9խ�;LuO(�\��a������%�T����q`�G;Z��L
��1�T�6p�s�G[1l�9գq,�ǜ��dN�h[dN�h�dN�ho
�&L�lW}�h����z4�������
 �K����[A}�UԗZeA}�UԗZeA}ixVP_j���[P_�K,�/��R[.�/
�Kͼ���a�l������.q�S=��zƍiT�"��LYǦ��5�^32ճ��JWE�7¬t�g-m��s�/�55�f�x�J]���S�5z��҉��t�eV�eM�������q������^��`��E���������rAO�9=NA�^s�|�{Uz���z��1�JĪr~Js"�(�Xw�/ 1s��l�g��/xl��*�;��p�T�9��-�؂\U3Q�^�s�q�j5ܕ��R�
��/��?���X�.<�@��B�1���e�^~�^��5�Pǵ�F�Y#�^��zA��z�������rM�%�,�����]]��=ĬBcK����.P5�lXV,!���ˀ��*1[���K��8��lg֘�@��ٰD��>=�D�^�fg��/-����>�
Ѧ�κ/e���/������\ݨt�*�
Ê��^F����ܧz�JE/;�DXa���!e
�>�~�&��q���z����-�VXO����Ri
}�k��-���f��$��pUR���*��V������~�V����[xOs��^+�j�����f�����\���'X7����V���+5��q
ܨ��3��W�6�x½-+Ɓ�ܾ��%טp������/b�8dc�j��%|]5�k�lX��G��Ѫ��@�Pc
9�$2�XCN?q��!�^sJ)kș�>�D#��^0��@�O����
_���Mu�oa%Y*��m׬1x��X��c�uI9�p��cA�uǂ��a8��XPt�1�p��!��I���
�u#'�FN8ڍ�t0�9��X:/�輀���
�����*c/����K((3v�`o�$��ޗ�\�(h�9C�*���$��'��R���b�Qz4b*oZ~�Y}lP�s�)i�Ċp&�kEA�/�o�����U��b�q�9�hpv�	3(T�p�̮
3�3oI1ru����o��a�
���1B��!A������
	
~��W~�$(�5C��^4�y-UQP�+�������
iC�����fH��+J00�ү�-�b��(��E���ޱ���R�a\�5C`f�M�bHP�j�~ݐ/g��2���!8r�x�?kQГ%1~� X��6~֢�&K�)���^{�j��
�
�[m��W,
�z�"��gQ��[˟S��O(,֏���z'�}_7�~� hΐ��7�$��uC�!��7C`^��:�/�%����!0/C�N������
���k=V�?kQP�O~�V���z�Պ���g�ze<���,Bx�m�w_�������$0��қJ�b^~]I��+�(��0���;B0���ރ1�W�
0���*1�K%A;&���k/k[����0(�Λ/)�{|�E�ro.~���~*�ait��޷
	�{[�㼿0���yY�:�
�;�s^�N>��Wa�UX�y�q^�e�Wa�UX�y�q^�e2��B�Wa�̫��g�;�c�����pq19�`8r�(p�$�q��I#���Ƃc'!��NB���0";	aL8�B.�K(�3�B�K�⽄05�K(��E�T��"�V��;tMI��*�6�UU�F6���)�������h�\UG���+��jʢW�(���EU\ݧ�nS�q��"��OY��ի�
tʢW�Ud��)�ڸz�"��NY��7*���z��ެ�˻FyoU��]���+��Q�;yy�(�݊��k��^E^�5�{P��w��>��˻NyR��]���(��S��yy�)�����)E^�u��"/�:�}N��7�J��Q��+� �=�!�1{e$�G=�;f�,�����c�$��x�Ty��G��;��,����q'�E�u"�$���z�:w_RoQ%�D�I|eU�Nĝ�WQ%�D�I|eU�Nĝ�WQ��Dܮge�Nĝ�Ry�Y�$��w�)�'%����o����#��H���c��H������H����S��H����3��H����s�\n`�·�.(rU�Q�Gy	V(�ˊ�+��UE^�J�"/�
%8��K�B	N(��P��)�d�6�R�s
Fn�=����
�)��f�68��˛���jE^ތ��*��f�6�^��7#���������%��f�6�U��7#��튼��
�T����mp�"/oFn�{yy3rT����m�"/oFn��yy3rT��#�#�A��>rk0rT��#�#�A��>rk0rT��#�#�A��>rkpa��G���yU��^%����y�`���QE���(����q�e�C_V���W�uk����E}t�`t�_���n�n����m���~�����ڿN�1oiuo����r�::]6]�WG�����|��`��_]��������b���u�ms�"T������I#��u����"JP]�;��,b�R]����"�[]�;��,���u���ˢ �[Ǖ��yk�� �[F0��g���:�ċ���WR���ya���	����V�zАԝ�\Q����"�A��;ѹ,b�אԝ�\��kH�Nt.�X�ՙ�㚓F���\�rP���d.�(�m�B���n%����E
��*Ev���
ց5�|��0\�����(�� �&��j�+�{4c� n��n�"{jҬ�����t��&Ͷ��,r�H3��qMZ5��`Y�*V�ᾱ�߫ն���E�,	}:�}�����2����$>U�T\f>�O��Փ�����+���>iۓq��k�$�{��m�_-q��@i��D�gE�Y���4^�*g�i��W���M���3��٫��ޜQ�w�=�EP�:�~�^����fR�B��"쨴�"쨴�"쨴�"쨴�"쨴�"x�
�aG�
*z�B��"쨴�"쨴�"쨴A5�]�7�U�.Ćs��e�����܅x�EE�א"�kX�5���������������R{���)���+��FQ_c���qE�ׄ"��"�K���ɍ+A_W*��6v+��6�(��6�*��6�)��6�+��6(���h�A_W+��6�Q}m\��ڸN�Q�zS�7(��6JN.M��M���͊�/��	��U��M��]��C��S��K��[��G��W��O�5���گ����q�R_�~�ԗ�_)���WJ}-�_�u<5���*�&.�J��K�Rm�R�T���*�&.�J��K�Rm�R�T���*�&.�J��K�Rm�R�T����rr��nC��E�m+gOr�,E����uɞ����TE4�
�R�M�^R�C!�@��P��@�{,G����|
+¹�RK�C�䔮a'�c�p�ـAX�"[����3߅���(�a�2e�D8,�F� l�0��=E8�q��"(��5E8�{�"(�d�"~i�"��۳[v��X"�ԹiBN���mJ}�R�3F��C_�/+���*��V�O�I���	�������M����{g��v�W��U�U}�]�;�R��UP���c���};a'�˪J�0�v\v6��	J���n�+�Ά�Wa���,��٪+�g�lU�èW�*��v�	EЗ��\"���K��s�ճa����p��>��X�?�����.��g�S��
������+a�ZE�~�*�zDf����P��(�h�Ʋ��q�[8<|H_���V�P���"��#jD��Q��e��{�bc����2��O��B̓Z��V~��EX�9��p0��v<E��M�%�t�90{M�k��ebj��ҵ[�ev�����Ohnj�ٓ�.��V�,�ۨ������	3�ίPT:�V��U�����3�
�J��v]\�uc�y0�B%���4h������i���G�!N���3�oh�����\��3fF� W9�]�)�P���v�u�Ӓ�(B�C�"a���>m%0can��L�o�;�--�3�թ#Q�犗!ɰ�H�ά��D��Z�Б(�٠������.�k�"�$}�e$J�TPH��V�"Q:;�u�ҹ���/5$J��`I� Q:�Ym�R��D�cgA_;�{�D��{�J$Jg�j�B�t~�ƿH�Ο2w!$U3G�t~L#>$J��h�D��^
����9mS�(��P�E�t��vs�(��׈����R���̷hs���Ǐ(B٧����-A_'4�@�t��~�s+�b#Q:7~\Q���V�J$J�W���������Һ���טB_[��D�l��/$J玨}!Qj�(73S�#Q:���2�3�B�t����ًj�H�Κ�,�ߌiw����Ն��������_ц�ҙ!Q:�A{H��nV��0���D��J5s$J�Wi�F�t~�b&F�Վg��w#K2�����s�I4�D�t��j��~�p�{4�@�tF��-NN5�J{��a���/j��D��� QjcR�p�P��]�jmՔV�ϯ4���&���Q-c��.�f�L�QO��3�j�=3s@��6�$�`�̨�V��n2�ܮJ����C�ij���MV�ϛpK�̓��[�2����Z���}z��!V�O_�����깱�}n� ���`�~�O�X�>sP+,r� �r�ߣV�e�ӫ�/b���&
!��}zH�f�q�٥=|,q�T��
���'!�1���d�~�����P��g'�E��#��X�>wD���ϛ�;���5��N=�όj�%�ӛ��Ԉ��}v�6X�>�SK��h�����CZ��}~T^X�>���xU͡`�X���Ϟ1w}͞�>&��k�	�g�j@�e����h}�/��c��R��,W�^%JI0T6�j@���qE���[!�١��|�"���W��"��1E��C�1e�^RV��*�}��OF�!����� ;ѰH0D6}h�";ͮ,�v�`";�,bRP%�q�u��"��Q�8���ՎG��w�h��ׁ�;�Fs|�"4J�Z�046;|C�܍	Evvj���ܢ��Casg�)�8�
s5"�}I�P�,Bq�"t[��+����T�7E�F��{T����#y�#U��8�>��"t[��l1R5�c�	F������"�oV���AE��u|+�H��n�!F����H��asG>����b�{�"�q��o1-$�T�����aE����Ab�jFC�#U3{T���9�mF�f.k�����qb�jfܼ<X��#U���(�{�dȑE�]��U����cZ{1R5��3C��,�0�1u����J�a��j_��=�u�P���bcj��JEhq.����h�/�0��5��f��߂�&��bjn�V6C�
�S�����X"�]l��4�X��Q�ƚ掫�0�4wV�cMsg�50�47��
ƚ�.i��X�܍+���1�ƚ��0�!�:�"4R5r�X���ˊ�R�tt�Z,��V�Rdg�	F�����-F�����l��}b$�Z�1�4ݧ�#I��.4Ak50�H��Z
�9�d.�$m߮M���n�l�x�#�t���EH�U�n�1m�8�tJ_�#Ig�"qh��sʻ�א�'玩T0�4=qJTzC�fz��b�i�O=,�fz�b1�d�l���wP�4�l�,t“s7��0�4�i�"D�U�lڮ^��M�g#'窇�`�̾��U���fΩ�`�nN0�d�	�f��k@_cڽ�`�
S0�4�B�l6��M��5�nq>�z86����l/�M���!�ئ�2�f�i����]��0�4��"D������6����M��恈*�sc�i���xr�i#(�˄Dl2���.�wa��Rl��`�M6$�H��z�e�$�m�j����A�/�$�S#�H��q�6I��F��Nk���$��HҜf��$��+�8)�H��m0�d�6�$͝�ʆ�$�q$i\�KF���s$�_�6�$ͯ�(�#I�5}��$b$�&f���b$�ƎI�?���H�
+1�4Vk/F�̌�#I:|H�����i����?٨���=��
�I߬��I߬К���?[�#�&��؈�;0��&���E��
�:�z�"E������ �^UR���MU sW���(�KL��
>��eU�c�jdg�-|~����;��R��–�>���+�ˢPտ��K�\�9��/�/���/+	�b����/�*	��b�� �/�*	b�b�� �/�y}qRI��_�V�VW�_+��S_�T��u+k��~�ޙ)5���UIA&.?Ef�d�ʠ�͖Ae[,�ҶZ�m���nT��2o�H�~��^�be7��cT��2�n�ev�����o/��)ҩ_4�#���!��ets�^�������ÞNXݜ��%�\tsڲ�U纲6��{�2�԰��0�&e������y0�$��
%᫿Z�$���k��>�F��J	����*	��$����W�J��|գ�ӯ�#�+n���z%��~�N	�`��P��Z��KI�C_mV��������ۈ���t��Rm�����*t��ֺ�����̠����Dt*��p�˹��{�s���;��H�~��
ί�N ��Z��!}���\��h���F_K!ń����
�Z	$����<0��y����`_oW��=�/���>� �ДlQ�bv<��������T��R����X�snw�C�<�,";����OY�㛴��u�(qʗ'���̻4��+k��l���L��{C��}�6�yό̼'*�i����'&��L����<c�SV�<c~����߫��߃�ΚoG��˳����s�=��s�>�]/!3����τ�F�332�̜Lu�nݗ#�Э��y&:v_^��AW�{�sW2��*��':x_^���]�τ�����k�A��7@��}�ߨ�����=Xi����d*3���4��~^�Ԏ��+���y�ͻ�����^��^��^�߃m ���Le�_��{&dFf)؃^em2�}�����|��k�]���7�X2�̩y�k�}���{�/X2}OL�y�g߳Nf޳Af�����"3������{���{fd�=��~����';���=1��yOv��a�M���U���Ak����T.�hS2�f�<Xc߳Ef�3!3�	�y�Ee�C�A�-{��'I�e�=ج�\����)�3v���y�œ���Fc�MV7��3P�rHY�lXCt�0L�)Y��&�*�.��*��@վgJf����1f�̼gNf޳ �l0P5>%�D.�Ƙ�S2}O�qA3&����2h6�� 3�	�ـ~Jf�3!3������E������	����qA&��9&נc^�kБ�r
:f����)�bn�k|�l(�ICi~���ԗ�4�Z_�l(�3�P��Ҕ��|�4��}���7f��
�~�m%�o�<�8a�O��Zl(�7��P�o��4
l���4�-�O����ߐ�
(����B�i߅�Ӿ��O}d#K���wI�?ͻ$��]��]��w����A6A��?.A��?.A���K$����?�H��o��v�<��uI��}�LL*�y&�g�t�Rv�������A6A��@.A��@.	���o���I��}{�g��t��}���oh��o�Җ������|��p����*ogi>��\���\߼�\�i�����Di�ؘA�ؘB�ؘC�yL"*�� �"r�hL#r�hL#r�hL#r!���0�`\�\3�\x��D%�o����b&���bاdd�K�g�d��d�?:`Ȩd��bms�s,�܇%�i�p�kZs�b����4����f0�&��k�	q���{�ޗ������˟����{J.'/:�]��:QD����p�,[/�M`���6C���_^5�*�⮚@��ˆ���$3�A������ܗ�f��8�a��X3�}9��VxN��8�xN��8�x�����`���}U2s�w��W'3�I�c�k���h��)3�(^RO�qD�zʌ#�Ʋ3�(^Ҏ[�%��a��e�8�xŲ��=dQ4��qD񺽯��2�(����!��!���!�Z�!�����qD��G�=pD��G�=pD��G�=舢�/�l2�h�v��(Z{���(�$0�x�Ty{���ĭ�&�AGk2t�&�AGk2q��OA���a��	m �a���ft������?�a����J��\*��r���"��)��]��;�`�27M;��3���&�m���j��1��&Y�s�^�6S��$�g�\W��İ�UY�4c�լ�1�Z�TFM�X8ih���4j�e�t����)�������ș�A��w6O�P��+5�귮!��d]�����ɐ��,q�披W
i�$�+�U��E{��,��/���J��<�{��R���k�'+S�o����FJ��9����˱��Ҏ�����"'�_$�!�~9��(Uj��Mjm��"}��4%�s޾��}��C���WQ�k��JZ2G�����N@��wJ���L������ˁ*g�T�����E:�a��ً�%����Ձ
�dڰqp��{�o�{9���˹�NG2���އg����<�AZ
v�S�R�4�c)�q|����+P���SM�X��WK�]�T����T:�mR��LS�N�'K�Ѧ���]�ʧ��ѼU��kh���fO}�\��y+���~ےVwT�N,ej�n���m3�ྷ-�!w��\��7l�[�q������#cn��S��Di�f�#C~��=vP��B����"�^;Ж1�9T�ƫ4K�i���fg3�;�*���o��������.�N˾��eK?6
7�}л��-�jގ�ݾ^��
����mb�/�<�Q��0g�omO�My���Q���C�E�_��_(�/�P��P�ک��^֝-]�Z��P<Z�MQ�UQď��}FA��(h,���������`^9ڮ(ڤ�
�YQ�FQ�VQ$��rLq�Z�Z��:E�a�zE�
��@�\�E�����Sֆ/�m���C�u��ZgK�yK�u2�Z��j��NW߭&���5�Z�C5�%�y-�P�0KU�Zֱ�����{�R��'a��V���P�VA��U�����h�@��ı��V��PU��_���Ac�QA��W�NV����ɛ+,�h����
7oTq�:��[��7�Z�f�>�U��m�3��y<v�,�m�]��y<�������r��
�8�}����)C~��CJе=��%Վ*AvL	�>*A����C��Ǘ��0�����p�K;���w�+��\P�J�CJ ���s�ވw)a��o [��m�`��w�)�:%�'�S���$�n%\����!9{�J�S�iIJ�;�p���;2�D���fC�E2�M-���mja�ۻ$_�S!}����EWh:�BAp��W�T��P��� 8��� 4��WJ�sFAh� ���� ��� ��Q���*���)������.�NE
B+>�� �U�v���y]A��
!�l*5�� ��
�>������� ��?RZ�� �CB�"��W�\A��O}<�d@�L���Ӈ�=� ��Ae/**{IAP��
B��
�KzEA菾� ��k
�	�� ��7`�›
��~� ��-Aeo+�xGA�ǻ
�>~� ��
�>~� ��W
�>~� �п(&����l�����qQ
6�?t��j'�.aCO@'�v2�j'�v2�j'�v2�j'�v2�j'�v2�j'�v2�Z'�u2�Z'�u2�Z'�u2�Z'�u2�Z'�u2�Z'��(�����
�}�
�>����Q�t���I4��3q�Ng�1q�RQ��TϘ�:а"$u�)BR���"$:��)B����"$:�O)B����M=淐m�1��Dg�t=
,1��W�T_�aE�W�QE�W�qE�W�IE�W�iE�W�E��9E��E�א"�kD�uY��}U��}]�խUّ�n92�@rd��=E�W����L��*��z�\��xJ��-���5�h_kA_=�f.qc�C�
�6��QO���T�EPi�FEPi�E4��h����*�	�6�E�&x@UzPU���E��ᶨR5�U��ۢJ�p[T�����6ݢ�Ԧ[��YEԗ�{��RsoQ_j�-��nE4A9�H|������b �J̶��Wa��do���Ra��d�
3l&{�	���^uHN�j3��5���@�`1�f�__�'�UO�L3�'3H9N��[���^UaJ}��K��EЗ�eR�ԗZ#����A_��ES�K�hJ}i��R_�"1f�W]$��L�������M����͊��^u���Q��|��>�&�L��'�L��>
����S'�9*�}?a��d��??;�����>���<wR�Y*�:w�O�%r͓}��6w�O�%��N��3ȼ��(i�%}^%��5���	d��:���V'�yIg������V��Q��2�G.�
�7Z͐����2����J>�I�U��寿�:�|�o�bb��#�S���j����iˁ��G�j�X�_��]��1c����Bu~�C#,u}�S][n�C���e'�<.�c���d֑�O�*o���5�O.�������;n$�v�_���H`�@8���v�����v�4��EQRi.J�HI����ڼ�[��*/Mf2��O0(�����ΩZ(nd22���po @��(N\�O:���X��q����T�WD�u�}I��/����e_TA��E�6dI��%g]_VE�}YJQ�&RϜ(K���zi�撚��6��m�^g��E�9Km�e)����6nY�Y���Yi�%+-��I�}���8�����g��!0A�.�)������1��	t> �#����G>&�D�	��O	�\'p��3��"�����!��|E`���|C`Ϸ�|G`��@`��	�x.�%㹸�@���~1���x.$�x�@���a1��GB0�x..��\<J �s�����b<O��\<I �s�������j�Ƒ�~\�˞���m�"��oK��~[�L ����ߖ����t�@췥�b�-}K ��2��K7�<X�I ��
��K��<X�M ���Us�“���<���Z�� �4�M���T6	BNS�$9Me� �4�M���T6	BNS�$9Me� �4�M���T6	BNS�$9Me� �4�M���T6	BNS�$�'MeMO�ʚ �4�5A<i*k�x�T�إԸ�M����,]ʛ�,����:o�z.g% ����ͻ���q���K��G�y�;���-F�����b�OO�U�^���֥�"����Y;e���H�.�wK�e*�H��ƭ�lI��n�/O0q�H��l�zebyZ&�����B�H���,�u)k˗���(���S�/�IF���G5�'*v�,𣏕��U��$�}楆;e���i�Y�W顊�s5�|�"[��E�E�2FG_6��3*�N��U��zud<�#����<�ɷ���s�u�W�,;e����*R/��`�"�e��&�.�DB��Ko�Y�K Nu�ĩn}?�8խ �.�	ĥ�!q�~�@\��!�.���e�(��tY?F .]֏�K����e�$��tY?E .]����6݃g�H`ϳ�\"0��9�x�'0���x~C`ϋ�D`���B`ϫ�F`���wYx�t.���A<o�s�� ���y�� ���\#0���x�%0��=�x~G`��|@`χ��P�@XL`�'�|J���&�YvY���o�k"��&�{h"��6�
�}T��EVomDP�}���Y���#�W�ٸ�L�]�v�߻{^��E��GK�"��ήf��W�D���-��gwi}�Y��
����µ�̼۲/�FJ��fi��Ѷ^g�/�LI��C�;e����%�]�&In�9��K��_�Ž�z�m_�ix�@�z����?ڗ��(�e�������Y��e6dia����R/-,�R���e�z6œԦP��fÒ�J�JE����l��2����ljd#�;��x}}��[��~�R��Y��̦xf=վ,�;��ܗ��4�̋�wʌ�ЗE~�8�}�/�/��^+t�e6�3g<�~t��CF�#��#�3�Y��M�Wcg���̶o��P:���؜��"C�u��s���ev<p��[D�K|�/>_o���ۥA_f��#��ז�.q�2�w����;�䉍[���vi��V�J"Be�+R=\�/��%0Ap�)��	�<@���:�<L`��,<J`��1k�8A��
�'	l<E`�����x�!0��"�A<��s�� ���y�� ��u,e�Rv>��"}y�K!�L`�+!�J`�k!�N`�oC02E4���.%J��eF����VZ�9)��ܗ�%B�D�nb���j�}���K��ev�P�#72���)��6|_f�̲�K���)��k�WE��*���h�IUYD4��l�E��db=�db=�db��db��d��T/�;&��zY:M̵�;ev);��mb5�d��Wa�&�/M$��&M$�v�A�"���xp=��h��4�Xg_fǃ&«&�&�Md��{M6׳��{%6׋�^{\3i�qͤ�^H�{�/׋��H�7��ckU����QD�Iv��z���:�;:;��YiڗF��؛�K�6��23��-C��f��"*R6N��G�7�v|������x�+��7X:ȗI��T��L�eF���|ewQ�jMJ�ʪ}�I!�}m�R_�����精�|mw�}�I!�kER���f�M����p���eo�"x�����"�!x�@��*�9�k�!�D�.�������	��	l|@`��C;���� �O�� ���|F`���|A`ϗ�|E`���|C`Ϸ�|G`��@`��C02��Yr����;�d�߽��v�����s�}���}g�о�����5�L]Eޙ��)���'
��R�h�����:I̔YG���,��ě�S}��ub��:�H�
Իo��z���}39ճK�zb]�zb�v��.u�]��}���P�Y�4��oFv�m"fQ�ا��2��h�k���M:�p�V�kI��B��C���*=�Ji��c���*=�J�X��T)�+0����c��S_fV)M�j̵ïmǡ"s��H��|��YTg��-�J]웨����M\�Mb��&b�5�]6�'�����q��]g���y�߱��V?%d���2��g���9!���a����?2L�� d�����a�gB��_��KB������J�@�_2��7!ON���!>�#d���	��B�����!>�F��?2���	����3!��(<E������Hq��"���P�Qx�8
�AG�(�(<E�������q�{"��CO�Q�א8
G�fC�(\mH��
��p�!qn7$����Q�ߐ8
G�C�(\qH�;��p�!qn9$��5��Q��8
G�C�(��8
�B �«���&�(��8
�q��((�Q����)GAP ���@)�8
:qD�((�Q����GA8 ��j@ɀ8
zqĂ��ţ�W��|8U4%�h2�ؙ
e_��A7 �h@ŀr�"0D`P	���A!�΄["0�C���� Î��"0\�H�[��pI"�H$��D`�!�$� �#;�zDb'܎H��i�����p5"qnF$��ň�Q��8
�"G�VD�(\�H�;��p%"qnD$�…��Q��8
�!G�6D�(\�H�`����q}!��s/�Qx�8
O�G�q�(<�B�]���qq!���-�Qx��8
O�G��(<�B�Z���4qe!��s,�Qx��8
O�G���(<�B�W����
qY!���*�QxX�8j�<k��
��N!vZ)�/K�����)v�3bWe��1�#���1b�#���1bO�98$F��b�8F���a�8F��Sa�8F���`�8F���`4����E�^^���R�6s��C�Wż�+!h�)��<��� )�����v"��U����p���r��.r ��-DZ�H�7i��"-��@��k��pg���
g#�F*��T8�p6R�l���H���
g#�F*��T8�p6R�l���H���
g+�V*��T8[�p�R�l���J���
g+�V*��T8[�p�R�l���J���
g'�N*��T8;�pvR����I���
g'�N*��T8;�pvR����)�Ӎ���FJ�t#�p��R8�H)�n�Ng/^�˔��FJ�t#�m���6�ȸ�}��.�Hi�n��K�(��%J�t��.]��K�(��%V�r�R-]�TK�(��%J�t�R-]�TK�(��%��9X ��w>�$M�(IӥJ�tiD���J�*�ҥJ�t`���Z�T��.U��K�j�R�Z�T��.U��K�j�R�Z�T��.S��˔j�2�Z�L��.S��˔j�2�Z�L��.S��˔j���}��+]��J�)��eJ�t�a�ƍ�R��J�tc�T��R*�X)��>Zؗ)���S�}�R�X)�n��F7VJ�+�э���R�}�/S�sJctNi��)��9�1:�4F�����S�sJctNi��)��9�1:�4F�����W��Jct^i��+��y�1:�4F�����W��Jct^i�<�WJ��Jit�G�C!��J�t�G�C!��J�t�R*x(�Q�P���R2]��L�+%��J�t�Gs�g�\陮Pz�+���
�g�"�g�E}�a%y�BI��P��+��銈�D�l�q�TM6ѸPڦ+���
�m�Ri��Tڦ+���J�m:�Y�ƥR8]�NW*�ӕJ�t�R8]�NW*�ӕJ�t�R8]�NW*��UJ�t�R8]�NW)��UJ�t�R8]�NW)��UJ�t�R8]�NW)��UJ�t�R8]�NW)���J�t�R8]�NW+���J�t�R8]�NW+���J�t�R8]�NW+���J�t�R8]�NW+��M���&J�t�p��R8�D)�n�N7Q
��(��M���&J�t�p��R8�D)�n�N7Q
��H���
g#�F*��T8�p6R�l�N�H���:g#u�F꜍:��u��5Rm��H��:h+u�V꠭�A[�����k��F��`)����?,�V
��L[)��R0m�1O�JM���h'5�Nj���D;��vR�&�IM���h'5�Nj���D;��vR�&�IM�S��)Mԏ�&�GJ�#�����D�Hi�~�4Q?R��)Mԏ�&�G�$�)eԏ�2�GJ�#����:�����D�>Q��O�>����D���RI}�Nr�D���:�����D�>Q��O������D�>U��O�IN�*�էJe��RY}�TV�*�էJe��RY}�TV�*�էJe��RY}�TV�*�էJe��RY}�TV�)��gJe��RY}�TV�)��gJe��RY}�TV�)��gJe��RY}�TV�)��gJe�c����RY�X��~�TV?V*�+�Տ����Je�c����RY�X��~QY���~C�a%��b�X	�~��X��b�SB�w�`�wJe�N���)��;��z�TV���RY�S*�wJe�N���)��;��z�TV���RY�W*��Je�^���+��{��z�TV���RY�W*��Je�^���+��{���\��>W*�ϕ��s���\��>W*�ϕ��s���\��>W*�ϕ��s���\��>W*�ϕ��s���B���P*�/������B���P*�/������B���P*�/������B���P*�/������R���T*�/���K���R���T*�/���K���R���T*�/���K���R���T*�/���K���J���R*�����+��zp��������ٓ�|���MC>>%h���u�� ||F����	���AC>���U�_����d�zR������o苇p}|K������=AC�>~ hH���4��{	B��>�J�aCH8@��4��C
!��0ACH8B��B,��4����eb������F3�&f8XM�p��0p�>�&��������'�/XNL_𜘾`:1}�ub����w�9
�s�%�(L�Qp���`11G�c������l&f�Lf0�������ꨴ:�Z�E�΢VgQ����Y��,ju�:�Z�E�΢VgQ����Y��,�t�:�E�,qo���	���t�u:�:�`�N�N'X�	��8�����.�l&�o>�7��蛃�D��G2`9xMD��&�on�7��蛃�D��p"���8}s����9xND�L'�h�q4s�8���D�^"���/Gs0���98L<	�Il����= ��sI0��	�D��^�$:p�L�<���'2��D'Z�-Չ��DKu��:�R�h�N�T'Z�-Չ��DKu�R�h�\y�`Oq�:3����L�`�s0�9�a�7zI_0����T1}��b��W�����n�7������+�/XVL_𬘾`Z1}��b��m��ߊ��s�)�(T�Qp����?1G��b�����N{�B1���0��?�(�_���t9�ENg��Y�t9�ENg��Y�t9�E^g��Y�uy�E^g����:��^V�9�	�u�y�`^'��	�u�y�`��\*�/�TL_𩘾`T1}��b��U�����뀁[�����~������U�~���D2\-f8�Z�p��=rp���``1���b���4�i&�\,�1�Xf�(��N��,fB!��,ӿ:*�N�R'Z��ԉV�D+u��:�J�h�N�R'Z���%�_ �E�΢RgQ��U�,���.N�J'X���	V��t�U:�*L0��J�]0�/�`D_t����}�#��F�u���"���E�E����-.�/X\L_����`q1}k�h��EE�8�>q��|�>1
|,�(�X�Q���$0���X��(����i<��~�F��r0+jD���I���2txF���cB��v���	�:'d�ꂐ��KB
�`MqT�j����V�A��,)�p�����>?�k���yrp������n���	�*�&p������n�d7ղ�&��E�:��RQ�IE}�XT��PQ�AE}���S��NQ�9�}P�>�eLd4�Z���Ȼܚ���kUڷOU����ʾ���M�6�ޱ��\,ԗ����ļk�/3�kG�y�]_f��ٗ��2�gn�k#�Ek��\W�&Y��}-q��׸�e�ª�̼{��}?^X/���m��~_j_���+��K[Ll���hl|K0E��ߺI`��
�)����M��U�kz��#x���{�~G`��}k8A�!�
��l|L`��L�x>%0��:�A<���9�A<_��%�A<_��5�A<���-�A<���=�A<?��{1�����/S���b<o мx�-�ffiK�VϾ̎P��#^�
s�~CN;��$�Nj;�5#[/�.���A��AC}�C�@�O�	��A��l�
��ߟ4���K�n�x����? h�	X��!�N�x���џ�	��)��F���zN����zB�0*}zF��O��x}G��!A��
��!^�^4���� ^܌!^�ɟ�7�#�=�+�6���J�k0��!B?!Ȏm��%5o��t��:QR�(�N�T'J�%Չ��D�t�d:Q�H�g:C2�!�ΐLgH�P�S��ۗ���֎5Ǒ�kv�#mkvE��X�*2'�cͧ���X�)�5i�&��D�/���4����Z|�=��E��i�D�)�{���t��c��,5�,}���,�槏�׃����t�zq�5�}l�V|�e7���ֽ�z<���^��k��z<�u�:
��2��Os=��:Q�H��:Qr���u��z��[���#7�n�m�W�N�B�M�W�ΞB/��x/t~:�
�_Ed(+�Q��)t�:y
�<�N�R'O���ԫ�R�P�s��9T�*���ԩT�T*u*�����,�4�+��*�7�4�+M�Jӻ��4���+M�Jӻ��4�+M�Zӻ��5�kM�Zӻ��5�kM�Zӻ��5�kMo�����v��"VD7J�u#+�w��0�U�z���Qmԥn41k��,R���k"�:�hw�|���/�8���_����+�24�
e��И!�r�_!�P�ʿB�2P�Ҧ�t���q�*2�R�|Q�v���O:x��16��16t�36��gl��=�����{�������������cC/�gƆn��/���K�&�+ƚ�W���5c݀����[� ~�c�{� ~`�G� ~����O�A���1��0�3c����7��'|�F�0e���a���	���L�q$�d��"�	�qOP��{�zD��#➠����'�G�=A="�	�qOP��{�zD��#➠.�G�~M��'�K��"�	�qOP��{�zD��#➠����'�G�=A="�	�xR�܄!@�bn�!2��{�!F��
��?���%�������������+��
����~N�.��%���%�9�ѥ�m�{���8��6�������0#�t)�H���E�>�����LO� l��Ɓ#�
d�|�>�u������r��]�
�{�h?��L����7(4�p���Cӣ'	�?���} ��0����8�Ҟ.\#l����
��:�-aC��O��g�.�o��?>�x��ͅ�yM��ٻs�
!�;O���IƆo��KX�Q†�w�0��U����A�OSڂ{5;A)�s�OX)̎.!^�G�⭻o���Y l���
�'�fW�?a�0���Y�_`�0=���!~�/���t��V��\߯gW��Z1�9�����H�oN�֘>�|�kl�mk���G�l
|Ǖol�<h��k�F����0��ڝ~�	���G�Y!#�vZO����{�QXo�F ��ݽ�Vh�voO	�呿���#�+"��wy�}���z�3�}Y�^�g�׮�,�
�vE$E��2R/��)�H����2��W~1e��}��/�+��ٸU��[y�;�<R/7b_f��e���_�œ5�H?W��*��U�>{��/�ƪ�Գga�:����W���K
g�G�#KB�0"��#qF�0�	F^G�0�zB��6'daB�9��`��7��S��O�P���jA��ii�{��߆e�XwZ����HM�ɮ�a��h��-��6���?����%��"l����}��Y��7	���e�6l~xH��-a�Yٻ����}o���K��J�a5`�	V�g�Gp�/rc`),�v��s!���[����K��8��ª��k�`-{�z����G�Y����	���0�a���y{�0��A?'�Q�=�-���<��. l��}g��$nÆsz�0a +�,�B�ɍs�	�?B��(a��$�MN��a79=q�0�	���D�M��vB�N.�;y�0H���!���IDa79=�=a�\��b(l��=&q�a��D4�n/?X!"q�;� ���8CQ]yʣ!(��34���<]\ "�x'�`�9=K3�6�K/�L:w�0Ȥ�K��Xx��v��	� ]�����P�����+O��Y�����A�.R�@Z�^�,myz�2	���g!�;�apG�B+8�9��a�o��A��iN�����iJ�˨��4��	��2�\G5�II
GE�o,�0	7RMW�BW��V��f���[c8`J�;���4��&��ھq��Μn߸r�@����_5�s�0��Z��
Vӵ��A����b��}�Nd�}��>��@,8n��!<�hQgM����AxQ��i��#Fr��}�R8p:}D�\V5}L3*�ND�1�Μn\��:�>��T5}B�ӧ���At���O�o����������� q΢N�sK!t�i�C��������
� r/���\���#� �^��N�N_Q����)o,�l��]�@%������a�m��j�w��oh-U�o(���
-���-����SgC<��[	���4����%K���n�ç+4�����c�
��۫Ghj����!������
-��N���{��)E�V��L�k����V��ï�h��_7n������^�ھy�A�P��$��Mpvv���pvv��Lp�~��<X���;'�����xcg�i����#������#��l��%/��-�zN��h��cgG��;F�dg�)�pBvv��x�>	��N��dg�i4�c���4l�{Yf�h���f�)�p���G��!�gh��K�f�i��Z�N�<�Zm�:b�����C���!ȋ4@��W��D��j�H��~�q���p���<ɉp���<.
X�KS��e�

��.����e.�K���Z�i�
�h�.�n����u1\����
�Қ�Y.Ӛ&
�Ӛ]��\�5�LC7\�5���!����õZ3�%��Z��4���Z���^�˵f�hԃ�f�H����WNS�[(�p���[�ឭ�uJR�ikv��wm�n��%XY�ކ۴f7i����f�$p��Z�[4�Z)u�V��m�N�^��*eܬ5[��,ܭ5�G�,ܮ��r��R�;�\���6gp���>�	��핛��o��z
���'	p�fh��o������!Q
|��C��;\�ޣ5 ��7������w�'!��'��o�)M�p��)����:7V;O8�g�R�w!͞} b��%a���1|~�0���W�A_"���g�	��γg�A�zD��뇄����:a��o�|{�0H�.|��0��{j(�~��zo?Z�p�@��	��g{�5��m��?��+�����̺�}���g��VF�á4��-��M�íCDD������n�J?�՗�K��p�08��083x�a0	޺�@ ���^� t���w�j�@�|#���a���|���{�
a�S�j��ț����9
/xyoh�nk�����E�.�u[�O�H�%:���%�=���xG�>�ֹ[���c�� ��i��0JO�Q:���@E��@HËDV0��o}�A�A
X}۷�$�4߿#l���^J��D^��4#��׃O	���}��c�k!%��H�G��R��߷u�X~�&���m�wU�߷��f�6���>�@��F ��
����ۺ�%~[+���4@;���UaλM��a�._&��p�VO���w��#i����]��ۺK��o�.���mJ�A��F`df�nsa?a�I�g�Y���hf�֣���!�j��<���nk��<p�6�-9�Ns7�v[�DAp�q[`8���=�J���
'h9���K����zEaGo�5���4P����ʫp�W�Rk�2�͓4N����z�A��{ZA����z�f<0��>К̽��K� �r�@W�h�so{�Eܽ�>��{۫�W;� ���N�D���i��`��Ӕ���� �gh{o~�b���=Z����zJ���M?�D ʝ�hI{c%8|�Z|��7��u����UD;��H�#���c�p~��<��1���Κ�1Z�=H�C	���|�|�vl`Ώ�����}���:��%=8���!WORƁs8?E[Dp�'�s�S���OU�9�/��n	��$��9��+�9����8����otWy�P�pKJ��W�i��p�B�D|�p�D|�p~�Vf�n������m��۫�h����y"����i������`n��������?�_�-���Kb�痈���/�J��2c�˴�p~���`ί�$���I�>�_�y��5�3H�봔�#+Vp
��RT�5�/�T���7�v��7hBKp~�����8p�	�WhOp�BF�7/�,	��|��:�	n�}K&�MR&��^�MC=����i%���Z#�)8�G]
��;��?�QL����^{J�Wp�����|�8���3Rv�������;��-���L���/iu��M���_��}�ef���$��/8G����w��1����3��Nɔ�~>@�2��Ң
���;W���~>HQg����!���S�3���E†~>Jqg��i���|��
��G���~�@�gps���������y�ر|)���a�]�1���WhW����f�<�|��b0��������{�y�����]Zz�w��[��;�{��1�7��O�8�=KK(0?/�q�� ��|�0���/�t\�I����A:��?�Z]#�qm?a��k�0=:E�w�?&�t�,a��O���0�׹10+�? l���ϩc� �w����W���s��!a^����
[�{�Q��"���-a�H���A߾&�T:[�E���
��ӄA�q[ ��7@�ݻH�7�f��$���h��O�u�6�?��c��������/�~���:��/��_��L���?����.������,���n�+��%Բ���P�j\B�K�y	�/����oԾ�ڗR�Rj_J�K�})�/��eԾ�ڗq`�}�/��eԾ�ڗQ�2jߘ�7����}cf�oL�S��Ծ1�oL�s�>G�s�>G�s��>G�s�>G�s�>O���>O���>O���>O���>O�˩}9�/���Ծ�ڗS�r\�}9�og��W?���PKEePQ�'WX�^pip/_vendor/msgpack/__init__.py��Qo�0��)N�KR�*�A��=L5Nr�:v�s����N)C�A�;��ߝ/ИV����{�u��7hI
��u�����}��S�MK�G�>X�Z�HN�c)dh��H�/w~��~��h�E�g��߯޼��Y�\-W��_�d;n�	f#ug������3�O��R�hv���hK��[u	7�@�PƝ���Sf����3n�M��!wi��O���X��NnJ gQ�%�f���[*�p�e�;ʀ��qP�
�n�`�C���*�XȾF�y�Ѽ�t��&^(�E:�"��'���<���T��⬄z���-������C���|L|���_:���M��>���Hw%$!A��ފw‰
w�Oi�?�NH����6�Jk�����~�j���4O��wV�/�����tc�A8YK%�q��c�𞌾셥;�.��r��h��Q8xtrk��}?x?G��S�PKEePQ_,+�pip/_vendor/msgpack/_version.py+K-*���S�U�0�Q0"M.PKEePQ;;�ӭ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_PKEePQn�k��pip/_vendor/msgpack/ext.py�X{o�6�ߟ��b��:��im�ņ>�[�b�֡(ڦmm��T��>��H�"-�q;!������#�f�8]����㧝y��p)I�T�Y* ^��\B�V|&�u�;�ʌI.�.6�|�y1��N����i'��@yQ�γw�{�a���s@�Q�S�͚���K�,]�j/*��/��wx"x�?�5�o��VYП{��"�wS���y<)$��Y�0���x"��>:<M���N^�]^4�[�u{�ňsʺ���u��>�|�s�S)�:	�:+�X���Rvˌ�!�R�1��i"z�G�Sb��p�I�E�
��)�4�ˢ�'g��@&� x��U!$L���H%�=�l$�%R#Wq4%�p>V���I���YR�����̜�"OAk�{e�1\��]4��������M�’��ev��%�Y(<%�7��S�ǒ�0)�D��X.�F.��WQA!��a�qy��3P�,�A���7F�M�������_*qJS)��y�NG72�T�o��r�J�,���R��Z�t�b��B�I�G�"S�̰��S$�4K����4+�UP��(I&Ea��4T8K��]qKL��ɼW)��ơKT�b����1���+zFk�����B�XMx�ܸ��r���o�����0���z?���>	1�qZH8[W����+��S�`2���Y���"������M�tC_\�<g��T�۲�.^+J�p8������"���e�E&��J�o��Y�"_AΔ"�	�	�cXg"VK����Mf^<Ԣ*uUG�|!/�<����6;3[[z�;�\��������F��ȵ*G5�	~i�TP�Cӆ�t���T�A%w\��ݶU;�ؕM�(+ۭ��pdc�3�a�Z���E9�]�b�)�춊O��~7@���t#f{�k8aH}���4�!��^<_r쨨������Q�R��њ��N��X�=eQ�NE[X�hB�M�X[؝������{��WOm�e_X�cQN?@Z^
�2���ߒa��2�JK�U/�X6!U�Ӧ��O�_��A��B������Z�O�GU�]����sM��a��t��a
4G�d�l�dl��1,t�Dm�-���:7�k~uPAve�%WGG��,��-���KI�D���	O1t����V����n�V�u���/��aB��G�SW��N[��iUR+(���.��ɫ��cV����?������Ŗ���T=L�:�
S�Y��C�4�LV�?����9����$�
D%LĮAQ�]�-;-�*����2.	x���
��bS|�VWKm�5�f
x�������N�F-�:����iC 

��I;��k���XR�A�D���n�����3V���x���6��G���{�g�\��/��#��Ƞ�ɠ!J]
̭��V�C�ښZ���a޴hhJ�%�!oHUŹ����F���gO��w��P��qC�s�Q�K��;�~����m%y�ؗX{��j6�X�jԷ�C|�Ґ���:&n%š�[$�#s,�?�F���m~��]aj���´S�8���yK������C��JPkp��vsxܬf����t�R�Հq��m��RA+j/�P�?04Rz4�oW٬r�gP�̫����-�qwW~�X>V�/I��uK��ה�{H�'���ڭr8��.�^����f��!2V�*Kt�*>����>|�6���a0��Ԗ��v�+�2�u��ɠ�1�PKEePQO�S
�
�pip/_vendor/msgpack/fallback.py�=ks�F��+&L�L*CR�-�Bo��V~�,]�� �J�H����W�߯{f0o��(��;T�"����W��h����0ݒ�"���C~��$�ͧtF�<�#�M&d�]���hllL�dF�aN�hF6Isuf$8����/��L����(����{��M�3M3�&��I�G�H#���� pEq�s�A�&ܴ�4��[��N�8�A���Ͳ�����|��d�Q����f�E�ٳE��1E��=�O���+�,j�l��Ϥ��&�E�����܀�;�{tNG��I
$�/b�4�U�Q�(�wM�RӔ�ҸI;az��P�=�e�I�Eq���
8h�6
���(���]��4��>�-fDR���B�G��鸡�fY���tA�po�,��	Bn��a��nH!��(�>}�l�� ��Ç���ffвB�$w�1�gI�b�"��i*�d9o:f)A�	
K���4��������b�(�r�YQ���Ձ��3(�yNN<ӑ��]\�O�|�8�?��gG��\�~4
�L������\k ֆ �(�fF�Н����@�	�Y�O�B��F�ՠ�����Z��:�|N�1�`��k�&\M��Z{��ˋf4��3:K҇��kyjE�ɓ!6kӦ��`a��%�8���]�s8]p�,���4��H���KF�1D���`g�R N�n�`Ά�dѿ���ӆ�:\���m,&��,��6y���O�
��>OC��$Ig!7
�tp�‰(���N�M���͡��߂�?�Du��w����A�	Ώ������߃7��ߗ/��P��76.~�p��}{|t�q̐�GC�n�C�n�e����;���7ǿ!�76��O�/�.���������S����E�n��uz�r��r��U|6��b��_(�#�j�-tt��`��p�ͅTa��a��Y{2(^�8Q�����ׂ���@�Z�a�Q���ś�Q�I==�5\7g�im�
��D�$HF��P^j���M67o�X/�k�(�YG��抗��pu?G�2ru%�����Иlr�M2J ?�@��w�Š5�48�G	�t9��i�+������*�L���<I���S�����BK�!�M4&��!a�%��R�Ǻ��+.V�^�	�C	G�1$� �-t����{�X��;NsKkGIg�J�vؠP��/��Eo,�Q�J
u��є���F���E����Ռ,Z:)
47h�(�J1v���@4�f�fE�o$���Q��aT�<.���6y��#B��9�&t��6I]�Ѐ�4E9s2�^Y�eJ��у�t4<��蝝�*c��%1�>�*>h�J4���6�P} 
gJ�Ap���z�C�LHao��L@I�it���	<��G���	?#«�7���N�	C��?��h��V��è��_h��r��Y�������e^�+Y8�ҎA(�∏��"����J2©����iB�������{���w#n]��*�I2Zm����B�Ђ�§Q��*F�XJ����;PpYNA�>P'Cc-ix���PkN~�n�cVloy�ˋ��]Bc� ��6N^D8��Cp�)�}##�����P��ކ�N�dK���7=x3�&aNH�#P�r1e���ö��Hi��$�QbJ39A���-�	A�=�s��KrڊGD�,���i6%I������@�(	G�A���([�ef}�p:E���$ɭ��W�O5���n��t��eQTiH�Yث���l��^��Ҫ�Uj�p5����=����?�$nU�>�4�B�=�p��R��X�>�(����{�4O�:lTii����q�y��p���(E����)����k*�`��&�HD2��b�q���ɵk�I*�΢Y�glD�b�5�Q�u>���P[ss����B���`��eΙ�G�p�6:h�BĘiW*�2�g�j ����⿃|��2��r�)c����JTo�?��ؓd�"y�&�H0�8PI��!v7��"�6��,7�J�k=�*��5(.��aw[�&��/C ^��5��xq38��V�}��:L�.�᧟��J }J�փs�1v�s}|��!��1�aWى��iݬoX#�'�qذ�����dD����DW����8���ʠ
��Lb#f@���s���;ٽ��m�u罆@����A!��$�4ct9�?7D�Bli��R�l�Tih��6*׆_"�t��"���h��݀�.�G2VՋ���D��,R���z��(��f(a��g��$��u���E��S��e
�zr�{8ϥ#w���<�R>o�&�����e�̀4xS46tLR�Hشs���:'����|�)��i�.=��|�,fa�)��!��#ֆgz]11PU���%�{b�5JL�����\s�<?זï.�y�E<��i
qD�lH�Dl�Y��a��q�'��!�h4E�A �@��=G'r�7[m
�dg����Xd� �Ǜ>��W�"��Y��V|ONyW�A�����h�]�E:��p�Nx*mA���E�(��h��ɕ6�b8�qK)�vSá9p̪z@�;���,R�$�0�j����5���cs�Ln�PI�Aв�h���	�19_����?:p�9�	�ۚ��>#ƙG�t(C3�i�+�^����$�8��1i>W��z.���j�>��|���e�4�e��W-�$_;��'ҷ�	W\�L�v��Z�m�
.dWL^���&���l�����,��5��kS�-8��M/Am�{!�QY�G8�ӄ��[3B(ͧv�s3��"�A8�Ӷ�f��<�f��f�;a��X�2�v:ێ,�V�#�\s-~[0Z�PڝN�N
Z=����?=�k:q�Ss���6iy�5�V�y�L{w��@+H&���~V���41.b��Fp#��z��4RN�{��Xo�ʪ5���k�����
�.)���$��'
m�ȴ*�}��4_��A0<�.��3m�Z�_��*�j��
@�l��������j��,���O{�K���_���6A���ZRa��m�Y��RA�㖔yb
)D�b��H<�~	�y�;:��h�5���Ԉ�����H���������^���A0K���g������q�6��g6N#Є6��VV�f�j�d-�aK���
���ွ��h�_h��4c�1.��qsa�D�&����8��V-���(4�uq�}�TQ�Ϯ2���*�@k�{�*6�=a�RML�%�>l�_�Lˮ�-�KzYa��l�.X�k5\uB<���^sd�٫���WJD��>��}★%�`��ق�a ��<�o�
�q#�X���ta�z`��ц�S�+�M�H�,u	���1�c�w��y�2m���%��6��4Oe�<"lZ㛶��e��嬁5��wK�s�C��s�ik�Neq���3�ULK�8P�YLh��%![f����`D?m_��]l�b�d��K�|p�@��h�Ӂ��S���L��S����w��=F�%���$:4|���?Y勠g`Ϋɿ�����X
�	jS��T��J�;_�-��i����I�����Cë^��(1���(��9K�f��c�2q� �ǐ��V�����呀��4���sT�߭��	���g���dY���z|.k�J>�����Y*�ͣ(��P�r�C���`X����]����Z��w��dwp���=~�h��F��o9�j��(�Z��@�F��������#��w�flAm�~�h�lk�ѭ�f��(�����Ri��'͝��4_�aЂIv��z��E}%=k{${0���jJzf���ZS[����Y�E�L�g%bݕb�x�\�k���u��W�+)������`O���`�}C��ɑZ"�<��4�:�"k�Y����uXEV��	�x�������˓EY��*ѓu�Y'�*�?��uWV"��%>jU~�:꭫Z7_B����V�%T�h{]��Q��MN�{���(�����3�=AW�[�UU~�~�eOZ�{��v�Q"�������	�����{�ogM��<��vV��z��YGx��{�����Dx�O ��U�����v��+��v
�W{�U��^<��{���z/k���H���/�W�s+�$�W���ڹ�)3��k����a�:�{ߠ()ʝ:�\2�Xgj��a�(��oK/��Z�ѣE���韛�r����g��R}�U���V�o@T�a*^�vs����]L�v�=���f
�MbPK[�NN����,�*�R�ث!��;H�Clq_F.�
�;���i��9�rf�ց0���*���&[�"h�e�|O.��/���Q4�Y�@Y���s���\N��(�%OyE�Q���lƞy�l���bR��P�#�h�ڽH���$��N;�(����i�P>�L�gQ���ٳ�A��UHːE0���VH3��`2)<�7bG�S|��x~U�R�"���|�UKr���!<+�I��@�R
�An�5�>�GŤ�V8E P�w���
�о��@�f�--��ɶ������pP���9�r꽅�Э_��,!!��b���@W���Oc�ƥ�xa�-��0��A�ؗuMI���JyDԘ]�d3��\�D�sq�8�f�K�?������.���㴭�Z�˜�e������D�'�*.�����)��o���a9�h���'�nC�~���1�W%�����#�*y�ۅ{�^�?e'��y���q��L��{x�<Yk�rh'�E��碄�.B�{Pz��(�8���n�[�%�i����WU� �S\�U�'z��[ouw3��c*�g��EBg����r����t}���)�#(O¹�H���O1h˜��j&��
��D�%�CK!%��6�ۂ��0l�%*m��$R���;M��w|�Cۑ_rlIQ��w��ՎQ��u����j��tZy��8�&Ӊ~�'e��,�)�8^�%>��8�$N��"X���\$Ubl��:PÖ�H��Y�)�xrԄ�ʒ���.I�2G���T�,�kɚ��3�0~�<;%���<�bq�7x�E�G-�'5�3�-2bdxrC�8'���)
X>KE
��of�اx�KF�x�VO��v�{҅���vV���8��������BY0=�ub�3r�<������[$��MXB%��J$�����#����oGS��aL��p�,J�ٰh���#���Q��G�~���geD=�y������J֞̌%�Y�X�}d�K"r��/��E0n�q|(9ă�0��#�F��!�L�Ϟ&��1E֐��fT��)%���G��4�y�E,��rn8��1�H0�$�?��@��8��W�����Y�J�h���7������z�Hq
Irjt��&s�4��hI�7�L����by�Y"H��C�
=yV>��]�w�s �,6�|�Վ����,��'1��šEƕJ:�}U�Ǔ�,JZ���T�Vf�ճ��\�����'��_�ˏ�������3�¯[��1�؇"��s<_�G�|����,�jgt����ۦ��n�6�����IۜHL�NFev̖	�D��MTr	��]���X�Z������bj��7�ܩe��'Kc�d
uvR��R"�Nqo�-ɣ�	d�8��"�l�������\6��%�(pW$~<
�AA�f
,*1�چ��ċN���;$�u�p��F����Ƈ�ς�eU����SeV�(+��NM�X.���{�a
X��F|�D	�,�(6�$��>�����PU|���|�J��yozB���> ��a�?�G]��
�G)y��Se�m7��%E��$�/���dy�P@ ��]��	K`��8h��>��V���W�VMê��Yрr^�-��,Ts��dܽfǽp{%�''P���l�>x�<Z�gW�tkm�y}pù�-���	x>�</���m�^���s�_�y�O$�p)�ԓB�L���)�'��v%��Cf��teBߕ 
����e����n��!v{^���C�x'��S�_C�Ǔ�'���nV��L��59�c�E/K|�J�ܳlNݷo%�٦�a
D��w�:A�3nm\�lF�bnγ�X�"�DD���Z�a�+�@�Uo��K�����(+���w_Bj�_6�'�L�ŷٞJo��c�e�4����5\ӻM���/�n��9�"�_�C�y���3,�����K���&O��1�*_5ر<�\V���/7��Y�j�&M��LXπd�eǕ��?K���G��z�Y��g���<������D�9$S��e%2ߙ�*l���*#��&b��mr�S����""�ݲZ�,�v\�ʏ���������oJs2j�`�F���FO�PwәB�U�}j�S[��ٗÖ�80&pђm�o>*�ж?X��t:���Dk��g�j���Ҁ�� "wFx��
�]�d��\'ί��'Q��<�Ҫ/��3l(Ֆ����N��q�r�M����}���cv�/IG�7X���<�ӆ�%LM�<��䧧�vϗMe|�R�e\L�3�o��o�"`Q��c��a�1����'�2o���ڞ���kؿE�q�2s�Yf��ԔCb��
�W�`4?T�%�Y��P\Q5�c-��E���\��$���[P��^R/���z�{+�*��"WP����E1�d�а0�a|��4l�����u��Ұ�N8^��	�����
�k/!�ku�]�w�ˎə��غ�+٩����Ha3�Ŵ��r!�V��$Ես��M��U�m�Z�CZmM��]�z
�|�std�w�|�}�˚h�ļ�oZ_Ȼ_R��_V�'˄|��*^.c=��E��^��^��=>���m�#?VAi`}[=�� ?��w�Tm����1���۪��f7���/��v��y��Wm��R=�����X�Y�恍�V���Йy��S�m�7g�{�_ad�,i�b�jg��[uu���m��R�՛� �K�R}A�>ɹ�rˎK��bw��&��fJw���7J|i#Y5�d�7�Y5w���7��M2�6o�ύ�mul�OG��
.̱��h������g��C�^(����w�/��������9��=��X��?�(�*�/sAk�PKEePQZ�k���"pip/_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�=��[�PKEePQeD2!pip/_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���PKEePQJzBh pip/_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����?PKEePQ�]�מ�$pip/_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��ҝ�+>PKEePQ �qg  pip/_vendor/packaging/_typing.pyuU]��H|�_�h�[&	܃!G��¾�a�GmkXI�̇��T��^+�˲��tuuU�lUU���u�&���q�C�ÑB����(��@�6O��/�R�~��(�|w�I���
���̔���|vW�vԻ&u��skM�F�N���<�!
&Z('��ha�;��t^�ۙ���u�M��g����,c9�!�'L��FH52Xl��C8Z)I�H��r㟅��Ej�I�L�v�_���5�N
���v�hL~�R��hΉ��y��D+�r�����
�Wߧ؂���ۚ��Šz
�57z��kdsw'R����գ�>���w�7W/��ݹ�u�>�wA�skQ����&��b��<F��"��~���q��2�}J��ṇ����0S_�H�2	m�G��Wc=&Dx��եTEJ��/A�0�c�>6[������J4�2�v	h�"�Yˬ=k�Rˈl&�����n]�"�eIVI=wZY����5���dU��Vl�"�dAG;�ے��y�s����a���_�|�T��a�t���`�u�	~�aCm�cج�G۴�a�z̹[KT�6��a����UUUJm�u��w�_5�W-�2:����X��Ap��4|���>�	��?�wwy�>ad�X����L��)_
�<�l�}�����T��sY���9�wY&*�	s�&��L���Ny�u�^N����<���
����@]��P{.��3"��;`=��~��ه\�ⅿ^��������.����W��T@����J��w�<�%�7��p{���d��{ь�˵�&�o여�w=�X�d�ï��vI'�%�kSZ�Է��,uy�~PKEePQhD�~% pip/_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+{�o��IzNJI�-),�XY.�M>�YY)���:���
�X]U��/�b�
d��?�e�*x]�/\�S���׼b�+E�H�f����T�SBH��feI������նd�B��G�����&o;9�ՀȒͳe&a���Ȁ�w4�nvbR�P���
�p��wF�ȇ���v@��<��9���l�=�$|�����\�%N�/��#�s��d䐧SX�ڔـ�r��z�^��,�׈L^߈���OL�z�=�eV��[Ԟ�$/v�&�]&x�aEuF7�·�������)d�S)I�=��y�&Bp5~��~��+I6
���f/9��%n�\�:_�Q[����brA~8�)qt,ˎ�}c}�@�7�*�)�J	Pr�ః�-8��!�Z]�
ͪ'dh)�	AH�-ְ�[��_4���*�>����2[0��ov�:��ۏl^� $���Ȫ4�$˗�P3��4_6$�mL��*s���h݌4j�#�i�vT������������~��������3���'�#i�y���M��n@����L0+�7���L2PWu����w�m�
X'�w�ے�a�.�x��<�}Pe���a�����f|y2~s:��i�ϬRՑ�С�y?V�_†ô�Vk	1|�-�����_��X��#XΨd�sO�m 3_�91�A�46���8�;K�2�C��I���?���P'��N�O��5>
�g�����B���Z9���.+���lE�ۆ�\	ڐ�pҋ{�ӓ���
��A�P��!q�4�/PԐ�;``v45$�fц���a�X�[>f7������`&�c�6�U��ts���G�e�a��n���jzy~��io&�W'�g��w�9�F�A_�}z�^��g��?
���Ɨ�M.�s���S0W��b�S�����q<nƧ��a��n�?T䃱�a }]���-�7��j= 31V|.��,��`�E����:���0��G�i�vԠ^�>�ׄ�0�uB�^�/'gZ�'�J	&e�.��8���&�����j"rr���q�r����N|E�hfq@��+��;�
��(; ���^��ë��z=���9s�b�� v`��i�������SH�f3Bݫ„
��BV��3K5,�`lB�S�,Vm���!�y�\�®Q�	���#�3�:Z�jt-\��Z�Z�.kT!4Ŭb@�$��rǖJSU��$BQ�T�a^�(�2�rUgU���kE���+�aU��D���5�c��d=���'F�SeF���|��J��`M��!v�fB�|��*Ln��P~_(��%���!�@����:�SVZ-a�ɦ�`�Dr�	H��	xX��[�x-1��+�+�k-�����p��VI�
3�ш�&w((G��>��vM��`�i�:�:�!��29j�����V�A�6i,5`Cғ�O��G��b� ���G��p�[h8��1�^�VԎ���&i�����gTC`����d��d������3�Z�I��`&X�ճ�+��̒����`���Q0�~7�ς��B��Wn8��������خ��:,E'�%R��ZS�IL�@��A�@*�m��M%Ы�E}�s��N�#�Tn���P-����Z��9�h`O�spP K��*创%:����E(���qW�nW�%8Mo�<C1�.IU��m<���ĕ�|kU�13�1�Ei�h��v;���k'����	�f��y���jδ�1#��9�j�E���i
H#��x�M'٬�)�P�w3��pG�>����Zw�|���(}���jb�K��`�<�mͺdf@B%��m�������CW��K%F�A�ޢ���Iv�gOhj��>1KhY�b��Q�"?�|[����@Q�� !1�`�1C0���}T¶����C,��
�m�y'^�z�h��[����6�F�?��15�6U�ـ`]6kk߀A�ӻ���Yɦ���b�<�0�4���1�g��I��.$#K�ݶ2��|��
��H6�#��OY��?:G�((�OY��*��˭wS�π0�-�{z�<�F
�A]N)�&�Ł2w{z�WQ{�j����b���6#�p0��n���<Y����������`p��>!o2_��'DZ���m��V9e�94U��4����x�h�"�۾P��2�K�£&��g�Z��y�}�����*i|؝��,ew5���E�Мˎ�*�Ȼ��L��d�����;�xg�w�Ee��i�<��
Bީ���NoHڽ>H;�mOك7C��_��n�f-�.e���PŽt7�}]Ƨ��]Rxm��$�{$Iu�)�_�|BA�vH�&��zt�����ڥ�� ;�7lNܚe~�U�����1����1�;4|�P�ˇ�J��[�	��sxVN�{ס��D�A8pT�wT��N��)�)�Y��9�{D~
c^��|5�(6���6��4���-����Ŏ[D����"�
���+����ʄ�]��C�P�I��\jy�#���w���M�Z�W��1�+�#+�7R�����aI��%T��
^b�!^UC�Bx����:���QeYp�퀯�������y-N�PX
>gR&��ܳ��S8�	��跤���{h'u����ގ��T���ǽ�PKEePQ1�~2'%pip/_vendor/packaging/requirements.py�W[��4~��އڳ�g˔&eYܬ[2͍$[(���&J�ű�$���'�v�$@�Kl�s�st�>#�D�M�2��uIS�&+�	�&e�f��;F$�;A�~	����u�{�E�g��:����5���u��c�p��E�YT)���si�agE.��'�mrNV��H�dd�$MR8��HoJYr�$�9��ފ<-%��{����D�!O2	�l%��N%!$η�g��.�"��Y��yP<�˶�%3�Ti0/Q�'�$��=�79�	�X�b���ȿ2���0�p��9�X�ҴC�l�;���n��}� A�K*Ȁ�3���c1�<������i����
�)Y���3A,�
K��$�{?F�w��ۊeG��H��eN�E�8�e2퐡�U��`�d�X�����Y}�!�gL"���c��vG��+��z~ZW��A"�R*�g�4M�S�G�p�c���Ӵd�9���u]�fHY͎di����K��P�wy�*��*��L�	���۠s�p0�1�ɥ��g2)�b�$1�]*��*��5rK
�q��a�]4��s���(8��i��l�p��;��H~�����tڔY4�ƃq%��M
+#~h;��Qo~�ZN��}���Ѽ���ret
b�O�ۗ�g!�pP�e@�*�9���k��a�(F�<7�;��_�ӰEr��i'�&=�.~#�s�\n�e�*���Y<�ϔO\���sC���5�>o:�g����!�v�Np�G��#�^��h,m*(��:��\$i��c��O�v4�F�p�
� z�>4@e��p
�x��}`�o������VHu�H'�i1��1O��.�K�1F�#�`��oh���Ŝ>Ī#��q-<�D=hn��yU��q��>�qg��`�I=B=����nה�A��]"���t
�g�-c�k��MSu}��^�XB�խO(���e��C�E8T��u���O,p�Z	�3�h/4gS0�Q0���p>V�5
�"����?{_���j9ت4à�-�
���!��4��?�����}�|U�z�����
g-�8Vx��H�=YK�ȞI�W��5t�e�䚐%2�@��J�(��<���DF���O8dh�%#g/.^�Fz=0�幏����j��35���Vr?O'fð�h�hbM�&XRZs��
6Ke�P[�DJ�ru�vհ�֬
^6�i���D�Sc�����u��{玵�����~���32_���G3�;�6�;�ŖÝ;<�`'ɰ�f�}H�a��W���7*w���������\�׌^����B�U:VN��L����̀�X��Buxo6�+�3��@祁�v��S���1f�W���կW�/k����,�=��MǾnl|Y%�Q�-�u�Z�|�{2ʱ��Tɟ���,5��!Ohj�����s�v�Aeʩ��ť~�L�2�28���+��풿^|~�d�'��[ع`A����9�v��Nl�|��ּ*o:2�J�~l�X�����u���1�!U�A��U2m��ڋ_�J�%q���=��6r��=�O��<m�Fŭ�t���m�R����۬2�:͘��}5��� N#PJ;HǗ��!�.>�u*ձh�OG݄�bا<���?1��L��^��
3ʪ�I��t�:�*>�NK�
�4b5���7
��L�nP�Tʪ7�L�lu�N�dN5�M��P��ES(�=����K�.�/Ge#ᙢ���/2�i��	�f�VOO೓�=�}�XA��Ӽ6�)�S�m�C+�j	�����gn��'�8%�{ul��oř,y��kܩ|;8+�WԀ�������ޘ�Ӱ�oPKEePQ��)��|#pip/_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��?PKEePQ��'^pip/_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�?PKEePQJ�f`�pip/_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�PKEePQPz��n< pip/_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��PKEePQ�[UTpip/_vendor/pep517/__init__.pySRR
/J,(H-*V(�WH*��IQ�,���S(HL�NLO-V(-��KWp
P054W����.�RRR�⊏/j��ϋ�W�UP7г�3R�PKEePQ�
� !pip/_vendor/pep517/_in_process.py�Ymo����_�Pp ���Ň��:�I��M�>�Vqy����&���Ҳ�wf߸�(��K�48�%qvfv�gf��~�j�$���~Os�K2"�i-��JI'��(�ZP2mX��i6��UN��ˤ�;W�>�t��q�e��ӂU�d�Vk���J:$3^)��4gd���*i��C&X6-((!�ߧ�?��S�������ɛw㋷#����R�ln������٨��B�X�:���-�Z.���p p�%��F%w�W�!�ҿ_���c�%I��_{�K*��l3\��ڕ��FT�CV�j\�����%�-�����B���W�C��#�'-y��g��g.�OzKF�����q̧$5~p�W(�b����:��f�� "sVPĉh�B��L�Z
	&�W�l�K��+�U\���PfsȻ�dIA�fE�S�L���A��}�1��z��^��3P�U�z	�����������!���R��;��9n.y�B2^�����7�����_���t�ȧwC�a������)���i�h
	�f=E���
0h�v�C�Iޔ�10���m`P�>��f
8���gy<s��t#G�"�g�|����n��[�͊���*{�X�T�g�V�k
��2cY�B�+���dH���9�ܘJS`�6�++p�$�����y����Xf�5{|*��[������7g��������d��ы҈����@5E�G:kt��s�4�9��롧ȳ��<���Lڅ��Ū5zE�2&U|��
ܲZ����j4��(g����!�J��L<���m�6�- ��^ɫZ�9{�'۽�Ѩ�j���Ɯڜ�mLND[wc�vw�ANr�J�:�
�z
��n

ǰ��X��+R�yt����-Uq�ѝ#�}HW���}�п���r���Ⱇ{�Z�&��M=�Jh���$�5�-
85��Bk�޹=����qtl��I����F;uF���!�Zd,�j�5�EJ��9�,S)h��%w`�e�*^cĵ���4Eإ�a���0$f���"�d�nñW�~'��
O(T�������n�žU�I1���h���d��h[�V�^��;[Z �
��jA�`і�rAiC���6�T!�ɶ��0�K�kn̊��4K��^j$��8*w���0Y�3�lm��A���jJ�9B�Ʀ���(5�bi���Z܊��.0Ğ�%�$�T�a��Kx�Ӈ�P)�(��L]�ʇ��SvM*�.��w�R2]�͌��g��|��ZQSx��psz�A����-�����[7�o��'����[2��OWᇃ�`)�O
�
����r�f��[�ۏ�g�
���x�^w�������%��5����㓷���h��uΤ҇͵2^.��J^s@��4�?Dq��"��"�����S���ep��d���N�CEJ�KX"h
e��E4���ϟo�ph�~n�xm��C�9g�$�kDd+�p��[��z-`�4�/x��缩r��z��P�6�aj+�>������~33�;U�}1��8ue���U�JΩ�u7��	JE�ۉ44�i@����לB,�s�(�N��B�}Ե.�r�*^)t�߮��=
�ɯ���o���L�cr�q��U;S�4�2��"v��y��:���t�(Q��8~Kl�!�֣.oJZN��#�nm��N��qc��h��9+uW����L�}��h�F��t�F�#�6�:�e	~��V�^��`��bw�CB�8X����@h̉3���|���t;��#$D�m�^�=:H`E4Xs����̝j227�6@�7k	jӨ��V��3p��8��y��V���Th�3�x��F�)]d�7"!�F��~aEa.sHvxf��G|�"�Sk3D�w��p�/j���mX�Ё�ao�3}���-��}��b�
�@�u��ǽ!,aҲ
���+�x�V�J��;��Iֵz��V^�\�[��a$�\����:�C�!��V�])8�\[n^nRۘ2�ߔ�gk]��{�ȧ���0����1�\�o��\��Wǥ��[�[@o`��3�a�Xa���3j���u%�'��)�����ZE&��ԌL.�ڐ$]ʾ�]k�^Y������VbH꿁����L�B�k?G]ф�~a{��ޕԝS���ߥ'�?Î�huѾ:�eDO����i_E�/s?}��/3��mk�K�L�>�_�#
%��>�׿�4�{�v�M.�C��:ye�6���8W���CEڸv9u]�W|i*��|'��VE뎝��Bƃ�~�k��oF��п~��S�0��}��H��r��KԴ��������oJ�G�_�+�����x��9��ur�wF���oQ�,@�,T�բ�p%�!塮�h�'V��N��־��g։Rdkڽ�	�(Н�����.|�L�T�WA�-3^�/���t-x���F)��GGH4[�7M�=I��X�i_Li��PKEePQ s2��
pip/_vendor/pep517/build.py�VKo�6��W.����A}ضɶ�v�C�K�4���H-I95���I=�&�9Dg��7/�V���6L���/P;6X����������j�ɮ��1a��0�{��{�H��f;�;�˾�GP�6,���ڤf��mt+P�;
#J)�Ku�F���jF�=�Ԯ���m&�5�8��Q�A��ٚu���}T�u����d���҃j.��&��fl��W�}Ÿ`
Ε��2˲v�(Z�ܞ,�*£���y��R��� ,s`��Jl'�m��%I
4�c_l�f9am�D}�4�O�,wLiNJ��-��RL1(�ׁ�b���SZJ�h¸`�]�<���6�p�hNA�Mv�����Y�����ߢ�(.b��V�f$Q��	;#�*k*)��+�V��O��+_x��Q��׶�B8T_�T3���"7y��tj�P2��n�vp��.�y�W�ʘT7u�xS��FZB��I�G���`̈́���[�a��pAZ,��I��g�K*v�}���0�C��n��W�ɗ�O��= /�w����A0Q$�Yc5�L9s���&ۗJ����ų�^�?�D���||�EU�͐{1���?븩�󉇊txN\p��^�'Σn���y[��|�?�vQ6!�o4'�
�5�i���[����xW�?Onh����!�x��)OM��}�k�ڢ,�A!
�b�����ר<J�ǧ �[I��E�!�hR�`�<���W+\/\*�� Z�d8˚� ��6n��Hvģ��K��Vv�T�_��$�R�z�F��ۮ�f] 2�h͞s:�M���"~H�k�,1Ju�ـ�Z�t�K����b?��f����;a	���4�C,�1:��Vʗ^bq�M�x��=�k��䈑{�ql��O��aq���G�����a��9�I�?�<o|�1�y��R�b�j���q|�N}s,`��C��-�G]����$EU*�4\DY� �����~���7nmN���R��Yn��:{
z���J�����/j'�����;3@�)���d�-�5�XnC\�^0�+����N��x8�ৈG��d,������-q�*�V�\��Ʈ�#t`:� ����qB�K�nL|�vE�"��l�Yj��=|�c��LG!!�	F�q�P�qԜG�3c�4�P��١p/�󰘁�G
#�a0dF�����.�1ܾ��)��O"M�oPKEePQv��Q�Ipip/_vendor/pep517/check.py�Xݏ�4߿�UɊmāҡ}(��8�J<��K���e�`;w����3�|�&˵\��%�=3��͗�$I�6��&��Z��%L����;¬���
�&V��FT%i/�/�7'ߒ�R�&�%I2�Zi��5ӆ�q��k�Cef+����kf7$L�_��JH����S֢��
h�tnն�,/�^���k��vb%�"�A��l+*/�4W`l���r�XU���O:Q-���O�4*�e (8���%NE�7­�<q^�Ji@!Rsɮ*Nq�ѫ����uc5�7�@�=���Jn��d���5׭�w��p���w\F��5�/��Rɶ��l6+����IM)�͜O$L���Fhn�3ϭ����z����c����9x�
i,h���0��s!W*K�y^x[Q�X,y
q�e!�I;^~W�ẕ��9Ng�S&P8y��^�ࣹm�$OY!?m:h�>]���t�����@�Q٠Od>%�L�p��?w/��Q�
Q,�1�`IQ��K����C���]� V�
o�k�#���P���3��
���w���|��	|��`�!Տ [.�~
��Q��GT�����Cj(�U��id�+"!�jP"K�5(Ks(��M:WȻ�`	��iD�!��F��l�
'A&�k�4`l2��q�]w[�F�\2.��/C�	C�ɯ�O89�5�\
h���m�A�/
p;��"��E�C����~	��t���#�)�¦-Y		�`/��!�[�9�0Ug{R0�G�����S3����G�S3�4S��o�>���L����m>R3��T�;鑦	��:�{�!�'b���1���:愰iK�cf~�NK����.^IĀ�H$m�ݍ@(+����=,{I�Y�QC�zU�gaܽ�(�8>�Z�ڼ�J��
{�j]�HKf���ed�n��ɹ4X솓-�@��8��A���.��-�+p6@4[\��֠ަ�z����2��=�x[�'�"��!-
���C���q1+�/�I~�55;�z�w�k>��䙼a�ؗ�L��C'����߿�5���
���71��k���f�3<�5��i	������A'ӵ��)������o
�]��Ĩ˄��]SHL�JʨR�[���f���<8��`j�V̟�u�g��p@`u�ʒ�����E;��U�L���c�JZ�0�C)��f��i�;�h0g�R/˝����z�z��b�X���f陇�f�|P��PVe:�X#|v�ӈ~̘yнlv�W��C1q�̷���)I��;���rL�TU��'�4ʏ�_w�^�v�+\x��4�xe��E$L�N�-I*m�n�Q[cK��%��^J�`�l�D������8���Z���~1*���R�m(��4�,.\糿PKEePQ
�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��^�PKEePQ�]-pip/_vendor/pep517/compat.py�R�N�0��)���m��.Ҹ1�	8!4���f�q����=M�M�l�ߏ�Ap�،LΦ����V&2��	��ɢ$makH�r��X��Js�<�jm�������LJ�hAK��1��&cƤpD�W�F�ZI%��.�0�`�Fo���EG�+�O�6��j�p�Rs�1�sQK����~$��P��9����Y8n@|�\8�qZ�_��ކ�ػp���e5�J+��O������)&�q��������u������1&��J�WZ�f���c�����<��������؛�G�PKEePQ;ϸ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���PKEePQ�
Eh�pip/_vendor/pep517/envbuild.py�X[o�~��xQ���޳�[ȃ�('�:�!+�� KT̍,�$��X��Eɒ��}(�l�3�\8����Ŏ�)�l��*�J+X�J�y΋GX���
��4ۖB�r�x�R[V�q���z��4U���#��2)�P�r=�"�ۼ�U���yE�v�R��)US&�<E	*���%ޫD�i���Xo�>i����ۧ��z��E�e�d#i��?���OS�Ƥ3��ɻ���C��6m�ª�A�EѰ��,�(q�{��7��;��(�rx��{�z�d�@�1)<�M�E�Ӱ��W�p���⧿f?Jc�^D6&Ƀlh����p�K���?�/�Z2��5��#�?v\2�|qO�VX�8y�>EB�8�`D�:Ê���1�	G�W�&u��0Ʀ����0.b�9����v��U�y⡟�מ���KA����/Rh�'�����'�
n�r���ǵ&��;��r/��F� �O�>�u�ӧ��
���ra�k���mx�Vc�FPPVg�E[2��Jq�	�n�dxe�F�.dD�w!���5����#�X�t�*��*�D�7�D�_bɐ%�R"�1�B*��$�$�TBM��Y����F`���Po�@;�����	!�H���OM��-���8�䖝B�Hg�"�}2ch�[�\m\�DiJ�N㖢-s4.Y��b
���c�ASC��,PI��ցF��
%��m�o�g�q�@W��,b�D��ʚ��RN6���SX�k�̌�U�B��ftR�!�ژ�Ϥ�,�Cq޲U�Vx
��(���>w��`��
�&��
���W�һ��d���.���! E0�������~���x[�j�����.]�����?��=_�0��&!t�0b-��!ߕ���5.N.��޻p�sB�B�	,'A�Oog����r��P�K�;_��U��o�Q\�W����lf��H�N���|�bv���g�f��b�Ub���l�߸p9��|���Cf5����J��4�s��.�a��.Z�
����\���u,P99
��^���{jHH�oW�A�Ko2C�A���U��`.
V-�za��Q�y*��&�,.v�y(wlx(8�9��&b�om�&LZ�cN+���A)Y�_ϝ��QUD0Q��aÇ�v̋L����U�oe�3��r܃�a�+W��,�±�ZΪ&-'�5�7��������x�1����V�Ha�e�����{��Z�_��P�5�|⼁����x����.<�R������[Ŝ��_��v��}�?�^L$/5)����}0�fG.?��<x��Ĭѿ�
)V�.NC��A�Ʃl��5��I��5�[L>3[]p�>�w�>����V���'--�9�&�?p�!�ɝ��_�䔘o=��2'eTq�9�iE�|���YU�܃
�o�D��eEB5�X�M�E
h�I��C�[�F6�H��Y_bm6R��T��]�p�k5Y�(��$�-�R��^Y���:ǫM��F_G#�X�Fv���ѕ�l�ieK�.���H�f�t0P�.��)�v�Ai���͘��y1|�Ĥ����E��v��k�X��$��Uߞ��.�[1P0��V���ԭk،��5%C�N�R��z��8I�A���Q���FQ5��Vc�?8U��$YR��z�j�KQ�S�5�v�����7*�~~�Z�Dq2�Ts��"��љ��J��z?���N�E���z$�+0���"��-�N�^zK�N6B<)�m�������ϰ!?B@-�ݱ���BusK"�vV]^��S�Ύ�=�EYM
�[���U�e��ʌ��$�ǰ�E�Djf��L{vV~���8�=[I��,�M�:8��1���|P�����z�pk�/u���A0�tǯA�:	n/�y�y�a�o0�6�q�|ժ��dԤ�(�j�(2jG��?�	�0%���{��;w�<v<cV���UT�
��Q���¾�&r�����ݪ��?w��my��{�PKEePQ������	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�PKEePQ�sÄ*pip/_vendor/pep517/wrappers.py��n�8��_�M,/TaZ�S ��K
v�
�t�#�6�Ԉ�]c��sHJ$%9M/X`�˼������Z6��M�h��z�j�Rh�YW��p���l��k��ܨTv�TYM��[\�F�-K	�U8��O�B��ۭ6�故��ۺ�S�Ǹa�]^ЪJݳlu�ꔼ�z���U���l[�x�:ۻ�fv6�l���l���ٌ��M�/�9k��m� ���Y\�ɹȑ�\
�u�<&?
�m#�N#�$�u��/�S2�`�Y}�/f�s�jM.�M#��?��gUi�8�$N@

*��)Jf�!Nć�8
]�e'�da�:�z�4+.@���U}�lu�X�KDZT��d�D�A����Xrn$åp�ONN>�"��4�+V�m��{IA���Nq�0+6Rޑ�Y��	R�:�ŪU
�Ђ!�@�8���}�<$�B�h��o'���۽��V��Ǻ_�Ѷ��lHv�(N/4��"4���5��D�H@
����r��
.04��5k�gj�[d�^�+��瞋 [�y(21���ps?Z^��*��#���TC\�
�-u��!"��m�sT��TlK���r�F
�p��L�x#��]��Xo$�jE0����}CkM�{N$�i���
Y\��Dx=c0��u	J�z}F�|�_����p��r���?0�d�������ر�S�
YXL��?�%k��M��p�l�9�6��r�)$�?[��� �r�G�����4���t��0k�(�V�#��Y�Wf �RXX�s혙O
,D�ɳڡ�HXT��x i�d�a� �~��;B���KV�j5#;�(�,W�,���N!��ɸ�P&�1�N�M���D���E��2Y�c��)���e��Ł�jO�߀�3;���=�P�)�)��lA�-���V
0��LV�!��rA�d�\]�oy�!#�%�3E�FPPe�ѝ�%&R��[<t��v�
��]�r
ƀa��j��g�3e�r$$E�������^ C冔&��t�fA���{�p�x�B����}�d����0����qK�~b��S�h#�!@��g�R6�P��H�=ǣ������8��`�7n
��S�`Ss��� ���?R�i������y�h�(�ޟ����HJ	��\'�u��ĕi���l2�Md�
ӥc��w&7O�6+.D<� �)L�@�w���g��F���*�Iy��@
�!�aq�H���Ƀ	��4O���Y�[��P�C2)�3+ ���E!��z(�e��|��g���%ɒ2�d/�;|L��l<��E�U��x��lh-E�:���؟�)Jx�:��'�Iq(��0bT�ś��CTa���M�	*�4!M�	!��"��@�Gz^���+S�]ۺ$���LY���2DZ\q6�"��jpW�A$X�Av��A�{�2�1�1���(��:��ϰV��LI�0���t7yR���wp�����Dž�-��@�&�; �A�����
�]����e�]E�td�g!xR�E���x�0:�������y�~�H�ﮬ�xǬG� �ܚ�~�X�D	B[�u��qJ�Ż���:�sQā�ʀD�Rb�zW��
�t�j�&�CW��ZT�&��L^�x�K�K���IJN�ʶ�RV����ڀז�VEՖ�#҆{_(�}O�2�\hWM(W�*4����B\�`Q)K�	��\p���nʆ\�bՈ�s������ȿ"�����
��/���6#��TF�LDGv1�̤_�/#É#nN1k�+��ذ�jځi]ZZ�B���)�+��O&���0�4��t7�3T�iB�É`{�Q�0���"�`ۅ�(D5H��VZ�Z�!�Xڦ���Y`�2�uu-��T����"w�㥇��	Q�LL/�A��CҊ
��@ΐ�z@��J�ŷ��dl�c�[���xr�~�������t��b�f��|��D�|���ޏ�1�Xh��<�~Z���1T��;�G��&�m��{2��6��= �p�*$�<�=�;b*�)+dh,��X��M]I�cu�.#��dͭ��6m��$b�.������}�U���w�3��Q��t҉�>�;G�i��n�j�ɯ�WՃQ�Ϫ�z7�_���!Qؽ??&��`T��\����}�xb	�z0�~*& lpÓ��=m�*�)y+��%�hʽ�~�����O{�G�b���ӗ	��7�mP�-��$IF>��`
d"M6���@�pukn��yqA��=%�M‚�U 7�@d(���7cF�S���3�VU6YuIƴ`���r"�6�qL�JB��,I�
�4�X�\'fE�t�����Q0���:�b>�F3�G�a�
��$��\>Ǣ���p7h�
�Df��dn���Ǡ��V`G:QK������g�����_<���7��ܣ�_f�öý]נV������E����@���wTi�"FI��H~���f�_��J�B�.crM ��E��`r�_����"�7\����"�S���"mnF2\1��c���'�Y��k�W	�8�:"��oi �v`��#m�d��kԗ�\b��B^D�T�7��ᰱ6�0�.�~���f���NO���US�wgju32q�f��[-?_��g�d&��=����^lBv.}��+߃�s���W�u�L�*|�c9o�
�Zѣ�3�ǽ����F�r=aG�`Lֽr\�+&�w����A��s�#��o�{���z͚���'�߀ˮ̓�n3��`��V�⏒���]V�����r�ֈ�@gX�@F�+3���V�mեRD㫢���["R�E�����`��4��K�i0�Xq���SW�ړ��-�Ve��i���i��`c2��°�R‘)	�,���6:	jJL]BZ�^ɋhpm|��ya��)J�X�;,٪�^�=z|c��j
)�T��wA_��g=�χ��Iw`>	�0�?7�'nQD#�[�ŵ_z�0�q�J�����PKEePQ=�s�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"��W�Z�����6#�L�\M&ÁEF�"�K�B1ݣ-�jQ��j�.��{S֛�}pS�����]̖��@�O����j�
?g�F�@"�ßT���G��/�������x<h+���X|��ޛx�f2��z��z�����]5�bG.-�a��8�M
�?/�q�k큾=-�7U�T�A;��^5��ϕ��
��0q�67ev��S����Z.�nw=�6
|��k;f)�Ƈ��df
o^X�I[n�Q1�O
�,�W1�{�������v�.�}>[�E�]M���	�h�YF1�ke]�]5��A$ �y�w��l����yw,8�����v^�D�1̥e��ㄕ'D_�X\N�N̗�W�/�]> �F���=sC�V�S��[d�n��l�J�o
�m�%3JE&���Vb!��,w�f�fr?]箏����x����18�K'����:D$��}Em�v۽���j.������x �1�@Z���O����!�F�|���[����(߮����R_ͫ�&G:{]�Zh8��h�N�}�'C��QQ����hؠk���
�|�*��!�
&-�J�����34Y6j�F�Qѿ:��c���QP׭tm�#8·8��?7�%l�R�3����Y�nA�'j�B�Hv�E��g-Ç?e��Q�es��p��峾��K�=�p�a����,n.�E��X_�O�co��pS�|�l�П�7<\�c[��Z`?T7���ث'�>Ez�6�1�7�~<t����Z��uKW�MUL�s]d�3`x����.�x�草,��O�a�{��{��v//v�h��O�
I��-���0A�]�3��B)����["�r�3�����m�����
țK�xۢ��,��J���rVmh5��,������j��܀<ʂl0��v
L��~�������㬩�ՆZ��`Q�ɺ�昤��6-ArM����؈M�+�&ڔ9����U.˝'�
I`r8�=^��6�߷�%�j����r3�np��A'�47֓��p^�o�����Z1�P��?i���l8����rN��P��ٓ��G C��f�~>9pr�|W,�V�ӟ#�nl8��-��AK
�D��p�*�j�U(*_��-��X��X|1)Pd����`�n�I;[W�
�EGvݼ���п-���6��>ږ�l>@>Y?�M�"b�hp!<R&��p]Acf��G��Dz�/�պ�Ql(���[7K��w�c���i��~V��[��4�'��;L�B��(�v���@�+��O��1;�Ŗ$��82�JF���"v�=��-O�t�MQ�rl>6s�����1���UB^:����gM�2H�lG ����X�m�$�~�KE��5����ޢ�&�,�H�p���/ ��d̖"�X���Y,=���9w���+�=&Ȼ�brT��*@����J]�Mc�/fr',��l�k�G�F�M�TTX:E5����<U(v��|Q��zV�!6��(���/��/߾C`z��雿�?߾��ͳ��g}��__��=x��_�>�����S�T�	�8�p+�G@�����I�.��z�Bݳ��7 ��
��о�z$�C��icݏSX�&zy�y���,�2�P^m�K�
��?�󹷏��Z�F@x�@`YZd�'�:c��2<�T�+L*mW�i���%l������������X�#��2A��n��N��E�,�=	��s#�3t��3�O/Z�&�Eі����/�lG�,�z�fݒĊ_������r�uJ|
\�h������>ʑ9��Ftq
?�̟�a���“�\˥��L`���!O�d�l7����o����C>��y�Q�S@%X�~0">�2A��%�ßi�x!������g��h�̿��Y�kѴ�. �};�K|���s��׏�L{��[�3͑���dl�q���N��JN��n�����ۍ?/����1������fI�6�3�w[,#�˓���l��:�j���s\8�j����C`<�׮wL��)�o����|�� ��ڠE� =h�)���	�Qi�B�0���P�{X��x���O����4��2؃���N������Oz�:b9Z��Y[�ɹ�<��{�Bv��$C:�&��/���r��
���ciGZ8��Y �+T#Э:�ǂ7$ˮ!��?��Mp*��A��b��#[p�̛��v|(��$8[��.U�qY�/kr�`���&� 7[���=��䛧����%�����fl�(�
�??0�+��فa`���OX?e\�����i���z:�6��m��q]��Y�35�����#�}����罂�-�#�tz�̷���r2�2Lj�31�qj"��cu)��A��ϱр��a:����)ͅ���%��
?3�D�v<H��WC�z
,MG5
�K�:s.��2t�p��
��lOc�Auϒ�:����4}
���w#�j(�}�OHg��g�sQV�J�_�]��2�U��G��am ��/�a@�P���Iƙ����#0Ll�X@��Ӷ[]+RN��e���c?Ue�N��b�@����B�o��)�-�w���b=$�g�Fߒ\����b]�w�5��m�~_�(%�q��A:���_Cj4
;��WEK���:$�S��č���zCk����K�1�5t:8%e�F&1@=s4�o�想�\�����9ܖ �
U�!�
jxG!ZQcbl)ֳ���Q�f����m�>}6x�
V�޼�dۏNp핾��"
�p�!?�:�.������agw��z�ۿ�[��m�C�ߢE8��t��	QJ�ؒQ��e��+�z�f�����T�Rhr!��Bjui��S��3D����S�x��e$�
[CU�[��<z�*����4�s�EzT����, ���8;��_	���a�2?��=DCC�d��T���8x�t�H"j��#�����hTA���[h�y7�;c�����M�_ks�n��W����
;Rԅ�0m隄`�e�ڢjY׺��柎~���a�`[�#�57	������TA�f-9�)��P.������V�&g^:�B٫����`s2b�ൂ�x �f�6�m��[V�ݯƒ�w,�o�̍�l��X枊���*�Ȣ��0n���hAن�Ƣs�A��32�3���Ľ�x{��EC(�2f���P���~KTm=�ZH&��czt;�C�O� p�w��Y��Љ��_�����\(�㳪T\�2���Me�E	�p����f��gO�8G��K�,�x�#0�8N|py˫�A�����I�I�8��5���]�a�i9O�T̶�G]����;��ͅB�N�O�Y��,��0{�L�!��+����C��zY��P~�f��7
=�+�e��;�|�d+Rח��z(�
�<qS���2^�0Q�
�Z0�-k���,Z��ڄ~���QRo��p?��m���.�B�=@��(j��}E�c�ψ$�mLN��0$d�q�d�w�����?Dno�0�?!;����n�6j��)�׶�'�M
���SB_�"	��u����b"~a܆�"�l���|�_�-���*h��P>��|����FWo~57!�� n�.
���8�`Y�N8V�'J�|iU��0�"�Fkk�����G�1�u`�Z$���R�U�YyF���[�
m*��xj߳ 4>�͈Rd(t��Y�в3SFR�&�,�)}�&��)q#4v�_��##I�B���A#�6c�}B���WC��x�<nǻ-�pysChr��C!��Q�6���c��!�e���Ӏ���a�X�5e�eǢ��i������)dˌ]��)�F�d���J����	�?�a�n�u>7]�z*��N"	�C�}�I��,H��X�5�t���u���e1'���p���}Um�%/O�j��P_�EO0�킡	0	H<�Nq�����2�*��9�T y�n�俕���6�5��Ι�Y6\V���Z2�5�NG�ĥ,��ײ��#���𑞦G���R��������W�9��.�r��нp�X��4"g%�d;�ǘ���E�w�Z�B?��l;8���ް���}4�.��PI�
�B���_O=O5�S���(#˂8�1J�=?n��
E��1a����������h��ᯈE�^%#�?x�H��p�c�� ��uH�C_�}]D��_C4b?�}�*���?�z�!�ޜ�R�CrɆ���!#ߢ��x��č��M�,�tO�S�L�AH�c�.���|��0(�X�ȅ�n�z�7�<�>�D�1��'d=֦'��y��n�a2>�Ž��7�3��D+�iW�v
%6?���4�[��
ï�;`.���
��;u�7�x��e.���t��|pc��i��[��li�U�D����c�'�
�N&�6��?G�߀)�0.A�#c>���`=kRr�mk�vvQ��;���B�:���U_���KW5:�$EwX�\v	+p�����f��waB��xb�6��o�wN_aW��9�\]�:�N��QF��!��nT�ߪ��#櫋]F
�{��ղ���Ƴs��#>�`��*6��m��{�P~��2>�C��#7OD���ȶ�#pNEԵ����P��kaJJԞN?��6�HΎiĊ<I:���C6�"��ՎtȈu�Ξ��ZI_}�����D?�N|���4c����Ta�9
�,E캷��+��(�S�B.=$�ۖC��qd�TH�f
��j�c1<�kg7V���$��?��>�by[��¶c�6�\��F�RaK9+������*��Y���T�&5+B��Ԩ�Ĭ!2WxelS�J7�`4������yN��a'�&%�@t��@Y��&��kon�������O_���������dM[dz����D�#���D�E%'\a��ە��n�u��?��j�Y[�c#���ψ�E�9�A�-
Gs�a�)���h��!��ٰ	7�P�X�*�O/�uS������R��o�I�G�A�c\�QFF�^��8Nh��qvϩ��9���v�&o�'׬n>v�Tq�9�V��a1ET�1�lBˊ�Ɉ����Q�g��o)���Rc�^�|���s+P�*�v"��.!�>*в�,���[~O#�6H4�’�3��BZ��pInr�[bx�i2�w��i�v�[\ ʮ=�nT�E�:,�ylx�а;��Txe�U(i|��@hV!/n(e�f�/�A4'����>�]YP����1���A�ΰ�?����F/�)3��:eJU�I�,I�sk��(1���ď�,K�c}�����¤�4����;'!��ڠvt�e?oGS�
[���yz��5*pgۃ9�<~[�⌔�S�l˲�m�3�)�M���>A#�k��e��h(Ś���<�8%I�)rU�5V�����@Γ����a�p8�%8�����j�;c.jp܆Y��)�2�zs�<8�6;a��ÒC#��i��U&C �!�u|p��ݝ>��	~��,bD�+�ܭǏט���G`�6d!0�xV��{aQ�`�fІ<�ۂ<"|���qxD�P��q �r7�>I(���!	!aSV}[/Q;>�-�
�L�HC���UT!`c�Y�^ ��(Q���h���"��t16�xL���4;"k�l���;�(�v��3T�Q�5��(�>N�&��*�-��ŵ�<�[�g��yY#�uU���mߤ�Vs���N�e1b�/7��Ki�"P9	�.�ua|���'uyk5!��FKp�nq�'V��;�P�}���p����3��Ii�Ic��_xQ�2f��1�	0�K�H@��Z�E�ܛ.`��胐M�lj���1��ʂ�ӱ]w���M.2�-J!�.��I=#Gq_@Di�3.4��%��=��MXƘ �[f�vi:��!&U���V"Dv^+��5pV�8�R����h-���vp_�e�\�tj=@p��FUĒ���߆D6�+"�c�кG���zf?��#�4q��(~��@�hV^�@db@a^#�{�F�Z#�Tك�q�o�Ֆ[�d|~��/�&ͅ� i�Q^ �eH�$g����7&�C	�R�
]������ӻ�
��Q0	���8�/X�b�a���-_7;�it��Iv/�C�\fk9Y��s��y�Xm�����v�X�!��-���Q<[:tx&[�$y�i�Vs��f������بp��خ�k�ݟxB1��FgO�?>�@5�^�fy2j&�+�u���{�Ux7]���0�6��)#Cj�EN�	PP��D��t�
\?H��EHI}H��`�j�X��.�c�HS�K�9�4W�ly��Gb��Bx)�Č0l�w�Ȋ�(Q] ��\��K�$�����eլ��:2:6d�oXJ&z�<�l7����hb��=E$�/;��R'����t"H,
Rt_�Hi���.�%�(�B��#�6':)��M�ꀸ��gL���H'Yf:7OOݭ��ɷ�F��_�{���A�'�A�2��P=�8����0I�7핾N��j$��j~8�p�59:'����ō�\+'�~h�m���A�3A0d����M8���+:g��ᦻ��o�e|ϒ��j��\zOΐ�걲���I1�LDA_������L���)���({ݬZN�q�[s��M�(:(X�A]�"����p1p��;ܥ�σD1�QH^�ٶW.�&`��2�m'�A�j7�,
�����|yq��a�3P�� 9X��.�e���"ฟq�͵��>'C"NRT=��N������Y)����i�5߽a]D�Q�ZT	D)c�\��퉓�r{	t"�&,��	��1��Oz�t�~^�e������wf��
�䴨O�tYc,ɶ�I!Jx��"�7�[��W�n�(BE����MzN�ZR�p��q8�4�⻓�Dh���g$��TS�:�Q�˷�y?Ղ��b������r���u�f�ܫwC<��>E�>R�*�#���C%�i|���r��YK�z+�W_��%~yF����M.V⁕�4�S�E�X�Y�J@Xm�JD5Q��V�,8�	���w��0�k��VZT��}��i�,j�_�+Yr/���\�/v.qw��;�4�ݓO��bY��4'�S����!�wҫE6���:�5˹Oa,�c���OI��M���i��<�g&,��R�d�o�@O�d�i�fS4,�1���w˚���]�Fl�C=OL��$�^�t�Sǀww��=���:#Q����NVp#���ܻ�#�ZY�n[�2w��A4ij����yI�q�J�AC�Ҩ��K���
5T�)3���M�Hd�Tt!~g<	>�S��7γ�X����rC"2`k켕�U���G�	�3K�;@z%R}&��e��s���uD4���~���U1on�,G��2g��d�{�]{��pmi?���$��Y��;��S�[�k�U?�3�<��g�E8�m8:�6�8{8t0��O������S�.tq.��!�~��+�5��q�q`n�<��|�l�)��_�co_��6!Q�"�x�N���^u��oC-h��n���,W�e�O�GE�ub�{���V�ى�~�	o�d��ok�55F�3�	Hg�����uy�&�����>�K4�~5�NL��7X̣�Yà�#��A ��k�_l��zG��<G~�"���c��p&��WM�V�P��7r&>s�S)Ʊ�0�4�)���s�'N�O\z�Z�˜��'va�x���钳�v� ~3�x���\��:^�bm�D���e����yQ?�c%��N����F15L{�{d�.%�l��o+��r(�#	�'Fm5Pc`�E6�l:�\0"Nlu��d,���c29�ftg��(�ɱ�p`��^��ʫ�sIE��+=h�
1}��|�A����v�#`�����������Ig��B��:{r>�pM�q`�g]@n�ʽ
���\O.&6t�9�`��g6DM>:H�";�|�-\l��]�����A(���Ik�1�ͻ���)V	��&0$�EP�dQ���)ۚ����_�y�

B�?f�%�6<8�)�n^v@���NE�Z�vE�e�n�EQOT��@c�7�^�Ā�5��q���I�Q�r��y�<��O��_B�|�i�z朊~8a�n��q�>�p@q��2.)44#�����m���HBm�b�^5	�oC��Ԓ�,�!�	�'C�*D��IsN�J`��|EUO4Mp�]ou�}~9�==��A9g�����&y�H��Y�o��-rd2�'�e-ZZo�fm�UF�M%�ùP�qQ$�	��r�)0N$�?y�c�L�1԰�>Tw9�j*��gB�,���h>0��-y �H�o�2��|����t:�
{��b���5[�1E�PD7k>����e�#Kc�($I�f����tЫ��1#���︼*9�p��<�.m B&��a�Hx�Pt���m�'vЃp''r&×���C`�`x3	�;������sM���H�;s�����@-\Ibl�a,�!���C���f�5%�u6���^��?Z�&����Į�誂��B�nt�f''x�m�dž��L�ɠ��q�<��*���7�Z7ۙ�2�"���ͥ��'dL]@���ɐvw�h,C$���p�u�_�P���	M�u�k�qwp���� ƒ&Z�����H�>��L5���
��<�p�6ʛ�?��Ox��\'��7N����\.le9�4Ǩ�k7�y9�/�Zp�\�-:�bJA������3��Z������,XK�I�3)Ƹ�V߂@
�m�{� �%f��1I���x��GZ���,���l�!B�iwQ���
�w��8@�[�4�D���J��ê���H*B�~\&���Q�>~3�h-����pӌ�%�,�
AJd]���8�	i��,�Rl�u�y�a�1���p5�Y
(�*΅�f̺�yO�И�n��	���'��@M�a�B���0O-� V�V����<��"�-v�%Y�0Զ�_�ʜk��(���S�����ρ�V����|?���x6&�J>�k�H߰1]E%�xd�5��D��ѮxΉ����8�M��N�b���
�5˙z��ǜ��5-&=o�����B�'ŷ�'?��ޞ��$���ulZ��)'��'NAe�R�+�>3���L�'s��鱊�yZvF���.�)�bk�ysK���ɋ#�o�h�N�TL�B��:�RBX�T��U�Fl��!�F�*�@=��B!�颒���{�A�'��rt
�qs���0���R5�	R���RrhA�@�d�0��}0�R7��[*����<0�n!WC��̩N�U|{a-5Z�̧X_n��Fe�;�]G �|m�C�������P��+;�8�ڱdu��������w�0�r�����X�7�Z�|o�GH�va*dߛ���#�r��dƨ+#����uWĒ5j������]]�w'�.\`W?Y#����<�Q�[��u�nQ��:���(E�JJ��
'\U�fW���
��9M�{E�qjձ�O�;���.o)Sx���fO�
�{�><,b=|��7�MW[�³��*ӂ�D4q$o�
R4z��1����2�;U�k�s��h�\�Jy)AY�S'��@(5�$�E8tqx�H��h_�A4�겪��"��]�8T�~�Ȁ��e
��n��ԠX�'U17�*���X:�3g�#!B�ќ��Z�� �����>i֓���O�(�)��c"!M��=��(ߓ��7믞BO���[�}��_;�h�ѥk�f��݉��ƿz�w�:���sNgdN��]I��ۧ�?������
`�ߺ�����ő���jR�_=]J���N�v��[��㎸��t%8�T\���m`�1�E�=@��^���֧YƟf9z?4��uFg&��߫.�ItA�T?��z\��:�mnVK���n���K+څ�f��8��KE��� ���� OKR�lH$&�.��:�?�r��G���8P� rdj�_��i��*V-�Y�h+l��y��)��5Y�9�T
���/%{D4��F�E�{��ׯ&X����g}����b]i�ξ�5�b�N:	+s"��%Uw0Jr�P�g#�q)Q!:�,W�1�{�W6'XFl��Xz��ݓ�i�m�߃�V8�����p���.�M�;8}��5d:��L:�6�bv)��F%H�t����$�J��
���?�D@lz0�����2�z��:��(�eÉ��Y��zb	ʼn=7|�����q�a�Rʻ�0��ŃJ�Y����D���ieh+,�nk��<���AkYsݦ��!鋢�\v,3���W�v^��.)�U���tʊ`��,�-��b��:$��%�*�q���eY�5D�v����Q�\��v�aE��o����\
bS��.eZ�J�[��I�>��@���|Ob�����&��}������QC��⩅O��esϱ���z���bQN��&he�33�0������?�Y��}�`hi7Ɨ�=.�S
�A�y��d���q��cL�叾G�v���!l9M5���+v�B�m�U$���`9�����&P�Qa0c�DdQ*����'L�[�P��g�R)
�u/٣
*���[?nC�;�hoK�9�̎>��/h�@1/7���ح�N�f�k#ʛ�
&K�k�lp����y��;�T��û�5��5e�/|9�KJ�cec�����.oV6Ж#at�\Э~�ᅸ��y����Q�S��XR3�Jv�n��,zD]����ܮ���0u���������f���㿼9
馽�8Ѷ|B����(k�C��^l����~��0;�"���s��*)���3�,���ŋ�#����1L��ǧY��% �\�k�|�D����lk��/CX�1�n����Fx�kd#��Bc6H!$=����.�i�I�����U�A�T�
ؗ~Zz±�.��\�Ӂ?�j��m���i��{V͛�Y�s�K���x����&n%0�'MV=�yE��ZSkq�c�W��qHQk��ؗ4X�91�{e���u��|�}t�o�u�ލ^
��iZ�6�R�x;�Q��6F!�D!C���+���k{�u#
S}�d��Z�8�$�6l�#�i8T��H�(���Q��_��
=j�~���
=��g�}�{��Z#���J�yb���'$w��V�ߊ��`�Z2;���vw��{�T��$��6����;}�p4��q�FN}	6p���Q���st��Ә|M�I6fڈ6[�w�CK4(�
�Bg��ǚ��U�w�������{�v�Y4��KՅV��4�+�R�d�=cpj���8�:y�x�M�B��ʟ{=�^c~H�A �A0�
��n�����5/��Y������2ar5.�ź���]�:sA�r�۫Ĵ=t�j6����F����i�י�ܩ��=1G��r�s�pn�-ז�YG���T;�>v^HYQ����z��5��3�z4���e!��$][�8��3G�_���d���K��:�,�%o8wz4~�/ťu�1Q��ΉƔ�F�`s�
�ͣ���m�j�(c6 ]�3�
�7��e0ώGڀ[��J�W�?����Y����b�a:��D�R�?u�P��t���G�eD��
!�����-��1Sl0�:^�^�A�|�*�gb��wv�c�(3�Dd!�%���%�4ł�}�Ї��]���b�ם:�u�) ��9d�����0�Ӊ�by�!<�V+��q�wD<��(ӱ|��I@v����3���I�/�
���X�I�
2_�
Xo9�V���'5ܥ �>�}�]�&E��k�;��� �N�2��t88��O���8������?���5�O=����?UuI��@�t3��{Y�ķN7�ml5�p�aL�E��]T�����j._�1�%k<d�P���R�Uu<va�L��נ�ċ�k�3�놵N�����0��9g������a2��ߑs����4ހ�s���U�S��|�iHq����X1ѻ�{/��#�K�LN�t
�yB:���h��C��E��;|�������/N�/�!���K��&z"0�������y���0�`��l�������1�ge���o�c�𺉟��K�|�ƫ������Չ�8�}K�ۋ��.��HM��8	xV��g	��T�N��yru�����ҋ:�V�v��Ԁ�(�n��6Iz81�JB��o�m3KG���<%4�	x�zO|X�P�W����v�{Y��VI�+�Nw�#h���?�������򡼼�Ę��$}�{����˂�~[�[`
��n���<O��)U�H_r����Q�8<8l0�B�f��ѝ���x���z1#����6�o�U��i�)ۗ���������{�|�䑵��2������L_�ݯ�:у`US��Y�~ǘ�Y(�4<	��$҃&k��E&����T�m���õa�3DV�����b����C~��ϒ���^[Gm�|^Κ9�	�����Q�ۺ�ϩ��s?�b�KN��1\$Ί�x)�r	p��E�o��d/���Y��ŠI��"��O�f�*Cc�Χh��'���/�!`��x0PWVІkK+D�DI�� #��=f`��F�g.�z�S�?��s�&c��ӕ������yD�v��4�'�z�a���|O��3��ģo�L��NY˰�#j�VX������k�O�gI�R]jٓ���2E&T�o�����ֿP'.m�c�
lc��v
�	7�0)�(���䐓�{�dV^�a�C�<�����~��(��\F�t[x�s߳B����:�-�!֖��E�-��yT�u�f-�(�$���^������!0�i��_� 
A2(�3�,��t��'g�hΓV���1	���8���͐��3�,3�/��1�e��-�縔U��t�j6/U`)�*���IJ�xw5dmkS�QD
�9�Ѵ�	c(�+�(����0��Fآ9��c��^*^� �/~�j�K^F����A�����m����x���Y+;~В��z.ZA�/kfF��٬�'�0�զi�m�լJjW5�!�#�����Kouʯ67�#�L5;և��v�%������W(�(r�>��_�3|nί6%W�RK8�+��Q�kL4eU
}[6,���E��76TT
y�E���A��	�j�tצS��u�;pӅ���3NJ�,>����\�L[�
J�ZX����js�E���⺭�P����Cz�ޭ��S6��MC��3TC��mY�]�<�gK̿O�V���d
R�q�����e?T��E��'�E}�"�D�r���b�_5��X.L0�Ċ�ڶ_�FO5tV�ɾ\D��BJ�C�Y��OJD�����r5��ǿ$��Gܨ��-�5���L=4�d�_���2?"lJY>��D�8*��Σ;��6qgf�%7�2w8d������t��l��l}I����!}�M߇n��0����1�P%����ST=��(��-�p�燡���\�$��Qb�]���'��̂�6;�YE�?R4m6��d��m/���q�M#��q}��w�&7��hp~���y�!���&�$���ԇà�3I��Vd�f[,��f:m�� �G��#���	��FC����(�s�QB�2#�/�ڲ]{u�e]`��ӽ��3���z]n�?P��S��] W�_�:�a�x��f-�x�(���8hV�j�q��<6r� }�;�����h��
�X��D�֒դ�f>�Q�ٳvk��/9~��ϯ{>_7�F=��F\��>�U�4���ԏD.V�j?g����;�ݚ E��5���Sr���q(��$R��fC�2�~��� h��%ᷙ�X�s_�'��bp/�L]p?D�>3M��*�X�$t��G�����V����y'��-
�ϰ�_���3���{C�����ʛ�3Wc'�������V%�Ų&�h9�u� E�=�q6���i���+��:�JԜ�X�DЂn4՛�Cc��33�c}�+*��,n.�E����㋠�`��j��r�`���u�,�_��V�u��EHU��Z���ŶZj.�bI���C��=��?a��,Z[�T�b��
�^T�λ�}M�N,m��5s�Q�9�ڠ>L�%��`X�g*����	D֌"��_H��ǔY�Y
XU&
��
}V��N�%�Rbts,V���'|]���7��MW&}�i�	��S��-R"&�����Ӓ�Q�}5=]�ن��j9M$
X�Q�a�7�M�A���?�Z�^�סr���cK��˓*!�p`�!�u��A��G���~G�LE(��U�_X\�\�M�J<Љx�%�Uе��[^��a'�Eđݍ�وc��p_�3$��(�P�5܉6t98��f���ǘ����Ñ�����\�� t�a&d���r�e|'�p�P�$�tt���^r�����|�΃`����tN�ĸ -�S���o H�!��?cf��#��GWU=k�"`��4�+
���&a
@��ł	�k&�/��3_Y�x�-�+����Z�|o��킧�n��l��k�3°��may��b��%��.%�m�����o�J~�)��15���h�dC)'z�Mo(��Ъ-���xц۬U?u���r;�LQ�~��a���O�E�������x3���t�s[#���K*e�ݵ!�?��0v�J���-�U�c�<���s�� r��T�L��e3��\����[T�O⌃�����6
�s���{�oF�l\�]A�X�����dR@v��*��z�?QS`8oF���F'�J;���
w�mS|���IM�Z�-Ft�d���ʩ�������v^�����Mp�!����~�
����c�/����)]`d��Ls���
����:ȝes_�iZ��v�2:q��Z\q8�2�P~�S�Z���)�D�Y4�8��/����3�C�Q��'Gn��(�0�0E�c�j2�twk�(��c��z�P�]�@����}�����ߞ��~�.E�^�f�68lА��b����U}}��|x�6H�-�\�\�:���K��)�J�do�(MV�F(�V���Ɔ���y%N$Zf�Ƒd!�}t�C��v�I,(��(7ר�\%��m�r' �I�(��^�7��)�Ő���x*������Ֆ(�j�

��_#`��6��~�g�]��5#�ߊz�#�>ځc|檖��yP��տE���G_�3�l�"�o�JJg]��k,tѼ/��
��qô�V �.X��iX.+м\�r�E��.�����ϞI�Y�=C���_=I�M#߇H�I>+(X�x���z\����e�J1.8Lq�r��>Y]�_�S|��M�H_�#x�7~�5��䖉ΖZZ�	����1���털�vC�B���y�t3nj���kσ\�T"`�ݫ�;����[L�6;�IT����>�[�L �I�]�3��ؙ�OVsb��y8\ë
5	͓euђG���}��P�,w}�.��xrJ�8��JHE$������� �̡%&4Z��>Fpg�W1���xB����U(u��YNbwq8��U����u�V��BRr"j�,C{�!I�eR��w���_�򌛞kQ.��&i����hL=[��λ�v�¿���9����Y�H�:R���wj�3VԦŨ�ugD�Υ3�}�C�]l�� rʘ�j<�~��#�~:��0��U��c5�?��1Gi!�/��o(��7l��%����+��}v�:�N[�Yϋ%(:�W�a�
^�o1�Ӝ��I���C���M�P��L踳ͮK2K�9�Cl���N�3ĜWI&b�)�"c��&����G��d�5�ye�z�����鎘�_B�;�դm >\׊��F����#V�<����_˝�y���t�U�2䇆Y&�jr��g��g
F�H�阙��PL��)&�`i��Iyn�k(���W����ln�{Q�)ku�t��,�sD�'��z��;з���@����������7��A��M�]�`�q��g���X������}����5��ۓs=h�I
ڃ����Y���07G�"���t���6�X�<ʞ��k��ThL5/���!���
=��
���S݄�qb]�B��s0S2κ�`~���8GஇgD�����y>�ե�O��ֶ=q���r�O�Y�ok�+��G�)�7����A�_���fFy��\)����c�S9�7���1ȃM�Z�n�cv.�~B/�@֏}D}�i�fn9�;N�d>a߰�i	U���FO�.h��,2��)[#뿶��\.moI�����Q�lwu��0���qM��EwV�n}0b���LDp�[ܐAQ�	OA���_4���6������,���~�D�){GDE��SW땳;o�4�إ�?P�a���J��E6 <�kG�[89@J��16�2�،ɋ9It���f�Q�Bnc�q��=�T�W+�q��$�"������NØD*�.�31;"�,?hzv�8�{{,$���V������#����:����q�;jj�`֩1Ձ�U#?ډ��;�cC	
�
[%�i
}�~!3�4�ٙ�uD�D��/����6~N.Պ�ߗZc�$nۆ�w�����zή���j9��۫�F��&>E�t���C��)-9�u��R[���V/'!	K��x#֊�4��-½�|ƌP��35.���4�s]���.Ϛa�p)��H��^�Q7|q��`�CAH�@�-��L"(Cf���Q�y�YbLM����h����l�V��Ս���6�byt���")6&5���9�C\���O8	��9�3�>�S�?1ұ�t4Boz�3���G��Iy4�k�w��`����N����`��S����_(�5gGƫV�K���·w�����OT������#^]��EA����$�,H��G�g���虃�w.��� �p@��q�ui��7�_<���7?�$�d��m�c�p���S�}��ZO�5��X+���PS�e���f�:�$:rJ�����-K�s~�����i.�1��|{�Q��us�b�˒�#�ɬ7C
=I��*���i�.w'fe�x��	r���͝��Qh�c�;U*p�\Rb���[nMo]���"�#�3m>�Hs�d���e����}Lţۘs�C��p�	�m��]	ؖa�
�n<�IO��E;[SQ�ܾ�C(U+q����Փo�}�yɹflL���\N|���-ҝeaH�(���Y3�F�f^"7�?r�NS���Wr'~1{(�Nft�w�G/tǿ�� 0��:OVD�{�]�<�~��G���4ߧ��6v�}�R�ŸS
�pۭ���|�rO�~37�z7�)VCz똺ql�n&%�6<�(�<�h9����Ѵ��z[tEP�	y��y�6oi�����Q/�p�2c�bA|�<�8�E�f��Ꮉ4!�+��DGb���&ÁֈR�Y�� �n�c�%��s����\7�	=e�t�qz�F�����(H��,���t�N�Tُ8Jkc&V�A93p���Y'�d����wbb���vd���ƛ�ϕ0ѳ8t�|��m*/�Q��n�lM4%z��Y�.a�Z��W܃寫�;T�tQq�c�.j5Q�!���x����o��>}���[�׫�/^������d�2)��B�/JQ��Y�p[�'Q����������a�%u4?�o��U7ËN/a1��8J4{�E8�Y�C<Rn���{���f�(v��b���_f�u�
�U+�1/�����@1�g^7��zܛ$�NI�+�\H^A��]��<y��_�>�<����QDܩ})�-o	r��)Vi����䷉u�o���q�2�`�1����}||B��qih��*vk�˅�~<�SRSS����s7�X!$�7$|��	�%��ʣ��A�%��E%]S��iP)ƳH�#�#^�\Ϛ*>t� (��%&�*a�䰿v/�q4����Qb3P�(��X]_�e��f�2Գ����A�t
<N&x�^I�A��r�U��>���9{�^�n.N�����h�i�2�t��F�Ah���3f�ĠB#Ͳ��Uk��D�zEdf%ldd{UHI�0�\Oa�å��:Jvp���ey�K����pJ�.��v�V�!�j�A*.���_��j)$B
H�U�ijgˆۓ��6e<m�h~Ͻh���TW��z_,)D�!��&)�/�f·z׶�,'p��OCB�83]�V��j;��	����hM�Ix��Ÿ~:f:pY��B<&��^����#g�����}��ղ_>��l��Ү��L6�R������H�?3C���ic��)I�'C�+ws�r�E2��E�J �d�|�o��R@�m�U	T*�;@S@��Ē6��^�C��NR�A�Ύ��	{GȤ��0�zј"(ϚD�)����C}r8�:�_f��=�)�_zH!Ӎ���
l�a���!��_�Z]�;�(	���8��]R�l����*Z��#��YW�z#����^C�wP��r!�b�u(E�ETM""�͚5P�US����ګ`��D��W�r����ٺQ��H$�+q�fMIZ�}��.�䞀`�����'G_<�<�^�7�A:�m�����&�k
��b3T��&��|�d��j7�}I�M�FJ],Ք@��r$b5�m�3	����·G[z�g��0�|@Ihu��ɝ!k���.�t�4�K}]޺ 6L�c�ƉԒ��O�Nmy�U��at�Ƥ!�T޽?{B��@L��Z��*AnG=��N�sa�I����i:`~��;F������a��<�sCa1&�V��O�n��i��Y����I׈����Q�#�,�2�fت#JK���H�s*�L�"M&I�ɨ_3e�s�P�"�;��V��3��(�0a�uvk�D\st�-�*����_���s��1���_��v�і^-�XP8�)X+��^�c�bF>�*u���ܰg6w�ƝM�M���'a��.|)K7h�X��3ƾ���R�8���.���}����)Y��|����v�Xk���D5�$�Z�ﱄ�rw,�g���U���u��}�o�
+�
e��I�p���]�`	�G�+��ޥ�/�5��M	��s�nw�57+L�
g�n�u�t	؞���JHi$;n�w{5Yr+>@i}��1�I{�.�МCZx��.h0�y���݅{��&�k�({]S}X�A�ޠ�3luX��S�s�{�U=�`�G��:[E ~��O��O%�Ϫ��r�08P
�[u���zE⟣�P��\
j>1ʄA\��u��V�5���oFh.b�d�\Ɯ,{�)'���mEJԙ�ș{<!3ں��)���f�H�z��\v���o_�[�٣G@3{�� �QK3��g��G��jE��A���Cj���V�w��
T��[���J#�,g��⪸y�I#�H2�(�Tu�usQ���E�!��t�荋Ǟ\H4�+���:jK�M�vw��XmuYk	���с��$��L�$��A^�Q�%{�!7��?A����%#�6g�@�!f�4l��Qk �R�����~Ov]����5%Ը$��@䨊�.7gL�4-s�W�Ff��_;��	�J����Gi߽�bD���Бw�Ќ�=�3�b$G�%_��f�U��R���u]�VL�	�Aw��uBAL�fm�f#��C�
(����l!R���E���b1�A�n�����IY-y�xX1��rR��yD���
�зe�m�ɂ+i�ڴ���T�6��	����%8�K��p�����~��A�%�և?�~:�!������(�T-���WO�������� |u����?��r���j龡������ti�W������_��X�o�݋7z��E���˿�z��ų�o_�t�.t�m��������.�̌䢘c��
�`̊�]���}�{VM*:S<W��p$��W��ZI�	шwnh`�U�Pj����9F�r��mp��7��hJhB����W�O�5�?�6�~=��>\
���hNU7�qg�a�#7��c��'X���D߶�g����}Ҟ`L���OY�;Uĺ^�C���D��z�so��O:�8&������كb}	���[��WL�x�ۥ��c�0S;?�j�SD��XFA���_��G��K��XÆnJ��)�;�E�RH���Ƣ%�qQ��.�\$Y���.�΄?�ח�軽�Za����Y_nA�*@�'�Y��0ާ�pc���-��"
7�W��m��~���NE����+Gȟ�XgR4J��	(j�O�/>�z�㌗�Q��Ү�7��L�Rηpً/���n��3Y;]�v��x�i�fam�>Pe���u�ā,A\LPnK�C�T.5�o�뺹�_�'C)���\��"p�:�et�)7��@���ϯ�p2��a�(]�5ԯ��aLy�}�A�TO��)8�0�%�n��9�&�&��P���0T�t�*a�-��e�Q[r[a}�E�ꜫ��S*N�R(K{7pK�� �2;�kȷ�Xrv�Qt�0��G��G�'�MS-�!�E��gEhf0�1Ih���c\1����e�F�t�	��f0��}`�����Q��$іO�Wg?����
��l�GVی��Ó�ꇳ�����*)�?�1|!R��v=K�SX�B�
Lz�L�?9�c��Ӭ�՛�`�<d7.T<��
DŽ��B���8{��Z�eO?;���s4�Pf'�É
��jΎ��t����t��i���dglNu,f�$	1���!�F�-9�R%%&={��l[J{bʀ���20��Cd���0A�ڌ���$�ɜ���%��l�T&��ϺŔ�g�}`�Ք��������RZ߰���Ozc�8]����6�)���(���W0pBm�}�u��r�y��J���}�ɟ0����^"�%LJ��5ެ�*�G!Yw�`vc��үc���:�up���*����E�U��O=ׂWj�i�zW[��Y��i���&���\��Vq.�>k��s��*d����U���`����40θQݽ�x��+��Z����m��F�pg�hE���g�B'}���s7&�o���`t���I�{�l`�}$�I�������P�^����mn��Q^�
�T,�6����IԴ�w��.�=?��@H@��ws��vL��f��d�&L&���$���#_K��岺�A��R�0�=+u��d��c����xh�"u����8�nu��B�
�Xpk�6���\n*���[�,����}'i
H��4uV��Ջ"k�c5�8�uc��pS9O�ҙ�rʷOD�mAq�r̍:��O$��"&(&/���;��܀x�c\�t֩Lc��=I#]_��+n��_�C��e��B����8�>�"]���˄2��̒	]dG�0v%���?�ts�(!��.,���o�o����oƮ\E�k��f���5�k9����X�ì��Q#��:�Qkn��H;�g��G�����
t���HG3��A�-����0�;������ֿ�q�]�7�Q6�����꛵�X����<{����������%��cuXd*�i�C�itf�����<�LG� �Q�H�e���օ�������Ч�\��l'�閎I�%A+��6^���N�Ln����w��0�OGXL���Ѕ	��W���
�]���f��e��}�z'���xy]�§Iv$8��T�� e��(�D
�R�8�^+�j�\��ӥ�\�]ޓdY>��ҿH��A:�u�q��j���W{U��J���B-��҄�d҉�{��V�\b١S�؁�n�7f�aI�ԔN�L��suT��h�ջ+�%��#:TG�bH�ӎ���YJ�Y��p�r��X���m���ُ�9��N���,Vy��9B7N�;2rB�|�4ի�0P�\To
F8�W�>0��;}��Gp5�;Q��$�{�yH�Ll`���$��0v��Za�
���e�Q�x�$vF �$����F��w�)���>�.��@B`h�g\H��n6�~��Q������#ݔ����*��F߇�WC�UQ���?�,��%.�u�Ɗ����#3�#�n�
E5T-k�
��ns
���ql�H���c�*M��Di�D��F�!�ml[��}*	��m���,��%j$��Z
\FIͪj>�LB˰�NclҶR�
�{�P�#z2Z>��3�Z)��l��/��g��ˈ�^.J�(�&;^�5LBv7)i��ߚ-�3�
���HhE��s
H⨸���KΫVͶK�]�q�8�	DV���r��B.���aW�9�R��.״9��G-d�,Sco�!��TF�E�����l|M�&���tw�Bl򽄻�z�'ޱ�wn��R�y&7X�@PMk	5zǁ
�aL`AP��E�[)W�@��[h�"��7�Z�t��Y��������K�o�	<�zU�t����T-�B��<�=��Hp9t�w2/W�z����i���(��o��9��C��.�u&�y��y��	���GƁ2g(S�x~A�t��
15�3��e�����.�����xp+r�\�m��f`��T�}!E��~�j���zS��)=D=]_F��.�%%
ֺ1 �+�04�JdK}"�=`z߃a���	�)��o��ޏҟ������R�F7΢Z��^~�5���W�z�t!_�Y��K,V��y�x��$L�
Q�;�r�t�?��њ��`-M��Y?ۓ
v�a��7��@D'�7];���̡%��Ϯo���VxCS��K������N�mK�x�.C�b�P�3���7�G�%��6��
hM���|���c
GX�Ot~0��c8�y�2Sr΄'f26�|f��;����V���zm���OZJWS7Y��]	�Y��(�d�Wi+�'����*�N��)����D\�;�N܄�!�gWy��:��%���R7U�k�5�-'��~"X|Ac�]��f[7W�f{)�I�B�z�Qp2��S���(PBz�AF�{ �!�pc:�_&I����W�F�35fe~�#�bԗ�F�|̠���/�B%��3H�ŏ\P�����@g�Xռus>����D���g�~�[�ԺMt�O�J�}!�{.Yï&���=G�kv�TG��%��L9"�����#m1Q�F �\9d
�+_'j5E���+h�eE������I��L:\�w��B!E���h�;������4�
$b����*����Hdp����0���]IC�魋6�5׊\�}�'b1$�Ep���"����;�w]�s�wt� wޫ.�N�Zs]�0�E`���ZƎ��T4�O���5�n�^^��Oڑ�Z{P����P7��'�s�yr�y_y��0�̯1}�K��Ṝ`�c�c�g[fH��a�ָ86f&i��V�Iy"�G���KTjm8�ŶF��eM��Ų��'$���wʖE�
����H3�
�x�a��&�K[fa�	�E�Ռ���l�p����j�\�EuV��>�r
��
��#u��Ph)�F
��z��n>�U�k�@�
�(�|�͠���ٗ��w98RDN>z���7e���ş� �Ѹ��׼sv�\h�6WykE��[�ȦS#>M���&���~�����;>�l�	Ӈ(�bcͪ��]rr�O]�#���B�w���.�n��+�|�&��(�H\�B��m(G�4�2�vJ�N�rv��.�N�����O��k�ge��g7�Ⱥn�4H�*��R��r}�����{P��B	\�@veP���H����(�a+9�v�d���#?^���^9Q$ͲCS��A�/{���M;��=�1��Bv�'�v���l",$�٩O�iæS�tj��*zC<a�\���]�q��^r!o�{�/��,gc%I�y��8a&"a���BҼ:��y�w��bg"r&5��ċ�lM�l�T��(��-p��F�ReG���'>�"B�;��P0���]�z�Ys���`�=����$������ �Uu���պj��fNJ3�a��K��<�8��L��,%��}�6�5�w�nNP]��;9i�A{KV�}���fX]�����H���F�����"L*%��&��A�?�|�k����D+�R����	�")�B�p�h�t��Ѻ� �W����R�ݟkXB��\=P��F���m�J<<3o�2��>��W�>�ݹ��aRaLzXDB��O���B@߾���۷� ��+gQE�i�\���oj��fEF�D�����������&�Rr��HhIg�N�6k��2���ɥ�4b��[�ۦ���V!vq�^���	;�G�I���$��|�WZiQ�v;�7�m�E��BxK�5�2C�:�q5'�A�%ߧ�]�������`N^�`30�o�$ӧ'��.�H/
�����y�-q����u��F�/�e���Uy��d�V���[	��|_���a!�c���D�˥]Q��ن�iA�,٫^���gݜb=�6�D�D�Q5��YM(7DJ��dH����F����a�Iz�Jh���d g�W@�AP�m�f?�/�Rz�$�E�=4y���s��P��IG�(�[���{���*���V�m�p_�Pm�-��B"�W�>AW?���H�nr9���pwh�|��&K�v��	Ѳhc�M��s��#���z�Y�z,��pQ���7��s:&�@�P.>n)�3��4�С% ��m�B�R��v)��v{�n�͖�:���(ZQ_�f��m�s��W���A|�*��U�08��s6��R�.�@K0~�r׷�=��„:w~F��/b��@��`�]���HK��f<��z̳y��בB����x%\F.K����z�X=s�t���	���ʜcdN�0.�m��F50��I3�j�3���zz��`�9C7�Th�>�t�R�nذ�ts��>b�Y8Ю�6�k�=�?����O?����^��}6�'�z�K�BX�<b�:��I�uySM�ys������7X;��}���ݔ,�I��K���>�~�7J��>�Q�瞜M�K�{*^n���I�.u\���`���q����Ǝ3_|�z����m��7/�=}���S�</�׋�'H��0�c2��������{Ͼ K��{��D�,��=��,���g�R��F�xY��{DWś�Z�v��\0`��F˩�L^\��ְ�M��3�O�i:�&�7�y�S R�"i�t��=^uf�?��:;;���'�+�Q��-���v�E�e+[R���h,�!~�2�	�=Ɠ= ���y�_?���G�4$�-9�9g�u���b��I���6�_�_�:���@�'L�Ip���^G��$�"�����<�C�7������/���?e��=&W��ҷ)�[�:֤A{t��V�	���ƻ2ʎ��4��A'Q�Zr��'a��Ŵ���!m�kn?I^7�_$}F�}�\���$��ȸ��M\.�`�Su%�8&�o�u��$���f��C���,��E�)����iI4S;���EaP�c���p�lH�勉�;�Q�g��Nm���;�q8&å��iE}�ocϥ+�
��/˷�}k�71�R>L��I�����l9�%ܿdƮ�ZQ�l�`$����hbj���p���X����|����,B��(��a8�jE-�
V���7�-`�ñHՅmUF�c�ɳ�E\�Oe�e�({�m�)���c
F�<�\{C�8�[�}��� �n�
x�e����ʠ�Gd���Kh�k���+;�q6�aV'X��q6�M���O����%��g�ɬGI-%}����1Ye�G��M�zI{��=>��|���8�4�^�s�$8NAj�ńq7r�z��z�.{��믳w}�6�����Ͼ��ūw/�g�$����/�u]4F��˲�����{H�������K�6<*=OKNiRD�^͝G�e[�l3�_	�{SӸ�q☮'v�/�Fx�W�{��`��$�#�,�TN�>:�A�+��!�(A7qގI�6�!�x��R�5:�1x����S7��g9� ���O��r]�=��f"�f�i3��(AƳ(Aƞ���"�$��������ѯ���k���	h\w'!���І0�w'�H�h1CdCe0�=�eO1�*j
����o�EZQ4)S(��b>^�Yh$q��b�������dh�S��T�H�g�g�b��l+)œD��.����yz�?��A����tB�t�x�p��!O�J	���x�&̓
���$�O"�x�b.�C�f�P��4�1i~2�r`��H�H�*�nJ�1!�8�����#(8�%��\Vsa�ȳc(��]�(�煜���)�;����ޢ�&��� ��@XM��%�(�c���4���
Z?���
��Rբ/�6�2w��[N�CBT�ǖ��:��]19�����iA�Y.>�|���1' b]B�v(��n�\�q❺ءp3�c�o�_4��5jJ��}b�#�]�V߿y��������Wq}����us
PC�j�������ff�C�6�W��p/�qHx�kd�o�h�~6���Q��_|�a����߄��Mޟ8^�l	�	*Ų /���|<&q�n�U����J|ө�q��V��f����i>���<9�|���%����&p�Yn��՛�'�Xʎ�)H���JT��q()xQ.�9@�<>�ƣ���e�#�Yaio�O�8��DS��D��l�f�/�q�$����Y�W�#���M������p���b��4��$��N����w���9�O1mQ����s��������(�l5�v��G\��s{�@���5V�\%�ap�N@����o)%~ܬ�u������lDԪ���8P�<��`�b��0��uP�ؘ��'V�
z�]����R&S>��"Y��	2�pU@2�]�2T<�L����
{�Am
Chn`�g-Ѭ�rX���@�GE4���D{��z�,�~,u0�����,���YH��ʑ{*�cAJՍɒ�����o���X�\�@�O�����y��ߋu1krW�%{�.�'ak&E[��᢯��"]�Fc��1p��_]���^�8e��oa7�y��f��i��\V%��|��T��r>b��mO2-��
?��y6�H��9%ߠ�]�ŧ��7�{P�1i,���G�z�*�:Y�H'���ݱX0d*|j�#�t��Jɒ���*T��+M��4�)}����	@��!�B�AD�� �r� ūD�ˆ�n0�Y�G�%��+$U�J���5qI3LI�䈜�d�ǥ����jv�A�T�a��'���;���ZM��ho_��?�&�m���Iݨc��'�y�<2L/��\�0����+��be���Z@�!���'^�wck�i�c�z�u��P�{�m�ݓV�yc�-t?
��.�o��k#�\P'��ͤκbYq��s?Z�=�{y��k��L 	7^��qˆ���\ɉO�r���0ļ�Jk���qȾ�ͨF��Jՙ�V~�:��n�Q4XU�$�4i���)^�O"��em=Nf��@i���#�Â7������qj�M�R4��fŸœ�.�L��0"��ۃF��bK�c�b����0nQ���4j��7�a�n�l͂��x��`p��n���Y�NBr������a����Ԣ��*��R`���d�G��CcJ�Ԥd��{�漐\/�ZR�PKEePQa$�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���+�PKEePQBiKl� pip/_vendor/progress/__init__.py�W[o�H~�W5�)u�J}Y5�R��h�nUm%D`l�;3���g��1�i����3�~��p��1�X
��!���|�4g��������c��i��h:���G�L;�{�V�s�g rXsb@��X�	��(K �\0�����|.6#0�2�PO�fE�	l�XR�|-`N�Ē0��2A
�?҄$�/��@�?T7�d��1Q(�����(HĀf������TX��߽	�������ž������W`:׊ɜ׃k�OM��s:��L'�-U}��	x֭顄�B�n��Og׶s�����F���ޠ�;�O�`~��v�M���������O���_�-����7���L�����6�:�Y�@
�J�]Ƿ���6�k�μ�nxJ��)�����Uc�g�@�p�w0u}�6�|M��)�1�o����y�kӑ��u$?<Sz�X�S��rƖu�z�8�+L��Mw�Ir�R��X�N�x��D�`y��;S�9,�H��,_A��b�H]9ػ�T���9�	<�b��+�8OS��� ��Iy�D��"��|OH*��xa�WG1�iI�F	aLl������U���g4��6&�[�-�rvBD�G�%�ia��-�ĸ�`p9z?д	6|8�y>��߷����}:�����d�BZ�F����iF��1=���������
͒|�����3��]��9�`��Bƒ�U���?B!v(0̸$.�x�8BHEV�̱�ҥ0�9I�P�sTy5p~��h�+?�g�4Bkd��.�\DL���I�E}x�=.�C���B�E)~���S�m�yU�����)ɮJ�&�{�$� ȏQ*�x�5Zq�w�^DB�*Q��P������(�*�29��^��K���,sYƮ5o����Q3��:��%����Ucm����}�\C��5_��vw-p�1�M�a�Z!a8H(K����A'dF{2p�h��$��r�އx��]�I���D�T�d�΅7�}�3��8��8<��,�e&+�V��!�y�BB�M�a�2���-b�cs�_}?=uR��DO���+S��7��9�|���m��.(.
��%e���.sA����w�Yo|��)Ņ稳k��"�G�OCx�z���T��9���-Z����G���,q�[W�u�^��3u��18=���
����_4�e'5(�0��(�{�+<)Q�n��rK/@�e������g���ʺ����$����}��0�~w����#O���Zy��k�C����H��8��iH�C��KF��˫���ƱD�#ܠHw�h�p	�};HVm\
�^�Z?^C֧�]Ql����m�W�|�~�{��l�B�qQv��	l�AL%��j&��Ȫ���㕀5�ҁ�mkw�e;���o�U���򪋇�b|��C���
���YP��ֿ���Z�kU�255�]��z��U���)�̗��}u���$䧋��=�FV��-�Oi}�&!����WL��˧=vE�3��=��.R����K��o�Ԟt���)�5���i)7�b����-ꁓ��8�����m�P��$��1n>R{�M^U�.��j�#�T���� ���PKEePQ�̵��&pip/_vendor/progress/bar.py�U�o�D��xڪJR9�[.h+��I-9v���V�*r�q2�_����A ���9��/�͌$!@A"R�23��7o�{9��Q�O��#(��i�`��kF��:�.�?<�1M�2���	��+���e�Ѱ�H�ǭO	�h��$�<�"#
I�
D*@��>�4��,r�
ɲ$ȯ=F H:��'-X�d�i���6)rD�#�kX2/Ή�@ʒ+�����.�+�D��6q��DԴ�Z�)���0�HJ����{��c��'����Զ��6������C���3ˆ��U�8� �VMW��z��g`kc�F�� �k�́1��X�����1H�k����z���T鮩9N)��@;�L�3N���TCWO

F��L����6�UCAѶ6pd��!b`��������Ds���K~�3�u,�j�ݜ���;�lk��p�0s4��*c�P�� NCy6W��\��-��c`�V�
S�X3�Z�ߵlt�9%@��Ӛ�2I� ES��"�<�Dh�lL�D����ZK"�σ"/�ρFi�r(b�]C�!�	�¬�*�uV����%KF2�o-B/���c�j������>V���XfE�\�;4��M��yh����c��	�7�
�9�]��zP,f�+7��A�%�>	�H}/'���A)��$�<$�RH�q.\�R��EZݧ�ɰ5l���lՐ	�%����X�^x��C��h�nK@幑��-i�{�8�_�vB�4�����	�;�J���4��p����q(I��n�#�/�ʤ1,�0���ݺ�+�-ql�b¿�6'ۂ�y�?<�[4�jfo����]4w�n۵�n���gw��lH+e��y����-�{�u���O��D�/��
x������'�g����t��4no�@��2�!u��)P�䗥�m�"aF�!����[i���4_K�4/���Лq�Yv����i��&��ۆ2(Dy�7��=��.	�$�[�Se�I(�6�p�(]Qޠ˹�����rAը�j�j�H��J⤬�>g��g��\2�Z{-
ư�v<���%&s��E����|�A�9V�K���q��s`�A��׃jg����5�7D��vg�e��8wo>���si���Kaޖ�i~��v�Yy��>q��^����i�?PKEePQxแ�\pip/_vendor/progress/counter.py�T�n�8��)�!v�MOE��ȴM@�\RNQ,�bQ6[H*���@E���Iv(�q���:�9�m�N��R�Z=�ƕ'O�NA���Vk�e?:}c��J[8�X�/��gW��/�m�6��޾��<�f��U����2D��&�-Z��yU@��3�q�Ŭ.�un$��`�
�ԍ���p��pףn�R2��ȋX��r��6�J�@��ᇄ�B_IZ�NSi���
кև��R]�܀� �l<SI;h��&D:�^N�	���
���@�a�D��$�0d"�	�
 q��$�(��e�tL82R$��A:��%�Ǧ���Ɂ�%��G� g,f���|IJ�
1@	HR��4�@L�̝\gbF�b
���I^��ш�8�МFY�
�7dDi"��9�aɔ�}�RwK?Մd"EW���y��F<�B�
悢Ɉ'�a`"�b<�S���2�&��3N|���c6�ID=5m���c�\�!΄�L�YwHi+�*	�4ۃ�g�I���!LI�;��E��4z�Eٸ���Զ��AS)�5r�QN�|c����̪RUX
af��Hk� Xnrk�^5�c5�}K�i����.r'{Vn�ݮ�rpm��8�V�*��}�B_W���O��׸��;���������Jϡw�!����t�w���C;�t�?�X��ld�%�v��-
�[U���'p��u��]jx����ҿ���ϔ��w���>�s|�������PKEePQ/�ݺ
dpip/_vendor/progress/spinner.py��͎�6��z��
���fMQ�L�d�!�	�$04e�E��f2@�!h�E�E�Ȧ?@Ӵ�'�%e�L�i���{�{H�Gp��	�L��}h���[	�#Mue�z��w���.L��kSٍ�]÷���m����l���<Wv��Z�m�ؤ��[�i�A�����Q�lV���L���X,�BN����
.u�\uj�r�e��mZ6*@eͅ�T����AAzn.�Vק)M�W��]������R�]BZΩU=�ǒS
"�G�S`�<9c#:�;D��x��BN#&ˆ��E�.Nbɨ@�#&���pt$hB�
:�ň��c�yİɍ�1"f��S\ �,b�o>f2�Bq����an�:�1rQ'I$~bNCF���4�$��&��H�����[�Sw�)�"���&�tg�dQ"\lX�-�$Ό����}�q���.P(Y�zl,9q)b:�؄�!u���˄c�B�
 �	�3Y��EJL;��xw��g�/aF<w��1�ܚ-,�y۴V-�����
����Z�Q6-�nx�fe�K�
�`U�u
��e���a�?|�MZ��q�7��ӧn��
_���d��r��?� m�P����*Ku\�"�ݣ��-
u������5î]���/^Z�g��g���s�����Oz��|�{'�u�k��5ffL�����U'?u�'��g�y�w�x��_�|�d��u�������uםv������򏗷��λ��_PKEePQ�?��q pip/_vendor/requests/__init__.py�Wmo�F��_1U>�*�%�w�ȥN\�����\K�P\vwiWW�~�=�B��e�������̳�/���#*T)��Z{w�$�"�s�8��	���sʏ��ǔ�-=������j>�:��8IF�Qr%~o������|��r���$�9�K�����HD2z��ZQ����ƮT�ѝҴj�`]�cX�ndA?]�Pk�R̓�����\7J[�q���鬧����xemc�����0���I/���59 �8;9���`�������װ�*^/[4v�kV��X'w�[�$�1�3?\�lmn��R����,l�El�g�{^�b:����9�7t�Qf�{.�w�ح@G�-?���*-k�jf���L�����2��Ѽ���La�eÅY�0��lG��$�Y	Rv%t8��%0ԂL۸�%��~���ћ���TE���JU'}K/;�{-x�M�l�T�,I�j6Z.WvNi1�YN�N�
�S�5l�+!�Y2�d!j#���l����[������ksKa���.��;���Ȇ�.�ð����b�54%�����w�g�B4�S��w��h�G���6�$IR�;��D�BYI�I�
�Y�)n�&sJ{l�=
3
�c���1b�b/��}��~����"���tLȗzl�H���Q{?��2��V�	�&�eT]m����N���ol�U�Q%�}g'tvF�y��\��1���h�ka��;�8�nk���!�����1`N[�~�sz��t���KC�2�»[��gm�:?�)�M�4������xU����)u��dh��b��o�� d>�O?�? �̂#��̀^��� �\݅%�`�)��қƺ�ެ6��c/m`�`�ig��;�d�fy�T��J�x���� ��I!��ŕ����mu�tqpӗ�	qs��w�������SL���ϯ�����5�R�z�٘�V��a��w1̽��+{��Mܴ�1@���c��
��gj!�;�򼯇C�$� ��|�������iԥ�G�Y���J���A�=o�c����9ߌ:t����uϣ�
3�[E��Jt�f�Q���྾|��
1:-���%�覸���� ^����=k�	����;8�t�,���
��RKL|��hm� s��n�"fo%:�l�&�?��&�k�~m۠��B׼b�u�=�O�o�]���˯Z��Ar��x�|��#(�N����p���q
�@oX;mY��\�T�H��b������޾��q0���.1ي��+��<7�j��Li6
���~=��7QX��ʣx�l8��g���޵c�#n<vw���N��/W��)D4�$۔x�D��J�(�d��(R��=��z�v�G����T�NV��t,�hcC��D���0+m%\���R�BK� �����=�i�ʪ����w���(q�~^[?���qQ��]2��0��U�#�qO��'e�\L�EF1D�Qƥ(���ޥ1si��
�(����G�w�",ԩp~Q���3~gt^:�흲g�O��i2(��rF7�����_W�ݪ�g���(�3�7W��������k�O�mh^�
�gXq�u����q,�G���5Z�%�V�U�+�+�
W;�~�$�ڥ�w���Ѷ[vW�(��4ŵK\���$�k���Ȅ<���2a�,#_:�I'��=�-J?j��s�=�oq	��p}8sW�I�_PKEePQ���#pip/_vendor/requests/__version__.pye�OK1��)z��Mc,TA�R�R��
�1;mBw�5�J?�I�Z���̼�1�L���"���V8��$z��K}����5$���ji�E�ε��&��c�#��}�$�z���5e��e
,V�%l��E��4���Q!��a:=�EvVz�mf������e����&�f��K��)������
u�!�%B��|��e�Z��`�%���(�B�%U�q��V��|9��gp)Ů��d�����1v���3(�~PKEePQ��9�H'pip/_vendor/requests/_internal_utils.pyeR�n�0��+���dH|�i0�ðuC��;��M��lɣ�����GI��f:���H��wpx��5�>��=|��6��"�г/*c��
lz���9Jݓ{6
z�φ'h���8�;͠	���a��~�����ԙ��G�
8�„
��S��$��<l}���;��w�aՒ��!0��H>���=�����3�A~�R
������3�Qa�?{@�e��Ҿ6�jW*�#u�
ڂ��w��5��ISӣ��w1�8�Ƞ��H�Ѳ��"�%yfc劐�Y��f�����|9uH�h,�RV�T�Cg���Z{�������b׋�R�N�c�L�������m���$�����������9QE�ϡˬ"̓�e�݊|K�_^�u^�f�#r�4Xq��ۆ�ܳ��Qj0c�3~5���ɾ�Ef
�N��%��h9J`�)����D�$��|��`�0�i�ĝl�5<J�c���h~	G�7f���{5l� -vV�i:��/�/+�f	(���Ƒ�gn�6e�9*/S�h�L�PKEePQ�9.D�,T pip/_vendor/requests/adapters.py�<ks�8��+p�Is27�|�-�(U��q�c�lg�j�)!k���aE35�ۯ�� @���d�j�NU�%h4�ݍ&���w'l�'2����Z��	�GGG�B��eUF<�J��ڟ��n%K�Γ:'���JV��
��������y�n4TV�.�,K������!ebQ�<+#�e �+/�
�V�g�/D5,�|�6rŏ"K�"��4���M��k��{Q0=�-\z�.Mئ�?�b�Ô~8���d�0@~��{{���Ϫ+��^�b�"��;�y
�+��[^/>��Y;��O�bC$6�Ҽ	��(��IS�4�O���I���z
�7�m����̊ۓg�EjPo~>H�/���7�'_J����o��i�+����|���_xZ��jz�D����E��77<�Ԅ�9X����*X ���?������N�W�^_��oO�~�0�	LԢ����Hb4+�d��{Q�"SVRي�,������b%�"��8"I? ^W+kp&�
0����V�1&�4�ہ�Ջ�d�
v|��JY�G�Z.*K��A6�����pͫcF-E���z�
��JPx��i�a�����쑧2�E�q��F����P��A�<H8��dA.��l��8%`��N���]I��g�%l��(b��O�Pp�y�ѣ�xq���w[�6��
\��?:z#�d��0��!������W��ƃ����ח�.�6��y
J�޹���9�x��^�9���8���ϼ���ś��wwp�*7<,R^���ةrܣ|���	��w���>��>^%Wm��2�U�@��	`;�Y��~9��q�<!��]��g��	��8��	{�\�fwE-ZR����$�_b��-,W��
�-"ѱ
S�P����&sc`ALa_T�I5%�N?���к��#��3�l�T���QN:��1��J@�U`��R�צh,H�˃�S�eiK�-�	+E�W�xMx�a)ؽ|D����	g�4�(t.lZ����H�tfy�9�|b���[	��M*�=T��h�@��24��S%�F�%Q�(G�l� �ܮ�b�(�Rѭ��l5y�BC�Pn�3����K.%�6�w��R`�u
��B��6��g�l^g	������p)o[���' ُ��f#4ǠVIG&�Bx0Qt�u�Hr
�KDp�I�#n��E-kw�W`7Sp� ��v�F�t�M�8C�@��1�+7b��
�u���gS{�ߨ�k�V'�.ml��
﷊�(�"OOka�b����L“��,��r���x�*�?nq���)|W{@�Bw�l�P�(S{��4%xuY�X_�j1n�آ[��AMS0@��>Z� ߥ޵�М�IД���&�KC*'��)j�<^ԁ��J��P��\�k��Y"������t̎1"i�ӷ�਒v�Vy�&�W f�� V�f��(�85ϔ,�L����n�|�����I
4y�q�37a��V���h|����]��B[C܉D+�2@{�C]�uJ!���i�WLe�
�^�X�]^3�]�=H[���B�?*���T;!1���u�
�o\u��L�������Fސ$�baQ�@f`�xҕ�y
ԝ6�Oa�ʙa�$=�	�]	Q�tj�˗/
���ΝB#[
��J3��L�#r
�#���ݩ%d<uV�����L��!�ϱ�H�7�A�2�a��C�Ζ���m�l.j��j=�H5���M:?k��������Z!j0�r։�!�.\6���7yT�2z6��D�c;2Sq���;0�.�@4M�f��C��Lъ�BgG��Bg�#�})4C�Ό�?C#���&�P ̜Bܨ���[c�Tw���	9tY�K��E��T�)��E�0~�P�3&���ч�}��]��´~9�C�
+������	���c�PE��:�܍�5�j%�G9K�z�@@]gD�����ĕ7r�a�܍��d�W��CH��0C�-Go��m��җ�%���\Nҷ�@%(mYt�%���y˶Įc`0�'�\l�, !����eB���䆪T�+O��B�ADk�y�F�a<V�!�R����"�
J!�8�T�ɛꀱ��u����^W��c7���X��-B=��^�
"Zd�B�q�R��_U�B1w�αb��n��5F�tZ� F�2��BN3�jG0\��M�`�)�*��b��S���>�R`�C�ٵ:3WvG��^�B3;PK[�J�S�JU�iiX�����l&"��4��4S�j�t�s��q/Ab��@OiS���T>AT�t�v��r$u������Ta༒js�:S�c�*%�`X���|O�>8������,�r+��hH�a�
�d|�EE`!Qi֭�tA�����nm��mJ:�
f3�bw�Fyf�t�4&��mwf�p�;;��8_ѽ��s5I�����1���\�V�y��5��wڸh�8%=QT�*�:�u�����/tlU�v=�";卖e�ߊ��AJ��2�BR�͌*i��;�@(X
����3��O�n�u���p
�]��Ӡ�Z�qM����/�=so����m8�%i`�a�>؎���ZE�c�iG͜U5�Pp��w~�h��|�w�.��m7��$A�G���>߼�����*�R�ARjYaN��wY�$aŽ:P�ϑTǧ$SS�a�"P�5��Z�B���&(z���
��������a�fӲLd�o�
:�q�z�7���ScX&4�;�g;W�W���3�ϬT�|"�,�N˳� 긝�T�u�2z��}�������l-�Y���e���x���
t���S���J|������ۗ����f;'3ģ�$6myM��Wn���������q���ˏ�1SLa''�QuT��ф!^��7	GBM	OnH0y�:欄>��$�Pn�x�hwJ�:��0 ��-���p+������qE}FQǐF��R�.c�
��v��s�B��u�vo���Q�oO�P�ꊲ��� ��80
:�M�V`�&9	4u�Z���/���eoE�L�Z`sK�f�Q�qN��t�Un�������z��q�������e��X80B��(ȓѐ����ҿ0�l�	���2�6G���:�P#]C2}�5A�:�!U	��*�j����&º{�I#T��I����b"�y�b�ۡL�%0~
s��Il��M�d�f�*@_׳T�R~P�̩=m?)�8T�Q&_���x���4̴�_M&�b��P��f^�������8U�F��n`�+eK�qwn��ʶ��*):N��U^V���::zi+\��+|I�.0�dk�b� ���~����[K+S�����&�Ղ��5ʐ-鱎�65#���|�k�
��� ��[|��X}4��>|�8,K�{��tĽ}.Џ~����7w��%�z�J³��g���
Գ�(DV�;݀CK{�b
��Y�&-�[/m�Y�2� �hܠp;r�p-�K
��¡���W�#u��>AU�f��L�"q���(�G��9=2S��K�Q��\�#��y��.(NbkQbO*VӃ
w���_���v5m\��d3W�,8O4v���k+�Awk���<bG�y�3l��b�B�
Z�W�Ƌ8�ͽ�o�k��i˷(�Pb��|E*�)��Sk0ˮ�����݊�߽X�P�ɱ:�q�n;Ψ��$F�7q����
��f����9�ILl�U��v�~ww�U�[�i������B5���'�E�s��I�;�O&�{���@�@�m
O��lM����t��E�����;%�"z�,7v#ZH������[����S�T���vX�DCe�O�����/T�3���Cÿ@�k�~p���fHH�\�hv���i��?xs�r��Q�fѦ]�F�2h@�0�K�Y�b��C�ZLF��r�� �V�=��a�H����,*���3��[���Qy�gU
�@�cp��&����:?�k|-y�aYt�i^)c��P�2 dxP��*�����w�暙�)Ջ�R�xr
P�B�L':C<�m=]6�?X��`ߵ��o�4�?���5O�����4�6�Fy[���_s`�A���FV�n\X����U����W�^�����n51�����n�u>T�������
�i���v�])7bm�@����Fӌt�Kc�e�Ū����>��w�'t�O�@�ᙲ2'�"��VC�h3���{��?R�Vu��|#�p�|��!t���0�}y�1A3���s-.{�?�ʟ��NK�Ql����	6���\��Yߑ4��/�F�-=�F��c�#3�iL,fBYH����-�6���*p�g�H=�@Rhh6���޻j��$�[���
�d���bz?��ʴ`�t;2�u�Y��
?�S��H�Ig�6"xum�*^x�i�k�]x0Dy/��Ѡ!�c����)X�`c�Pupu�H�dT����薹�i���a�>��8(��[+@8V���He�C.Xm�Ě�vW$0��Agl�ocwll|�ђY��.���tW�6u�7=:D<C�^q
}����ͩ=u�p<�=~0�T��<�����8}�U�FО��4��c��)]�P=@����4J�x���u:ݜ�vMk�|���������m}�c���cH�œ��F��IsX���Y��x�v›��'TX��˥ Y8�͊e/$��v[�z������C�;�k����#�^�#�2��Nb���������Cu���t��2��
�Q�q��~�F�E�S��&"�t��;�w�'�?����R\
��π y[�J���<ð}�e��5�o,H�(�W�P��r�KX�yR!�EU��w��Y���İ�R�h�y/�2��G��)�-�P��zFq�������@���Y��~%���@����S�$�	�5�Y�l
D��z�<�[}����מ�8�,�9�
{/
�m-lh��+9�b�]����`����0�u�%��G/^P
7��H
G������z�_oU�K`;|���adI<q^8���}
s ���//Ri��IJ/�;��

�j�S;�uB�|�Z�J3e��Z[^Q�l�
PKEePQ��ip`pip/_vendor/requests/api.py�X�S�F~�_��<�f���>t4�n!e�����Dgim_�t��	��{w�N2�ʹ4?�B��n�o�簽�
�Je������o�N���ٳ��_+4�E);^�t:ӥ4����d^f�ca
�%›��Ϗ��N��r��bi#�%}�y������%-����e2��`��H��3�'�����J�;���23C�3�*�!#P��c�*L��Iq~/'7*@��lm]��^�~�����au�bQ�d�H�
�$�Dq8�{1��F��"o=
�(G���M1��/�P��4�tqv>=>;��?�����l�_��Ӄ#�$q|8>O�1����N�ś�Ǡhmt߆R�����2q�z=�LR�lEL0[[��ʅ�Y�,�W��@A%Q5Pn�h�O���>�]�2��L^b����V��t�,<�����}x=9;%cZ�L�3����.���%���b�&���s8��7+I9��D�K���s�ܳ�B�<��Ls��C��B�؍6�l{G&�i������q�Y^eV�+X���\�tؐǛ}d3̐Rv�ߢ�.�pN�	!�s�|}�tUX*e���.m�(K��o>j���X��\;�%j6P/�vK����O��)�1Yp���xC-�����w�+��ɬ���q<Ԅ�!��4���Z��o�=m�}�� *�l�J�q�N�W��dt($�с�ͫ[���QU�e�H� $ЩK����AE�y���0ב�3�sǠy
@p��$&;�|F�Q�#ۅ�a@�Cl�Z�ۇ�������#����y���,S�wS�9Z'}�T�����m�J��G�bzĈ�ˆ��ȵ��o#nP%kC8Ĺ�,rъ㩮���-3r�jZ�vW�Y�����2���&�;O�%[X��%��|�29���L��~�Et��ɒr��`ᥪUf8m��K
=��F
]ӓ	$����DXT�̺�EN��v�6K)�0��ԫ�2xo|�Y���uVɕ�;��"�x5��F�M^�d�1��D
!�֐�U���v}���4?	�S��0$�d˼��ްļ?��9LY��u�)ժ�%��}�.u��V����/뫽z�X^4sc��LF,0�:!�{{{��Vo���n���R=�u)����D���d1Tz1Z���&�_
^�i�ŋ�����Cy��Dl]f����!1�;^HTGLE_^hn�䂝d�`�|V$Q�ĕ�)��]�1*�D�*q#=h&^8�8U���dR�Qym�eJ�W��:7�B.hܤqx�N.y���0�7���Yx8��>W�p7jT�)���#���y�==��B�s��{�
�5ck��$L�D_Mj{��ߎ�o�ކ�Fp �^U�FD� �Ù�[q��'XK��РM}��uo�|J!.[>[���<
oK�V�s�~rӻ����������Bڽ����#�C��0����&��oD�����<(\ɔk��t@
�뭾_BOl�RU�\r�#D".UQ��,��*�t�S��7�!�霡��TJ+��>\eyP��x�o�|á��&�`���B���
j�;�S��}���"��J0�]z�%a��GɄ_<��s
K�RI1C��Ob��W���s���PKEePQ���+s�'pip/_vendor/requests/auth.py��o�6�w�<���Vk�"�1dMv-ڦE��z�m�6YTI*N6��>>$J���Cwސ��~��>����b~L*=>�7�^���I��bJ��Vz�g��.\���V9�BS^(�� 0+4�P�EA���L*2�\x��~�/K!5�?I�4_���9�K�(
�_��,��fR,ɘ*��1q�㧏Y
2��NIJ��/W2/�Tl@���H�C�+Δg7Z҉���L���6�f��yVi��8S�-�Y֢܂12dS����ދw�g����ߟe���x��z���ŻӳS2"-��y�f�Z��`����N�6�����|��?��D�e�k\����RM�^�7e3���$C?��q�P�%���J���&�=��ӕ�S�3"�@"V�Ը�H�8�kC�RV�|>y��\B��-J"f����v���*��@ȍق^sQI_��rL�@n�H���P��f��ل��d��h��A�� #2�:�;X�ɛ�*j߸�� i��(�:�ZB�c�C�L� �����c�s}��1�AxQ��+FI��dЊ�9-�5(�~H�?��g��
�K�b�g4��܁�
)>�k�sQ-�T�B�\s&QU��V���ߦee$�sR`�_3�����6��VT�53c)ſ�E����:���F�j�ɑ$$X0*ɬ�8c�M��vi�R�s�Ti?�p���S2hAB������Sqb��o�f
`R?y*�1a&$�-��	����zGߖ���?�#O����ro8$g�L�Es�Z�ncV��a���cj�k� Xq%��5qЦ�������X�me�ȣ�N҄P���qt�_/�M�;IRD-ck�L�*�yB��`�90g�uyS�6ae`La�����
��8
�3� -��Ww�b�	�dY�X>��D�r ~.�+O�MϤ2�LsY@��RX�	��\)�͉������^�F���*��V0�@$cp�A�:�\�Ex�u���V�I7DT`C����ך�[�s^��S+�:�Gd�A�+�€D~-��n�숵���<z��9	E/�.ѱ�"21 ���ԎL꓉!�oƋ�g�aw�i�b��-��#[1�^��[S��X|C`�{��}�5��Q�O�d�W"Y��L�{�5c%Tg�5��J&�v_�l+B�y�bfA22jv"�y�n���p2�z�AkR�9�ʠq��ߠ-�'���ըn����I�u� /�X�۬G�`�̥��.P��F&hL�.p	{��@��'c���X
pXkvJP-���&�j��I��S�ua�}��%����
�������X�s�
���͗8�lV�Sd��5���V |���V��tHԤ8�a��zq�X��EI!{waZ�
7��=kY߅p#�>���5�ޞ>i"���.�9�y��9���xJaϪT�ú�e(�˳�rHAj�fܗ����!?'�믇�>|���b�-�O�a�N�:�<y�$��
�{S���'�������RR`|���X��6F�5/g`�u�?�<٠�Z��"0?���^�]:��<ݬ',|WU��7(�ݩ�ã���w����^ڦ���C4[
���q�����O����U�����]��Ǐ�iA��!�L7(4(�mkefNq��'�1����17��R��+��I�p��� GO��ՂO`Q�S#
�زt�T�R�LS�jZ��^~򶭽Ay��nXې�9N��+��1t{H5�q�zrT�d߮�{ଗ�O�ד�$X;j������v׌A;��p���vP
r1���i�у�g7h����9���
�lMH�ZȻA�>���x1��J�b*��?ŭz�Z)�����$t��o70ڡ����tcC����{U�~}jIe�Q��K� ����8�Mf�pO�����2�0V
�s�!86�{���[+�N8^���f$k�$;t�;�={d·�����b�k�a���VW�p\�k
�D��N�:g�D`�?5�fx�5j�?F`ɾ+=�ٰr�PW�SD��5p�&���wT4gw�To�V�	�mI#)VՁ[��دg�$j��J�&$d;�V*ֺ5	�eH�k�>��x2z�|D6��j�L�D��e-R6�6�2ɦ\���')��!���U{_w�Ӥ�]4��I�$�dT�AI�rU3�]�;���5yau����%�b*8^�!H���-���h適\�A��-�6���pD6oj�ȫY��,��o`›
�l������֥:�ߟC�Uc��/�l�s��cj��<
-k(��#02�T*�$&�ɓ����!Bs�p�r��\���[����"��{�[<�r.ffy,���p�7�*����(^]:z�<�r���H/U�]m�� F�d�A 5'�v��7�]=�FQ��E6|L3�d�\�p;mBl�՟���޷9�Q�SxW�3so6���
��,�s5��W=wq����Y���;eZ�q��S��qa����a���^@����o����7s�&���	
(

x��9	�el�=n�rt�pB�u����l�&(%+��}�LDyہ���QS�rА0�t��'�?T2�Ӧ�1�Y����n���pc(�{���#�'���7R�4#_Pg;(��9�mJ������Ȱ�m�1��s��^��5jǵ��8<�6'�A�o����:i���pz
]���&u�K� ��*�m�t���V���ղ�g�݌n=:��~j�灶�f�JMN4��q���v�W��{����}I�&ޕ���6�k��u�'U��,����jz��R�ޔ���v�:d�}�u���Q��2p)�c�"�k�~��s�� ����)8r[�f�I��OUɷ�ϝ��v}�/PKEePQ����.�pip/_vendor/requests/certs.pyU��N�0D{�pw��\���@THT�����ˊd�6��|!_B�[�G�񼽼ؗ��#˞�
���(�����YN�(9�n&Ř�je�^����4'�o�yn8�����\TrC������J�q�)��.�E|K�R'����=GL{��͏Ŋ��/�D�1C,p��,���݂�S�E�
�G���)+K�(���ɘ��x�(I�Ρ�ԍ�͟�,|��O�7W�q!��NG�v0KC?/��!g���ʾ����w}�|�5��ב�8���s,֮o
��%o�
W�PKEePQ�f�t��pip/_vendor/requests/compat.py�TKk1��W�!v��b_�!�J�BZr(e�wgm%���d/��i�n��E��Ό��㓎a�j�.�ڬ �j�&Z;::b�:�B���b��V8��2H�-W�Dbg��и����� ��H�F����S�Z�ȇ��2Kg���a��U�mp�m���Vw�c���"���F6�j�#���6c��it�HrB�\�Jp��=�e��^r=��������q���	��8��=��O���KЁҦ�%�8
�I���<8�X��}��Y�l,�3��w-�E.#�����w��A��>>h<L�潵���.%e�9�������s�ń��R�Ǒ�8]a��p�e�	|Q�(�@�@�%�ߦ��&��ze��(ܞ��
�1�X<&�&X)���]�i� �VH����zc�Y�*�6�
zc��@7�EC��k���Z��^X�v4����>���p�����)���F�g�[I*��|�sՋ.T�ͷޛ\
�و�ַ	<8�%S���+��+o�t��~��f�
\ҵ�X�������tW��
Q-%��_�\�q)�ZR��:��ࣥ�G�0�����^��t��m��'�z��5��Y���Ơ�=vhE��ڤ(�)u̠���C$+n������\>!g��c�x�Gd>̕�}ٟ��������1�>o��/�VFl���s����rL�C�����f�K�=�����	I�fs�g��)�PKEePQ�':��Gpip/_vendor/requests/cookies.py�\m��Ƒ��_�7����N�/w
�;�I�{�ڋ�lc3�8d��;�t��緧^���4��"`=�����^��n���zy%�����R���������b���z�;�m�PI=���3�}��yW�Vu���]+n��ok��k)6<��n�����j#Uw/�3?[�U��nߪN�;��ĽTr!4Q.r%�Ǜ^�wƿ`����U;��l�\�fD4[WM'U���pJX����Zw
�bzĪps��W�>WZҷ�1�_�𧆿}��x��Hk֩�r&�cg�W2G����B�;�A�VE�~�;�]w��`�lVԹ�0k�����d�͙��{�����I����F�]U`+0l}�ak������*?�a>\U�D����oU)NR�JA��H$wy�o��طuU��-D��l!J	vU#��^v��8ӵ��-����F50�$�e�˫F��Y�yS�opԪj[���,4�h�ڦ>f�{]��4�}��
5��U@��an��yy�́k-+�Vvkx�6���DR�+��q�N���v����8�mOD��-��QrX�c^�
���U�`��MgV�M�Aݫn�NA-��a�����Z��m��>?�7wǽ���RC-��L���k����,$ѫ��Gܷ���#��mdW�EL�w|
,��Gdܜ�xp��}!�u�$X�HUd�Ż�߈��|��y�$�0=��
��(�{���;��]��	�L�U�`a�_�*���J���P���G�V6�RXw����Ƕ
��模x`ׇ.3��=��f!d�f�P�I��_yJ�����
%��`W	<L��q��HP<���������?T���'؇:.�Hݩ|�O��n��o���*
'��Z�����ژ���&��� |��v y�p�����5��|J����۶��rJy�h���Мb��2��A�1��9�����2���V�W�@gL�g�-�tQ�o��M��|d)��}��'�`��m����{���^p|s�\߷}]�)K�V!���Q����e~1�q�S(nท#���=�������S�`đ�;:r��Q�5T�)���t��O�!$v˧!�}���|}}���p�J�`W�殅_'eYv�ϻ�_��Y�&�_jA��Y/�t�R��F� M5�8��sH��!Dw�t�7��&�:U��Bf�� 2��gI��R\�	y���W�۶׈��Ѡ;0\�@�=��*��Y�rn�a�<h4,zS?�$"?v*/,��kyr��?��n�F����3�o�q`Rt`�����X�	�-R�,P���ڵ�4)��.h�h����cx�K�:�[�d�-�������S�����Fs��Mٸ�h�����7x{	޺�lE`�{��PWlpD��Ⅹ��f�=@�An��S84��ԾGH�[v@vi��n��p����u�ڈI
����HQ�z��7�-{�� �
��>���d�S!b�&�����#N����/q\4�:'Zd
e�t����U6J��z+%w-RC�FkN�'	���p�u�!؁E��w�瞷G3�(#Z����]�I����o�E-�w���ߥ�<�DD�PQ?���3N4i�H�o`t&�%��+Zf�n�L��� ^2.my�՛�@�P�O�C�G�衧�?���e���6e�FY��!�X��l_�dq����$j�f<�C�ǯ�殮
�Ԥo�KM��+�5�D��C��0��
Uu�r�!����uf�qQD��)Tui�͗�)꾔vǜ�s��Q���,��S��06
�D���<��b ���B>����/22�.ee����2
��؅��w@�ItS��ۈF�Һ�I"7"ʺIGAF�A� �vg�<�@�2ɤ�v�l�2��sc��Ku��@�
Ҁ��+]X�d��
(��aŌ˒���%Z|�51��!�29a�4���N��/��K�Jw&{9��Ha3���cL���Ǫ$}�]B���f�k~�e�eE�l���M�D����e����]SW�<��5�g��±B—}U<�E��9�
xX5X�^��@Ĺ:�fC�kZ�#V�K3�]#�n�O�O�	C��+�i��2j�䷧�֧�ՑsV��֏�����4��^�S��[P<r�v�Di�
N��D��g�҂t%�M"uWɶ��c��n�u��*�Pu\�/���1�|��[�[FY�B�|�p@y����zw�D�¹��™���B�
�p�m�U4ל�0�&B��ۇ�N�q�9��~�dn�#l��|>���pE 9�hR��|�2(n��vԀI/��T�!��Q1�i���B�ptZ�&��AeC��<�*/�޹NF��Fj�;_�c�.���sy��!��XK��V���%�����N�&O�V�,���	�)�
`��I�'y`(���MG��CVO�i�g�²ߍy����S;�>�����l�޿j+��g�~�o��#�?iCcv?q;��ʄ��O3ݓ�yŎ�����Ӯ�5�ʼn�}�&d�j���"�l�Ī+{+�����2����8j�yS�u.����	�j�8&|��J�g��y9O*��E�Kؾ6qzB��:��|���ܐk��6`�;T���2��+�O�
nA�ɸs0�ͬ���(g:�@ՍO
;%n�Y �f�'rc�.�cQ�8u�l[�vF���<s�k�!�E�(������чJ˰�n�j�m[Oj�/�E�"Π��~���ޱ�����e�~	�6��!��wa�����:���=���P3|?�	��u��:<o�
��=U�1�U�a1*���Bꉝwe���L8�����OGۘzE %p���VF>�>�����hzcc���|�W9��!�@� 7P?*<�*#*�;��h{ȍ�1�Ϲ�YD�K���Ik'*���'��5h4��S�bw�{n�}T)�
D�
��`�T�\�AW�0�%b��L�jX��\K#–�h���5��3u0ً�^=�9�y(]=!��!�@�n�/$b���x�z�gT��ڂ��V֎�������g3�0#�U�)5���dpL���r�#|����7�I�|6������{~�R1��E6��v��?�U��n��f�l"�]�:���痑3�|k�\Lu��盇'!���eJB�)d����	�"�'<UX�8��X�/�n��������X�b�����qA�e�5��h�ݡH]Ҋ�
��Q%��3���\��	�!�x�A�3U1;�F�	A��\����<@jL�ל�>�U�q�6I��A�m�)�6Pܷt
C���П�n�^�����K�����;��B�I�|�9j6A��#t�i8�M�Ԣ��	YN�3��$�L`�[N�O��'����\���m<�PxD��[U��.�ق~� �K�,��\�D\��Ӂ�A
���ח-^X�PZs@s�T�����<��O��{�…��!�qg{�FJ�ۧ���WK�޵}��)�{"�D��IQ�/iw��S
ұ����l���!����"����3���\k��`/)��?l�S�#���ӹTb!O08-
?�F`	;`f&��t=i���_Q�_���Lc�c��E�9&�4��ru�u���G�|������#e��IT0Y����Y�
�'%�~��?G3۷�4q$k�7P�� 	y]p�_��U�ki�p�k�u�h�RS8
_��oee$�����!%O�#g��m��'�W|��Ɨv�N�}�*��.Й��Q���v������$W�����n�P�Nf�L�\�[�dl�g�ݚ�`�0�db��mG����i����L�E�2�14���/vf$��|t���4M\�#;��n2�>W�`��F{�����+�h�?��LuU��s���
0s�ܬ��@4xG�]m#\�o�Y���0'�mp*��h�
�v~�ϼ��J�IB��^|h0��{�/��52��7�4�=XQ..(��E_�b*��f�J���a��,ů}���><"	}q�9���exLx�?5w(��O��O���‡Z�B�T'��}�� ^�"W%4`�1h(����#L��6n�9pȏ��]���L���>w���ū��7�6/�Z͊*UF���b�ϭٚ�^��B�Hbݜ�-ީkܻj�xhU�
�z).u2����=��L��%�	mT��X�^���k��	���&
ۓ�xo��QF����U^�˶���AQ*K��:�^T��~��jL���'v�K9��]ŷ�:z�[�۶��ar����Gr���g�<D�]��d��ʷ2�9S�`�]B��5�=њ��A����4��@���oyn%��T�c�d�:d	���4v_3�K.s�������������������Nfc�����v��8 YܓHFkX�s{�D�$6ϠD^ee�Z�s�vAdz"�����Ư���`o;Қ�b(�������Dt
��-A6��L|�Ht���A��
g&7��4�r�{�X��b�c�=7&b���v�i�	b֊y��1~�^�}�;�j�g<`~�¸��;&�(����?�����<3.�����"p��Й���yL�^�
j _��H_
���ڈ��.����D4%�)���aOw�9�Iy�}���i�wc\�Q��<B��i:�I���yP�_�3����+(�=��E��
�)jAJ�j��8
v�Fpv���K��`�a�N��t�S�VK(��_�e�+���D�<�J_����Gçu�<fð���$%���3�����Ì�p�,�#���i�C����.m�0��x�ͨ���:>�"MqD��
8�L8��S�8�Ux5h���;|yhu�wS��[�<2EgQ�m�m"~J��PKEePQ�_�17e"pip/_vendor/requests/exceptions.py�VMs�6��W�8K��\:��!q��g�6c��Q�����X���ۻ)��X���{��|��kȌTz}�ϯ�$���H,�۠�.��k��vɯ�_���2�)���J;��C&���vHi�ȭ��Vu�xA-�M[�j�q@	�����m>�qg�� |��$I�R8y����`0�I�~D8/�"lAh�J�Ӹ]X������%l
E)B˒
[�؀�U&��Ix���b�����a���Jص����
?u�t^�d�D��Ã�a�|ˎgI�J~s5�`V?1��0u�_�wh���ԓ˸|9�?��io�����o"8
��*�II3��!~~a�b��p�{ۣ̠'��w$�Q>q}�LS���y��iߵ�~�����n�>�`�4QhR��5ZS���,���k^�-���f�S0OO�ρh6:�1W�ƟH��_�;��Z٧��>+x�yV��f��2�+�`wC��f��8�]�]�~�N�<���} u�]=�Z�o�D����<;5�v�4,��Ï>8TƳf��]Q�r��D]�MFh�	�3'rd�~� ���P[J�*nRڭBoA
/@��(K�=q��4:�:g6���s����d���I�f���'P�gb��u4\�<PL�(ɘ��ԔF��m4!=(�OY��8"	����s#��L0]�Px_���ݔs�Z�ݽ龋�	�Oє{���Xڢ��c�;��yzQ��9:���0�w@;��騊�ER��w�e�v���[Q%B=8�x[4��no:�w�'�x:��ÀUv
c��5�|OF_��l|���U�b��!w�|��5�[1��$�-���>֪0�Z���*ܖJ��[�
��X_Hv���q��z,Q
�f�2�C~#	�7JK�*�ga{�侐.!�J�sS�nM�"�6�����[��>L��'7��VC��Ǩ*_)��Y�ك���I��s@�	r>+��F͓M���k6]�x���%Rڕ
V�RZ�-��׾�kT�A�$�T����N���M�wi��K�&��|>�kMJKV�k�Y���x�PKEePQ�=G�J�
pip/_vendor/requests/help.py�WKo�6��WL]�W�-�|�"]$��F��KQ�D�L$R%�$�"��×L��h+$�5���=$'��gQ��BpMg|�v�6Bj�Ӫ�r�f�d2I�RԐ��V���9��25�q�T^h&x�x�—�R���S�OU%�aM�?S^
�Y����VV�xv��YR�ѳ@ΑM*�= 
=���J�@M-���g^cf�%٦@'ʍ#��[K��RH��s���SK\!��ᷘTȮ�b'I���V�:���ŤX.I��n!ǥ���j�2�9��=�q P�B��{�{
�N���^��L�X��Ϭ��^���Z>��yAlσ:W[)�Pu [n�.�_1w��9��G/�!�9�	����0a�|��-5��kH=k:��[`�V0}��3�L�E�'L}�ʸ����50
��mE��ho�ؐM�Y�RP�SmaK�����;8t�
�=�"�s1U{�V%�F�x-�h��[!0:��'

�,���BlE��RY�l(�8���/k�QG��öG��C\]�Ç�9�Ư ���i&��AO�Tf�R��)�T�t}+3�YM���X�|�`1�bR�>n��IZQ���V���e�TQt.G(���?��>-2��?/g���W
���Q1M��euQ���a�^�W���O]��t�LC��x:
����E4�?QN%���e�`f���,̀~3Opܦ-�6�j�U�i���r��lX��/��ӓb�7<���M���G��
'8ޒ0h:{����9Qz�f��o�\qJ�/
e�'�c�#y���I�H��yw�����(����y���Q�O�z58����f���7���e�������qA�'��!�QL���X�&2�l��l<&��0^�_�swZ��3�x/�a���&п)�B��۹�6���r�}5�5 *�a�ϛ��d���
�jy_dF����$��WK�{���vc�Y�;b���p��-�V��G��h)�p�lߌoQ��udGx��h��1����^��y��x��m��a�째圚{TV�u��nO��g}�D;��"[<+3^bZfx�K�����>x�1�d�;�ҝ!Ψ�oPKEePQJs�y�pip/_vendor/requests/hooks.pym�Ao�@��+&z�rnH<4�ФIIZo�
l�]���c{�D�No�o�>���/!U��E�͗O���d2a?4��Rþ��M)U�T�V'��["���{Q	+Hȕv�{s6�c�'.*�'��K��V�`���6�?hP�D�-f�ku>��%�^?`[oh�v��s��7���֡5�FK��	�
a�s��	wel
�h���U��L7FSs��n���;U���|�������o�����@�Jr��I,9�Z`J3i����-�tկ�r������m�|H�jn����{q��co6~v�ݺ��m�
Ι��~�ۊo�2yh!Sw]�T�(�G�`j��=��xPKEePQ�u�s=&�pip/_vendor/requests/models.py�=�s۸�����ٓ�ʌ�nSo�6�G��n���ۙ�2-B6���ug�o�����ڙ�3��H$�<<��퉃����8�vy��������4��Z���\�j�������B	x�)%��ڬ��h/�X7�*k��>�I.Z|��b]��F|0@i��b���V�Y+�b%�w�U;;{ℿɊg(��f"�Zd�u�h[���S	@���y/n����`��r�q��l������6��MS7��RVB�Y�gM.����g&�r�~��fq)2z�zu.�\�����T�J).�v��?��7��^=^��c��DžR����׿~����թ�ȫlgg��+�.���ZVyݤ������B�0}�M#�
>��O)׵�����l�)�b�5�lY7+�~6b���]��������B�ۢ��L��$�L������޴���n�E]��׋�����Xc��
܏�ڬ��߭eC�Mz	k���2����n��f�h7���^fJ�TJV�h�k��X�z�4۴���wgg��b��\t���OY3�׳ Mąlg�bv	���F��ޚ��\CB �����P���R���8�����?~�~"^^n�+���D���K8��ji�|Z�����N�
��
�0�yf� 4UVΐ&���zVe��` OĦ*��
5�Ԣ(t�/�hX͐J�l%M�nF��D��[����h���j[����{��Jng��YY(�=S-�UW����V!�D��'UW�����[�j"͋+ӟP]�۱��:k�U���2;/a.?d�5���V�)5妢y�g��O|@'�ȉ8߶��U��ۧ8`Oڞo
8�Ռ�2����e!�§���_�A�ڍ������������D~�[s��E�
�Wd0���W@	X����p���y���;^�:��������ى�j�P�5�2��oO>q-�Mm��iT�$jb���F��%����M�ѯ�F@����6z�\���7/>~6���䇓3X�����wo�^�=������?�NO���?9��_휜�����ӝ��E�)e8�9�?_�*a�:>���k��
��:� �D�r�[��?��,���n���`J�ش��0�O��'k�nh��"�;��T�S�`�K�-���4=y��pR@�$��(1������8�ߍ�C﨧3H#ATb4J����~�_,VD|n�<�R�o�R	�Oմe�gx/��h%b]ȅij�=�n���D���rgG�i�'k �8� gŊ�%������)W�x��A�t-xp|f;��SZ�5�E�'�E�3�����ܙ���wܮH*T��5I���c��>�>b��\��Lem�h#��F�Ǿ���Y��%�I�}
����k��@��[_���4n�3/|=8+���̮���[��5��ZŻ�d�q�q̷u%�:�C2�����i4��0��"6�-=�jr+0q}�k�x�x+;^�D䵒��59v(B�a��ǙGUE%���ɞ��6'V�~��@m܇�`a<���Ï���Vֹ�xK�)y�	��x"���NȤ��];���~}��F�>��65�Y���O!9d	Y�_Y�a$�}C[���6��������g9=�����x��C#�`�LpO����LۃDz�b�
���/c�1��ߖ���]kx@�f%r�_Ppp��vއ�oe~8r���ef{Ye���y{�U]�@����t`~K&��:��o��R��ƃ�԰C�G�9K�a�{
���\��V�əj��e4�L�򴘥�a�`��
ʂ�1���=��xj*�hύ9���x���^ƞ�&�ט�����]өx߮%�KT��{���w�n0�Ā�ҩ�q��;�;.+h�[�8=Th�myY���wt7�'k�lC���u42���|)6I�}80g8��󍂠�6�>h����%<t�l	bpz�r�d�n0;�-Ҳf��t�e�ʮ�[��E�t��G�Y:�
U+�Ltг�t�&OTh~~�^���JQ#/�4�F���!�`����{�UA�1�@�a�4�3�J��I��;��qjj-����
`�,��H��#��3�c�D�#O�?' �nn��g�[����E^���H⏗�|Nә�^���Cv�t�f����(g���a��""%P����K��_��M�"��‍؆F|�D�P�V��q���?uH#����BZOz4�~����`�)�:�u�[��\G=�f����Ft�Q{�l��$����@������B�0-9�kt�c��[+���/ƻ�6#��x~d����t���(��4��]X�~6,���倎_��	P,� ��̇��3�0�Ӷ A/��M�d��3pc�90l��O	跤��-�y>G��}"�(�1�0�:��-�e��ш��cv�⩼s�"Aie�jc�!��,j�
��%�*�B��a|x������B��Uy	�5><*�V�<��I�K|�i�Kz������J�R2f���.	��Q�?�W��V'LNFv!����dž%=��x�M��y�@��ب��?�>c7@����Һ�x|![�� R��Z�~�	~~n�O��ArTE;�13�X��)*DKП�R�߈�g�c�c�E��mp��G�',bUƣ@��c�#oB���vG�.��G鄂��>}v���
ϱg,Wn�߼���67,l
-v0߽.�ᎏ�G���n�:�A8�
AH۾t�ɋR:ڮoA�}NMRP V�0�@�R��(���mꚙ�XK��p<^�%G0��O�"4��6����һ��&� n:%J�_�}�M/)4;%"�_�15T� 8j�>A�L�>R����� �Q����Z0|Jf� ��Ҥ�*��/���7Z�*��\��@p�fm9L�E8��>r
���E��[0g��K�ƒ���؇��(3rH�O��҂��0,�"�U�b�v���j�!�c��I�~�tIt���w�i):�a}�D�)��5��K���s�΢G��GYa���M�ToQ`��j����e=QJ���NS���Tҹ�`�T�	nE��r >==<�SF;�aO+�s�O��b����o0�"�i�m�a.��%���uн�>r�ϭ�6Gs���F͉�j�=�5Y�`S:�%��z;g6�F�&'�4�8|�0���߉fjx��N�h�C��S�Xs.��S�|C�5�!��Q�G�	d�eq�G0���lO�����WT
��T9�xW�t�M�|~Q\SH̘G�#���%^`b$x�
fMP��b���Ib�J�Vz���w�nW�y�c�1�3!'��=�f:l�c�4�a*����&G�w�RN�
��-�Kr|Gft���+��dZh�Q�Hy�>����:8�8rJƢ�n0�hS�"�s�@;�����\��ߡ�aF^�.=��h��y�a�΋���L6�)P���N0�m	�Y�]v�&�t�������4��8�;X�h"�'�>,����z/��w��i÷�2���``��5�4�n�k�$���0��zu�@dL�j�u���Fi�l`Ӫ�%E(0Ile�s��C������H`�#��'�޾��I����*�}��8\SM��)�Lﵭ��r��M�K$�̮���<��[bf��}�#�z���ˢ��-�{u��c�\�"A��ޙbw�,E�(79k4]|�$?��~>y��Ś��Q�ś�]9�k౏�>=z撯��'�Ƃ��Vw���^�Kwa\P�����f02ʛ�%�&�^0�u��%bv�\7���N<H�APT[vvi�dZR�@u���,��>�UV�m=�8��(H�B�+���D��PMӛ�lf�{k<��b*���Kq�g�F�������C�9	-��qJ�B%%!+&��U�s���ԉ��]l��+
c)�fL:�ߏ��X!�fuB='�G	*H�]��N�vi����~�k�s��iU�>���d_�Ys��H��iz~oIP�"���8~>���c���'��H�x/��l�Ķ���`�{8e?���q8����;k���c�OP���k���k��!��@���G
����Y�.�+�<����0�)n2m߃����+�ᐜj)�Ct�{��,��/ON(�<[�Z�*0�FQ���n�7���E�`~4M{.�i��I���N�q�x�D84���lTf���r.�[r��C*d#t��<Ȑm���I��.%l��5�l*-�-~�p��:�PtG��i��j�-Z�O�|�\�ۇ�#���%��U������\��(AÈ.{ڌ�{I���l�K��l���'���-1�Rs
�	^�3�Ew�h��^���]~5�ߏB@�4r�A��E�
[y��j��R�#�=��G%�Kq�r��|9ê1������>�IY���e��;��H�)�Q�8HS@�>�mCp�g>��hc�%}[V�
`�d��4t�Z�ls�~�A�tۧGY�
	��G�?)2�5�;Xa�U,q��z�e$N�Vҕ<%���d:b�P��|�Nw���9��q���0�w߇������
�A�a��v���;z��#�kb�VkES°^
����h���T����2�	���Y���O=�E�Ϙ8�P��A.ތ���.���7䦠�ow@��M=���XɈV�ɱ�0WX�D4��7��4�����g�-�nh����8���|��8PTP�uv�v�!�����T J2�-��W��#E��|�Z����ж,�^��P���D����a��=P��F�,���#��ƏSnȳK|����rN�PڴM(��j�U��^�e��w�U���`Z�z��f�\�Љź��aW�C��'u����O[�ʵF1�19�=�ջ/`]l����� ��S���>�Yh��HޱQ+�r�l||{�=��T��b6C�9�]�C��
;��N{��=Cz=�&h&44|t&8*������+�25l����[�&	I�ۚ�:y�w��)�V�&���b����"k�wEGW�)ë���1|H��p��9�m�7%pE,�"�8���u�w.��#��leoŋ$
y]h�����
cڿ��$���6-���F���=*sD}ve�H��|O�G(Ŝ�ꄁ�G�a��ف� ȣ��w\�kO�����I���*�'Z�~2�8T#��k�X��NJS�C��F;�Q#���=J>ݿ��.��@�ܗ����J�����ȧ� ���hwb�/��z@�"fZq��GÔ�P�Mך���M�K2r��D��J�ͼw8P��^'G �5��&b����Qw�2r�LX�hp�+��	
���d�	�:�EH��@(�^�P��x��37^�p#��r�@���8�I����Ź��F�4A�\��^�x56�H$H�$l������`�`��d��:z��*��d}1�GziNAM��2I��q�0g�8�q��݆���O�Ug�����ht?��W1���ΊtEN1X�_Ztr�a'������7��\L���:�1td�����nn{"�j���c'���6��a&$<V0^M�Ǚ�Yy��Í'�XtH�5��.�I�i�G%]0өXu8V�T�.d K�}�����"�b�hYJ��$�Q�,�ҟ�,����Oz���Z����{�˃���6
�	�$܋��qxS)�&\�Z�F��9��ȹN	��
7n��@&ea�8�o�Iū
l��p��-.�	�3|_��X��6��EiV�갵��Cp���Yš��Yg�u!m��R���]̃s7S�ڂ�9W�����r����.i��9����	��F��@��=�e�w���r�n�ѦF:k❳m�f�
�)��欟zm���x��.��q�8ii��=�S^&�Ϸ�>��	!�P�NZr�G����ݐ��tס�~/�AW I�e����錦��шt��G���3*C�"H��Q���6������pm�����5P	�A'�M��ƽ���yd���-h��B��S��)�~M�N�u�����ҧui�����8;t�GEw��f�^ᑕ���)j6�r���aӨ`9wlQn3�~�KO
L�ݎ:���pGl���
>i�Ə���@��&����Ӑ��	´�2������U����F{��D'��Db���`+��0ZPz����Bjyzx�:x������NjW^����¤f�.�V乛��7��E�g�yuғ���ɍ4�[�����R�1�Z.xs���:�O~���%t�L~�<��䱇����=�7�
�R��IG���QIYd�\�Wy%�.�3S�@(��Ayb�hB�E8�WL�tI���e�>�nb����LkT�M,����w�k�QΒ��et����-v��TDྰ���`>��s��V�L@k7�+��`�U�٬)�>��|��sI��2�2�"���L�{��X&Q=/�R8�s@*!̞�:�o��`B�.���w�
���D��Ն�4��6��\��`ޮYx�����̑�f�����#��H�!Pn2H4�\���fMS��5z3�sI�&!�\�m6�"s��)
��Z��h41,ȭ�i�4E�$�R���rʎժP�Tm�5�fiv)N��4v�^�M��扈�
�V�Z��a�9�5��a6�g���Ys�� |p�^L�}���dr���+�9Hz��A�YM������z������KW�+�)Y.�ً�V2��A�E1)#�FB_⊊W��+�/�ux�k�e&lD�_�H�)&�#ət�,�e��U��Ƨ��%�'tl�K�A�b�G�H��w�ٴj�/.v���	]`�F�)��	�7���7���>�.Wd8jf���+PQP����z�ο�.��L��Aխ�z�/�p�-�y]�}p����Ӧ�8t���LA��
5<ߗ�%/�.E�^4�㡅2l����Ѿ�����:6��gwQH���I��i�Y��Ĺ>���J*
N��p�N��N�������8	�W�&�˜�6�� �<�ǭs�{����SU]�M6��oֿ�fQр�p�-f2�
.��:�d�
E�5;I�<}f�Tz��K��~Z	������1‰ߊD�s��k�3Oz����[n=
��I�Q({�u�P�{���%úҍ,K
�c��0��?�):	]^~yj�1����D�.U����O�����LF�l���.����U��)��������4�[(�讨d��*���ZU�\��M��܁�}��������֓N�#�:�ؖB�^�`�6 ��C̎�PC���8:,�X�mA�M����C�4`�z�6Hl>�I
�
0:�S��s|t��q�T�79}2�^
��S:���OZz!W��m(|#ď��&֥�7�����
���GV�I�
������
�K��)0^�Y�)I��Kິ1)���\�I�wV`:\"gp����0�(�c_I�}��(y�t\J�2
��`�؅��� �{�Ub��`��R�۴o)2��3f�/�]�e#e6��˵�!h�`aǾt�L� �g���� �n�૒|!8iw_i-�A���ӭa:���^����B1
.�:h:Y�p�6����r�43�y�]g]`��.ټ��nijdB�ٶ'N9�,(�L�H�k5^;�F�$�=b)�{4��#0���R�t�e�F�g'm�O�k�ſ�3:��<��)x��I�`��>w�����-���|�wkB��4�=tI�<-gz?���s�pK���
�v�K��v�;������
��9���1��4��ca�N����Dm�-Er[a�V]F��"���G/u�10ճn��9�f��l�d7¤�N�����.�"���#�b%2pw���mn03֊<��Jq�=��f<VvN/���FS�7�B��p����vB�=
�JS��A����>��X�����F�zP7��rʢ�rQ:'���ƃO�b�p"�#wh@R�qx�\���������;��n�n׎zZQ���r����T4`�p�e�!�gT�0xҗD���lCD,��W<j�2�ߚ�o��i��#��)S@
�Xi!��D��}@Se$���R.~�t��3}�ex���TC�/�bH�?�+]��ލ�	�+�M!Qӽ�U,%��������t�!�ʵZz�r��w~ OgM�w緟�`�KB5���S��y�?%6��&Qq;:s�6]';��N:��z���f��C�!l�{��0W���~KQ�����U���lL	��%���.���]S���R�ƭ�L+lߒh��H|��Z)�D22�����6x�8��D���/��(�i���+n#X�|��fXcE��3_��C��`d>���:�R�	=���@C����a+Iե��\%�\�	�k
��f���<��d����M�U���ZĔ=�f�i!{�UU��]H�e����h�([g1X�(e���"q>G?�Y��N���68AK'D> ��(��A����VD��up��4/�q��݉z[1�ߓ��\"�o�8`O�lz���C�J	��sx�2�1�:������_�X�V���j:j$�T��N%ί�N:m�g���~��.���xԻc�����i}.�1��*ޮ���l��dU�r����}��כ���I��&nխ�Nk�lxe�����	w⽇�*�2Dd�X�k���n�<��q�"�����(eѱ��e�TD�p1}+���X��Z����6Ռ����
�?�ߑ�DŽZ��)�+ru�I7�	������!��f=�V�׵�'W<�+Ż����?��{K���o���#���<3C,����go�M��i�����)�]���u
0����0'���&�fݝX���ZÆ�6�s������ӭY{-#���q:Č����G�6 �m�һjs����rgcnK3�w�"�Ї���/�Pm�b��pY#��
�z�sɿP^���(!��ES�^���ۛ���#��]�
��K
��k�f��i^�ѝ3hT$ޞ��ݬ��,x:,�?��	�}fn�%N�[
)w��η���o%�E�#��1C�-6���!_�c�)U�w����bHA�b�>��W��<b����z���[6>�xΠ��H��a2z���O���ۓ.�%,��td#����<���)�����m������2����kɉ��+$����u���	�.��)>��˺�����:�R4&V_p����C��j|id[/j�r��gϾ���u�Wt�i�Pɩ���w��3��Ӧ�:8�0���n��-�ֻ)c0���� �����ߊ���RCڌ)�E�^�H��~���M�!����wu=8�o�7�Sf���9!�9��1L�������<?��c�d��DM���T�C��u��&���θ��o����PA0�
:_��ԅ����F��~�cq��������Q�U�uź龻���x�W�yy�Lۄ(�Wq�Zut[�$Og�A��m�/PKEePQ<ށ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�>���PKEePQ����L �r pip/_vendor/requests/sessions.py�=ks7��+���9jdǾ]/+t�,+���'�{��u�#�&�0��ܔ��_��0CI��c�.�TL�
����'�H����2+.'��W������W_}�W�mj�mLV{����ί2���ɵ�T�M��F��;���'��U]�uZ��Z��Rmte2S+�������4�
�����δ������|%4�l�)�Z��~2[����zoU�k�Lk�ߔ�f��:�׋2�af0Gc[������W٢��F	o_�.R�-f�hf�JZ,�&�m�w�]�Uff��ӱj���2+��&������� �Z-�គ?~�SZͰ�l	s+����E=����A��:����Gk]]j�p$#�t��^c���01�t^w������������ɏ'��
`:K�J����ñZf������~����4�5u֎s/�:�ш�q�k���@�<É��t
�2�L߽==?��Bo�2J���Ǵ؞�eV�I�����J�ӱ:�j�k�<.x7WU	�<*a�E�J{OG�?`�͢n��|G��'�х�pu�L�K�t�p-8?w���Vϳ�=Q�z�T�X]�z����*���	~X�b�+sU6�rv�ݤƸf��SC��mV@�r���֍�Y��/{{�Ԫ����-R#+�R]��A@�Ӧ4�[��tq}�VKś$����3�e������r�+`K�����!p�)�W��
>��F����ES�~Ƿ���(j�N��~L6yZ���t����&����N���t�<�'z�;��AMI�$ �V����2˩�X���51	A=N�<ӕ��Ң����G�w4#a��t��.u(��~�`q�>@���C����p d_iX���y<��2į�'�ZDWVl��5���^"E?��+
���"s2)8���x0`K� +�+�<Q'+�8��\�N���o�m���B3Bb	<��}���v�{��$D��l�Ui��n����=��?��?R/i�"�������N.u��l��������Fغ�B;�3g�x�թ�6�u=�x����j�H�dz�z $���N�hp�+x<���F+hl���lC�A%鑨c>G��*��Ko�l����=B,��(mR|�;��36U�isA`݌����@׵���7�C>�@��آ�e�4�����#|H:��丶�w���2���Ҩ��#�����&<7R�B/�-"�B/��h����9�p�e��No=��?Ӿn�B]T:��g�P
h8��m�6u��Eka|+�t�"!1l��<>|���ԧ��;C/8D0�.q;�>J®أaV��1��CVρ�{�c+R*i3��
�mt���l<H>���r�T��'�.>�`����|����-yx��j4�>�h��*��P���,8~�u`76�� ��%�| �E
�=��Z�:��]�tSͦ�#����Re�A��׷�B{�NA�0ͅ�)u�2a���(�:≥��A�Y#��9C��}`	&�#//�X5I�=T��I�̥�1@趀�hZ��h$�`��G7+��R���7 G=p�UW�I;�MƋ�?	N7ؔ�&�a`_>�������Sk�%��Wu���#c	�L%@#@�?���	��M��z�UPZi4:�¦��$�!�ύ�ppn#`U�₩q����xvtr�W)������	%���i�yv���a���K'��RyJ1��$q�EYY�AHSZ1<�v	Lב`Ǭ�Ke��yk�n���3����'<��kH����c�5�Dv�����AS��{��J�V(�I��7d��H*�!Y1����x�
���!�Wy�\Ej�ҞJ�0W_Z�xd�/֞�,�5�l���������E���wS�{<���y��l+�
�Ki�LR�v�����J։I�p	���2������W��b�N�;R���?�f�6�hY5��x^�8�4�9��ԸA��;V�G�.�{�����(D��C�Ac_��(��ޓ5
;c���p���ãP���gO樗�ߥ`��y��	q{I�h�F#)�R~I$�-O�h�
R�@e��L;+�uz�u�.�����T�I##
�A����H:�r��?�}4���@���V�]V�%+8k8��W�,HzP��V�AQn���x���g��j�M�)MjLN������qg���S�c�Е�nU���4 �n;;��_��j����|�x�4�`Ͱ�m�8�.���w�^aԋ��Zojפ«�q�D)4E%}:+i����&ej����5�p�`�%'(���u���`����56�0��"e��dQn���^��zO櫝?1b�2G� gK�{e�*��s 	)��&�0�u����<�
2���L>��@Y���炽���q؞�\\�dJTh���ኺ�=�5>��:V�M�\�^�s�����r���L���DL������z!|�N?���g�4;v+ǰ.���/�=�t?�lM��Gc��O�B'�2��𰚂t���
_l�2O��]�%�x�-N�A�*� N�(Q0Q�ox�?y��9؏���(F ���������AiX��*޷��9j��ㆃ� ����CG�� �92�(���b� ��쯴�Ip��W�ag��r��kL¡�9O��'�7�,�:^g!I��V�XG�H�]X�!
0�&Ozh�L;@�	�;��az�c�)�ô��(��.�}�.P�C���H�Z;Q� ���Ե�e�Jb��4ǫ��<�Ӳ�z��	�P��698X��4+�:_vۏ"�G����۬��O����d8m4t�����Su�E�kXa��뉗-ӏ��1OL<�w��{��yD%ܩ���=I<U���@`�0�&Π���/���F6fu`U����p����g1
	#^؉p�:3���Zc�(��Nh�9 ���uZ�ܛ���=}�����ѐ[U�UځN��uqY_
���Oη��ϫ�0+]��cmЕp��;��]D/Y�`Sn��y����!?XLkiۿv����kNSpz`'1�u���f��7��o�q%G���w]A�/��K���֫� g�
��	
����V����%,�����!p��h4�Bh�Y��?,��4��e5�.ou��TA�.�O]��NJ˃���($(
C����(X�q�vh�(�bnň<�#6�c�"w�СZ�z~k�Á�Q����#�e1G暳gt8�����B�7i�h��B�s�����@#[Ut��)j�g�0-b[�h!��I�R�`hZ�L���j�������b1 \)J�#�p�Y��G�y-BJv)T�('G/W�f�R��r��G�u�m�ݧ��4��t&��*[�R1�"���ӣ���x�5b�2h��(Cz_�����ob�o#��?�Mȗ���m�AJ�G;�������4�Et����!�}�9����=ʄ�l����qhL�:�N��5�_亰����y2��E�K�C5��;:�/4�;>:�5��nQF�":�I�c�U|���cc��g=.����w��#PTĬD�0%,ϳK��罥&�3����ѳ�~K�E �L�Ѝَ87�/���f#N��rP|DQ�q�Ý�%I�%�5�])�4���G%\4)?��&CE�L/��#H{�G�d�"z��>�>Є���:���I?�4,���rȣ�egَ�^Xj8�2���= ��C�n$%Up6�y.P���n'�ӂh,����n��ʮ
eu�`?���6�@5�!�	N�Uv�p���x�1TɁ�I���7i��g��f�y��kv�)�y�v������Y�xc�l�cd��|o9]f
6�M�a�b7Ι!Ɓ����N���Icm؞O�s�b�%-S��y��9:��p��	��$��=�j0�&��+Z��~B����KĊ�|�/�'����8�BQ�x����3&Wۂ�O��w�y��ؾ7}t�QV�=��PM�m)���;4�d�=�9r���G�i�6��n��`�	��6�=hf�D�����|��\���얿}==)��Ƀ�Za���-��`4�zk���ؒQ\��4y�;
����l4J����Q��;��k��y��
v�f�7(J�#Q%2l9�h��`�$fԚS���YuQ���@
Ԭ��5��#I��J[�W]���e�^%euypU��j�@'�#���g�3��NE�rөx݌ֳ��*��2��M����W���nʃ���_� �Ӛ%�7jYb���du��`��O��S6NJ���7�c �t2�v/aU6�;���]��޽=;dzB��|2�C9�9>��f��G�l�%��w�_��),�<�����[N�M�����/X)�x+���+�j���\�b8�K5l�H]��%w�X�l��e�LS�ƞ3d]������Sc�K��=&JL�}���[l���#u�I�u��|^�=��^dm(x᜻��(������_��o+��H�Zj��pr�,�9`OwL�>��l�<�l��f6Ð���@�2:��@Ə(��_����M�YZ�k��΂Ak�P�Q�~���ON]��Qy��YVd�lFr|�OM�!i��Y[��go�M46؃��1��3!~�̅Q���Ŝ��	���N63�[��b��UґZ�1�g�Ch���[�lr�/nk�$�Y�[D4���3�o1��B�p�rQ�8����m<�G�@�?҈|���s�&j�*��"�&O�|�x��wd2�Y�y���7�ϣh�@�F�TJ�}�[�4z��
:?]��$��$�l���-&_�x0�j�A7,ML�}�#%`jrQ�9��d���@~�	�,��a�uZ�m_���W����3ڿm��&�6"(��J�J��^�?�Ȱ����
@�|��"�pp4�%���|F8G��&T�K�&�&���}�;m��N���;���fH�{�Џ�lݬUѬ/td�ؘ7�䩊����ȗ<[gX'�#�<�+W�H�� �P� -C��q
{�p5^�_�9���p>OGH�6`cGi0!�������X�Ğ
Wꃉ|[�yl�iL��<�a�C�
h��A��
tR��^65i���t!L�`�r�k/�.�3�\���V�oyd����Ŝp}x����ɒ�>�����u��]nލ���q5�F��y��@/=���qc�`�~ŵ�`f��VÁ����G�[�6���U���`����|���T���:J�d,��U���x.��cQ�m�)sTAl�m�c�o������h���+I��j>+v����Ը���T7i��w�B�nPJ7K���o=o�J4��rt�X�tv�Ĕ��U�`�1��]M�q��vR��^#�e|k��' ���P�,K�U�ieG`�QK[a�"N=;2�߽���G�G��#�B<iQw���
"s�Ց<�Q��`N�L��D^�Xd�l�0Z�e�IQQ-9��\�.k�8U7Ds(�s�z���l�?����C�F�����4�
J�0�	�M��������
P�t��K��'S�5~	_�	2�-3L\��o��=�D�cmr��r��Qw�K�Y�;���:7NC��V�z���D6q��V��w�����/�����E{O�r�ђ���%�7�n�?a����:��Y�=�ྒE�_$@&�OQ���Z�q>X<�$\Z,��r�l-AEl�ڀ��j/���؟X�V���7�$ 0���_ә�FoIJy����R[���Il#�,<��r���g�Yj�c2�F����1�	��`��р����A���rJ0|p�`�{��`�.L�����CÊ:�ɦ���ku�g�n(��w�j>`q�8����f>O� Y�\r�)cm���36����j�OXb�JL>c���U���G\M4@(��Dl�Pު������}��,�e�v�@�K+LF��nxu�`�V�ʚ�dR�W��Pl՛�$��H}+����0�%�885�`5����
��8�Bx�����;��e�.ֹϝ�
R��ýס&�ض@d�5�=��\zY��|A�ot��k)��%m��\I���*�8�8�I��[�?��2�Y�̍��H�\Z�-�����r�2�l�A�[h��*�ᠣC0�F����)z֋3V{�ë��
&�P�WǦ:�)��p�Psp�4α�J�L�)�)��ʪPVK�Ѣwi�$?���ѝ�:�(q�&��G�i����*)��='�L6y0�4������j��W�j��n�{ƚU�#���5w�$�ʮaћ|`K���;���$v��9r �N�^a=���`�ɶ���-Cvž�e���.����C�4�KTm_ݩ��`˜��K�ᶬa��[�Tֿ|���D����k�� k��2����w�[zE��"��Ri:��yر��D�����1n[�t4_@����O޾9��
_D���@��d�l��h��@
��$e���4�(�\Θ��.���E�����g9���(;�g�'zzP/o5�X�>~z�;�#�}�����J��������yٗ:פ*?�u�������Iދ]��2YA����Tw�n��)zx���Χ63�f�r�^�WS����rX.�H��tk���ի|�]�]�	'`3.����ܼ�1{�!�5�e���`��$�;;���e��ٸM���[�Ým�"��g.�Jx?]Q���eّZOH�����t*�L1���B�U=#I�����������뮨b�O�F����ˆ(_vz��d�	�6��b�ޡ���P���(�ck��S0��*�E�Y(.�L:Q���P����Q?M�k��%ؒ�"��v��ث�G�(�b
o�!���(��5yGG�j�.�o��gi��y�?�+o|8�e�Wl��..�i�ӊg��>=U���vRI��P�CL�7Sy���i�m�\j���i�'	�x�J"�Վ�����S(0��^o?��|"6��i/��|�,s����<��,@�c6�Lx����A��\�|G]��XQo�]7��T,���Fmq�"�cY�2��:��q{�D|g^�w��Vw��B��m�����kP{vլV|�/��IE�%qC����>z�
<�Y���ɇ�����sr<��ț`���c@F|ߑi9^vl��e��VrC��]��G��]��%T��]�*�����]ܭ�XM?����x��ںdF��S*�>����9�±VtcН����^�w���NY���"<K��`nu�;����~��>T1��+����o�Rt��s�2�3˔k��
�K*o��z�%���CP0i!�xC����]��;���A�e��\C��zVJ�L��}7�u�R	@|B��.O��|҆%�Hh�M��	G���0�:W�H�>��e�=������&�)1)N��������p��W���(eՁ���`�~IL�F�mѽoi����)P�m7�}�����`�>v��1Rw��Y|+&��X�h℀3g&�����D�K�-&������U}��!b�/ V��y��gӗ�n����_�Mdf�o��PC�>��P��d�v�Ŭ��V���݂��ޫJ�����#ߔ�F�e�{�����d�?\5��Mٗv�W1p�+.��U������]��b����c&>�R�,ݜi@D/��_�qz��!�*��릛B��N; Mt��%V�VR\s�V%Z���UeUsm�R���#�ĺ��xE쥟��5X��𱵱Z�ޒnM?N�~'溃%{%�H}K���7�_��h
煿cufG���EP{��u�B�cd�F'���P	?ʥ��P��-��~�%��7��cn�����l��?M�$��H~��2[W�L��WX�%4����:^�L�_��:�`���Lԓ�q����к�:(�a��܂ϝi�e��0tǾ_���N�D�ѷT�mo��
�R�愤��U���x���i[�����"�s	x#�Z5��-�A!���X�ڷU�	PKEePQ=��z�\$pip/_vendor/requests/status_codes.py}W�r�6��+0�x(%�b˲�x&����N�ir�3DBb`ж��W��K��_��.H@rRlb�a��]����g'�2�қk���U��}��I�~+�r	Z�KfV�d�Y-�JK�kE�<���mk4Ӣ��X�����2��t�7�o��L����
C��LT�tN�ɤ�e�{oժ�`ˠ�V�WF�+�������v���.
�7o�0�v�zf��^:�F� ��J�@0ƭ���m�|~��+�f^��x�.ή�j�Ƽ��槧E�δ�vʶ�N��o��)P�{]���[�w��'8n�=|V�Iv'��mC��&�WX�D`��}���![3s�\��/?��.�^� �`��V��”�<s�z�ɬQ`�g�۾�=L"��1�}�-$�(8m�5���� Z�	lf(<;=�f��2�+���xz�gA��P\��ƛ�4.��X8z�i���VV��Q�'���VqooL��ʘ<�'�S�䡹
����IB_I�1��7�����,�*+����Ӝ��ۗ�.��\�~k��T�;��1���&8-� +<�Xf���^
dO��d$H�/1��z%�E	�2��9M@
u~(±z�P����`��x��ʃ3G�TˁVH��x�!�x�OG��:��(����9��5w��p�Z�a�
f�1�'�8�6��3+�-'%7���Z�c�Dx�Ϯ��'c*`+��v��2�G:��8�N�q�(y�1��@=�B=WCm�C���E��K�94 �y ��*�5���|v:��F�쭵�Rb����y<��2��^�*�=�"�~�k��=�^Se�,Y9�tٕ�k�3cFb.Yy�Ҽ���֮y@E�����#�r0GgY@/�{��a��<���t��?J���_�.�ZizJ~���"ǮU%X�a�7Fgn�a��7~�96�#�J�V+�~-T3�����g繗a~G$+�&_x��F&>�9��$o�f����q��v.��k��H̱����ܱC���-c��C�H��gD\E���.A�s�R\d�aҜ8J9:�2;2#�Z��
1x�M����,&�1�m��SA~�ZvRñ��L6�1'��jzD��ҺQ�����XQ˽ڏ���zTl�G��6�Z������g��s�:����]^t�|$f.��JW&'c?����<P0�����'�]\�Q�*�tm���
y������p�3��$�T��0tO���a�+��f^5�TV$�w��4'�"o�\I�9��e@���/��
݇�� z'I��H;+�b��6pa��L����Vγ�Sɥ�8�$��X�[�;��t�2	fsm���|'�:tg��7#�]1.����z�*��Ќ3n� �^���^�@��j�C%eM��qyb��|��`f�#&���{�-'����ΟE1\��M#�K��ѥ���\��L�ѡ��c�Ԅ7�f��Sn�
XD��2��ކ��xD�1����ԚAtH������v2)�_����Y���l2V�Ia����١��kV�}�Ȥ\.���\�#�qw:m�C��1�
4�[��g쨾fG.L�P��p\{Ә<�98GQ���'��s���=?�c��k��c��k�~BN���!��
�a��c��{`�c�PKEePQ���|�"pip/_vendor/requests/structures.py�V�n�F}�Wl��E�
�.`8) I��AC\�#i�%��]Z���;�˫l���{�v��,�ay��B���^B�6��M���E[��f֙�p�A���Eo�0��턃F����1�]Q8��pR�d�h��WS���,\�
]5�|MC9��ub��{���P�Z���k+�|Bv�̡���Gi\CA���%Y�R���F�e�7x_5
+���T�v����%��u��<h����G2��#�*ts�����ޮ1�I��g�y[I��%H����@Q
��PvX�ӰF��nw86�\��p7�;�)O~�̱����W���$D�u��<O��8|��SM�x8:@�^R	����u�$��3���~B�	��$�3�މ#%񁴡�I//S�PY�Ջ�XL1w�uQ`��{B��/%���Y]�s���y��-C_��íiq�QҺ����q��6�L��b"w(h�]�5�ޖX����IF�@���z��P�o� �3{כ�McC�D�Sz��Th�d��{/���ZT{�6r+k���T�i8�y
�$�ش�䳶)�C�W��
%��I�p���ԗ:ۯ�� 5x[���dӡ�5FR�@[���5'�
vH���j%k�V�Ģڤ@���O�&�/.��lm��ǘl�$%LV�D/r�p\�3��|r�5w(I�tw�$��ɐ'Q���N�;���@?��+��!��mC�[�䑂��P�JӢ�5�!>L�	w����H&iM��>�~�v��S~﾿��*Q��NO:�5��N��y&�g�'�H��q�2̒�%�����fe+�OƠ�d�`b7Y�Ƕ��|�L�f��^���t�Ƈ]�R?.n&��������^�L�3�r�E���q��C�4��L��ɑ��P��N�����n8*{4���nl,'p�W���P�c��
��k��x9�qt��́7I�g~��?!��J�WlN˜�r2�����>���1l�,�W���9t[��zm��u�7��>��ȕ?Z�ɘ@ꡋl�߫��r���_�bx����s��<ctn����n�;�
�V��gٗh��&.7zF�oڊ)]�2����f̆�OV}���]vF��PKEePQ��[%�upip/_vendor/requests/utils.py�}k{�ƕ�w��Y�)@��.v�.c:ul�Q�ة.ɶ���P���l����@����zژf�̜9s�s��v�Y'��X����|��5�
��J�U��$-���mm�^&�Z��*�jY��I�K�M��N�W٬J�T�eT���jU�X�$�e��c�U���2�&�U��y��m��,JarY�Z,X@��J˼�p�zV6߲
����<Ir�)�[�|*�ٕ��oU��5����^,�IZw���pU�����y�/`i�e��m�B�/�΍�0��E	��д�I#�f��Ҷ��0���Z�0U��ܯ2B�%0R�U%}�aqͮ`�q	s[,�����$��!��=��f��2*J^V�2L���T!?ï᥎`�=�-?��
��*R���t9��������mo�~��w˨,��*3ݣR�tG
�u����["Ȥ�w�B�]'E�-tV�C�Ͽ��K�:�ג_A�z��Ǩ�u�>sC&�UѴ}S<�J��	b�e�V���ҡF�Qv�I|v�zd>G��W@u��	��	r�βB�$YMS�m�E^�����_�><Q�{A��b捔�'h�����ק���go^�>x~�4'�n��|��o�O�/�7VO�~.�ˣG݂c:ǃ,ӨR\��Dy0��ޘ�m����mQr��'XP~S�ȁ�_�9Q)�|�,�H����诸�/��H���/��c�p�+9�	���y��R�mr<
�������Ƹ@

���W��ֆ)�q�Չ�*dB�<P�v����;_�~��ÿ�/Ύ�ߜ�g'�ǣΜ�$�W���Y���흠�݋UQ����H�Uf`�ֶ���0Cڃ#�Jc5���O����!����/G*R:�D<�r�,- \�Y�_W���1JW���o#�����5Wox���w-o��M�Q�ȑå7�|S�;S�����?:q3u3M�MboO�#/��?�+�S�#3���ZDWx�g�zv��q������R+s,��5|�0���=M�Y�>�� �7=���U���|����<��
�V�(˳�p��~��'�{P.A8���yoFnd]��
K�f���]swi��0�4|�&�Xj��Ѭ���̕x�?q�mc��i���{��	�� �T1x��>�W*�A帷��<���.��B��4����l�S�����\�qU耶�G8#��
��CF���2DDo��Q�����6��貼4\�a�8h��$�����*��qsH���Rϒy��U IY4ؓ��v�6�{��:��Ѱ������
`�����W��c�I�S`��2�hM?�DP�k���Jd�*/�2��A�H@U��L0Z�z���5�XfU���%�:�s�W�h��䢺��o����p�����D�uf��N���ОG&ǝu��/7t����'Z!Y�m�x�	�᏾��,>�<8sk�vhE��u��6o ����`^VQ��CP��2�d���V�E���ɤ��&�"�HP�!+�4��� ��I�`óB#��݀Z���]VK�ӄ�
,X���7�Ym`�.o1�`�|�����[�,�/����L�����A�5B4!Y"��"\�8ҍ�F#�G8�YM��b`�hDN��:�5o�XY.�.�;4���@� ���p����ȞU��H	��}�aV�'�+M��z�_������K-�����׾ZVU�Ͱ��W:M7����ث{}���{�&ܸE߄W�p`
K�6\X�/��uR�@
Պ�,��+�T���YM-h�߂�����(q��uĺ�ɲ�	�wejm	�iNg86�8ϼJ]��tçМ[散���.�4��T��Fv~v�ʮ�=���9�ρ%��E��=�=[aw��Z�^j}�
Ym��?�:!���-u���2��0r�d�#m��eL���P�<0��n��<��>���ao���Z�4.��ppA����Ю龌�*!,�S�w����G`�5t��u����<\k�߈��;��M��Et�w��t��(L���{&�Vե�*RPr��ԡ�y��_�J���aV�%� ����8c��h*���ƽA_F�
��:��
M�t�Q�99����j)
}T
�+4зK87p:
���/�z��P��.��}�c��vL��(I�[������dv�G1$T�oVIL}�@�h����NW�,�@�fA^\�&e��{�����2�.@䮦�5�]��]��{������5��V�a5�����=�l4�4�¹����S$pf�
*�S�L�����ch��r�ċ&a��H�C{`�K��ZLuQք
���d �?|P1
'e��mQ5�4�-����eB3�5��h�,A8 A����,�|`���س���F(�V-�[��� �8��E�,I,O���O �eo��GΠ�3�O��ͮ����Y��l�|���w��"F5h��.7y�=.� ����0s�j�˸�y��R����T�C�פ��mQHukⰊ���d�<?QFGI5j���(�W��Ze�^e���0MزYR��U^�ì�.;ʍ�{|��w�ry�]��t	��-�������$�u�6z��A,�I������#!0}jT���%�(��Y'kSӏ�O�CoDbhĭO-Q[��>��=���S$�C/��a��zg��?��u�0�).��c�1�
h��4��M���0;43�?2[R��ۡ�`-����D�Dj���!�"�&���]�T(�7s4�d>@;�|ygp]E�t������Q��m$��܀"��&
�ٟ���ʄF�*���@��@�)�N~c�'�	�a�B�W��6걏!`��R37@1�;�Yi�0�J��%#� P�5�ZgeJ�~64[�ز6 �<2MՄY1!�Z�I�L�y�Ʃ���Z��Hn;�u�z"ޮ|̓�?�f���g �� )C��3�ή@Sb0��d���m�	���t��7
����!CL�N����H�@�G�bI.f��p�s�bi�'��;Ä=�=R���zá���.���uF��!o|gD(��Ю���/����W�.�F#1JA�%S �p\>H�h��f�ZIE�.�N�X��!��C0�k��X`I\|��Ff�QF0�����MF����P�={ֳ�s߃���G����
���z,(,e�P��b�)�W�2�X�*���1(��g�Q�(A���iL�&���V�3�_h5c^ͯ��d�h�9c'ͤ��9�ѽe�;�UX��H���!��<O)�bhc�\��o@�璼�`�k!�*�G�GV놰9���&���۳]O��7��#���Qp����^{�6�B�X��	�����H}[�Bcv��2��wotq�I�.�_'�Y&�0���ɺj2�h�RQݺS�7�Sǯ^����O�	'���[e엛�҈d˜�E�Sj��b����Tcܰ����R�0�d�t�Ԯx�	��z�>��р(��G#S[P�w���۳�@/JQ��"�c��J��_ᖚ�Xe�"B˗��s��h�P��!
���*Y�c~�����X�&ڡ��)���Uj�J��rU��������LR�N&)U\�A�S�\�b��y(�?*b5��A-������R�W�W:��`��
���[�$�kO�
��������k"��Tt�6B�J�
��x�Xָ29���1RՂ��i6L���g <�2v���^��p"ϙK���		����#s����Ʉ?���7h%m܉Ie�!����ѡ��pn�tbj1�9��o2	
���$@́�	�-#0�>�q�67��k]P�1KV.{AI�Z�!��̼y�OD����_L��ij���l��8�F���=�AIql�NB�=��t.0�!����,e.и8Ѵe��G�ꂉF~@��=���PKT��A�Kϛ1	�_?��H�;!o>�4�s�>Z�_~��7�#�ر�LF��⽝�a�P�$��ľ$#���1�&@
�?�(&��󗵇�@�=�ܷ���������G��V*`��2�5ɱ2���9e�"����a��3�k�
a�35��Q�ߪ�x��oJt���	O�~@��N��KiY�t�����(�y�����nw�ÕuWũ��䖽�Ю�Mn����&�p9*������:�|�y˳���P=����PB@�L��%�:غ�C�b-Pq�"�=ܜ6A�^��w|\3�n��2$ӯ�2yۡ��Ӱq�LN�e
�L�C�L���ZP"u��x1l�qp�,L�
/,��d�X�Lj�l6�i~�i��(�"C��|��%Y�nnȶ�70��|���X�~8v�LV�Y��݆�n���:�:�����S�/n?��dC�؜b��:`��;��ڼ��'�tLn8���~:��F��]�?rm�7"���n|�$�.o���Gr,R/�ʜS=�8n^+��E�̝��oG�r�mI"������ը�ڟ���h�*h�c��Dq�HA#�m��e��з	[�&0Tu�`	�2p:4S+t�����gk�lT׏]|;(q��ָ���v��h���0_��"�n�h⨓�=��$~7f_+:E����Ⱥ�?�(k2�(Wm�J��k�z�D��E��f���`��!K�Eg���Ui��plr�����@�(l-Xf�&I9��� ́�C�J�{�2�6I��,�3��[ �/4���@�=�����;�?��!~|��&���&h�"�XD��1���5��`oi�<}�
��f;z��zf�f��@��O}�p�z)�5��uZ�X��5��?]�7�mI�u�N�� ������e�Z��!q����5�ź��Ø�Gw��������G���<�
ޥK��pd�ڽU�WZ̜�!�z�lN�"5�
�g$�t���b��Am9K/\1j��qԽ|�o�|{�)�L�|�v��`k8�dp�|��c�梣�a���=�
p����8�Y�H�{M�����6�k2ٔr���ߝ�����$�����c��{$@�Ra
������f|��X��G��ӱ�[�Ϛ!=�h^���X||^75[?��
(̤&8�����y��?��{��F�A�S�Sȗ�`�_�SzU��)�;�>���RdZ9wA��޲N�v3���i�K4HFl�Z��"�c���s��$���Ry�7s����-��M�f�Jq��V����*��&_\o�1�PT&Y�N�7��lP
�7
��i2ӥo�U�W�]m��VF�5 �{p&��]FoZ�%%���60�ch�8ϟB�f��+�I#)@��Q���~�^"?>�vcl�����ѻ����OB�̞�=��R�R���3�T>�����i��&q{&:��~`�5%u	D
5�M�1��a=Hm��A�����ý����W��F���ن͸�gj^5� ���˙�.��m2���I�<�
�I�n�Є&H��W����=�͓�~.)S;l��e��9D1<��L�L��n$=k����p��������/Ó�S�=��(� ��������?}w�翼�����z|rz��O��G�������U�����EY��on�>
����>���?��N�s`Tz�vmf篊��gَ.gi�w��ػyd�RόhYM1�`m��r%N�5�Jv$RÑ�C�/�TҲ��'/�����	8�;�.)A;1J��dKp�f��#����_��Y�����A�p�����]�MR�ARFi�Z�/��^����e��ˑ��/��\��쀦�?���f��/Jo��P���1���å��8y��7���{KOX�a'��[�m�ct7I(�
rFvN�\$.k��[9�@�u��`J��r�u�6�oE��@�92�ov7�hy.L�\Q���A��}F���[x���{h����m��-������/~��_�v�_O�����ct������m%�7�˱,Q�t8E���ǜ^���9Yܪ>��f��O�����_éF��IW�n΋�������t0+�D\���,�L,H|�4��6�b\��� b�M�1գb�w ],h�"�E�T��0����S|׆��k�V$mY�1l��f�'�Z@���,Gx5��as	�m,{s���J�)?���
S��A����G��C�e�%9$ȭ��?�����>K]9O�v�|ƀ�������cH�Ĕ,�&KD��rI�s�]���7�]A�C��2�ڰ.z�+�JB"	�[)��	��L�q^a���"1���CgP�gB�9R�{3��(�_����8�cgq�H�jz��%�� �s��V�֌�r{{X�oQ�ocG ăG
-��?���o3k�-ٻ�˟����ӧ���Q���oc�F^V�/f�>;�x�koi�iy�(��%�<k����ٺ��餙�UJ��:vݑz��#�Y��rk�?j��O�Y>�r_���L0;�"�Q���ླ6W�D�2>/Hu��
9Gx&Z0�3w�߽��N��/$d(��GiE���Kղ�mi��������v5�{��M��@>.�,������
,`h]�V����U�^LM�3�<<��1�N0E���$_�J�?�)2���tC&�|N���X%���30Y�s3�����kA�<�E(���ؾ�o��i� >O��8��2����L����y�r"���N��z�~>�����N{'����uԃ�+�:L��ķR
iq!���Hnt]㈫�	)v�jI^$+����Oɞ��rɍ�?��K�6�>�B�Rh�y*��qz�ȍ%`�7@�����F�i��q�d@@�%��Àf�y��A�ԘMTՌS���V��/�������Ѡ���X
���ok��ǫ0�¨@/��j�=	���7��g���D����*v"�q�w�)�3�6���B R9�2�M�B�kvwwq���e3�l-�ed��݄�Ri�v;�b�v���a
{�eS ,Ƀ�b�$ަ
�P�����!���nrlf�xC#�F ���H^6��Б�m��'-�	>�^��=��Js��b��)���8�ٌ�=Pڛ�~G��d7��`��D9��’nz��K�z�T����T�A }�~ѭ��C	�P��G�"���(7����ޖ2�w1���Dyc�~�շ����^�i��f\�\M@	�f��6�#'��q��F�Ml͉<	uݡ�([WjM��R0��F8Rp�Qb��ְϑØ�;�m�i�3N�T��^Wm�,I�� %W���-`�fm�֯=��z%��HB
�Ҷa��qG�m0���VX��կ�L���b���1����I:O>K���!k�Xҫ�7�}c�����`�1�����tSQjBΥ�#5F~���MǑAx?�hG��2�
m���2�X=w�uT	k����H����2)��y�غ����
��l�y�Ae��I⦢�U��i���^�7�c1�_�;
��0[ԗ��vw��ݙ�h]���xw�}��;���b�>�Y�w�N�M�x������V�d��)�y�J�� �`���Ow|ig�q�Φ�O�WkM}�����%ob_��_���BI��>��5i+]�à)���a�EO3��f��`Q;�qQ޸�V�{>C��s(aO���X|��S���$�*
4��=�>�/�,�W�M�Pٮ���� J
��4ɮ�կz�gQ���Ifj�Z*
�ޏ�S4�ƻA�΁1W�ǥ�x�5`1�Ѓ�)mp2H��]|;I'ꅑc�~���e��a�@+���W���H�z�
�����'��S�����B#�}�E�G�S���_G��|0I]мI�t. ��O�Ac�Q�h+�^?�r��ʲ���1�_�jm�I+c�3�ݜ��V�oɶ����P�a�ֽ߼�J��Ҿ�M����ެ0���_ۅm
-���a�N�t�ݛ7%�%�U5�
3��71n��<)KV�B������K�1��#H�?zh=z��l2c�qTEk�c�o�?��}cv��#W����i5�GR���-
�fO)`tTby+Ef#p��j�{�Iє6�(�Jt��V�_��@=O�Q�g}����J=�*�|�i�p���G�k=Pn<a~7'�A�����Ã��Hu~{�U=������yBcs�=v�9?��b.�'���Ʌ�8Rߟ�>��}�q�W��x���}Ϣ��,
�]�㵋½���
*�"��a6͜�=g�^o�G�1ÕM���4���k|<,b�����.ig������ �2��zz>rjA�V/��$�y Պ��V�Qߡ�v�������x�̶��%.]�]��߸��Z�Ã�U�|��YV�6d�:L�!�RJ4@;L�ț�W��R"���s(0tGs�jQ�u@XY����Ks��Nv4LC�5��0�.4Qiz0�W��5X3��8���,DG�g�=�p��b��#����8�Mso2KfW��� ��C��I�)���2��&g$�xR5�T�M]4ʧ�J1)��3�V�~d@
7 ��	&�ΛY�b��"�L*Xi+U��rJ[�"�����p695?��	�C�z�c�TK�Gvj����f�oS�^*��*t`�]��ߝ�K1h�c*b�����`�N����{w�-�*9Q&wǸ}̨���j�Lc��}��ɻv���M�l
�#U�{*����^KP�$��u�`��\�Rx}��������o����<<��t��;=t�qM��{wr�)޽��?����w0���'�ǝ;`Ե�:2=P�����Iu׹p��.�8�p9w˓Ҫ��T��Tl��`h���02s#�����W*�����wf���duO�s��hpdbG�1�ۡd�F�[��,�[�ta�Z(r�u{��:[���K�旊�J~��mT)ڙ�|�I�l�Qo6��"�j�}Qb:g�7ݐ��7�uu٬_�(�j�Wէ\o
a�_h���o Ŭ<3{#G\�R�8`�0>S;����<�3�P�X2��[�^���y���Jk4��-Q"bpb�R!����>����"��M�,�$_8��;Je�O��d���_�T�.��yT�1���]I�S,�Q�;����(�܊,�v�LH%�������A�(o����h��$�e�[�Ѹ�ARw�n�C�>�̯������M��3SzF5�c��m��ɿDz���G�g�7Fn~�"��u�?�F|]ϣ�PKEePQa)|�"pip/_vendor/resolvelib/__init__.pym�?�0�~��IB\�7��fLS�L���U>�U�حサ�)��UJn�U���Z 6�J�N��I��Lؚ
(�s`���4C
���+ѱa�ﵫL�=|�xA��!�C����֔���Ӈ�DHs�T7�l
s�xh�qb�5HV�:[%B�;a-�������22�ʘ@?I}�arJd�t#Cf�9�/���*_��6���bq�;=�T,�PKEePQ0��W7�#pip/_vendor/resolvelib/providers.py�X�n�8}�Wy�S���Et�n^�Ŷ�>�5���E-I��DQ�[�-
C��s=sf���C��&��ݳ�ɯ\�/�xw����j�#)#�ѩ.�*O���Ӊڨl��!�w^�#
�y&���CM{��m���*P�_�UG-^��`u8��>S�t�}
���xَJ,y1i��&�z�A���k�ۋ��'����R;mu>��,�]jP��VG�L��z:2ɕN{H���^_U5��k�:�.��}cMTg���9*�'ժ"����O�Z����j�ߓ�J �5�m�\�g�-�}v���5��w~*ρ��$�
E�r���Z�ֶ&��E�O̼zT�Z�z��\��u�Ui�&��bR��
'm�:��G$ŶO�f��TMY���!�nDs��4V����������Ѻ�z*$[;x�w���>AÆ��{�A���ݫ���"5@�m9��ʵBrv�]K��RÔ�{��"[�\�j����dQ���s�H��`�	�!�!�ZpW��B	��lh�>NZ^�]aj���U�>�8
��
ʙ7)UY���8J#v�_4d�x�q���Vc�3��fM�J���k@�am�ݹXJ��F@�2�5������Ч2M_s��M���
\@b�9��w�?����IhD���i,Pȏ}�*�tg�m�w>�n�ѽS_P�G����tߪ2g�R3K��S�GU���u�¨�u�\6w���Ӷ�Q@���	��y��C�]������Y5��<��'_��գ:��L�C��^��m��0����h�U��s�F�dd_��z	q��Ӄp��&O��Im`+ıOζi��L<�J���.!�"��s��&�L��o߷Fx<1c8�N7fR,pI�)%sfNj���Fėv�.H�U�Ā3x��ۏ�	���A�)Qo�_�H!��i����G+xq�W�L�a��ږ��P��/�^��R_�x�V�T�t%��y�e�A���Ko��?;����
$޸��ȑ�b&�$-�b�n��o�Ǫ����pwe��L!\s'Y�7�gI��&����(���bR�G���F���=Xzq��b���z�љFf�C?��f�n��Ү5-��?
Gc˘Ut�⥘��!�B�=ie�y�a�R�a](|1u�4�G��~�il�&�[����e��߼���m�z�!&����Փ���"�E����*��R��EJ�{�N�d]�܃��k�\!�r����e?v��dM�VJ�g갴��fx�Η���I�b)�e�AZ'V�Q?�6�i����1mq�xc���o����pm|q�*�.�ls�nb9M�.-���vq�d���wC�H�U��)�ۭmm�n��+�g�w�^�z�4@d3J@�8B`|��
7�+�i�^�~:�b��R_��(�1�g�\�,�W�|	/��%��}�`[�jY�}�X���"��&k+zTǴ�cٝt�}�ۥ��?�t+PO�J���x[L^q��ɎC.���gs�HًKS�;�Եey$>Quq�KA_	zy�hЙa@���j�0�!���.B����?PKEePQ9B���}#pip/_vendor/resolvelib/reporters.py�T���0��W�8��8�=o���L�	�5vj;P����lI�n� �gޛy�e9F��Q���!IX�����{ \���X�sR}n��2ZB��A0������A�ޞ$l�0����b�>w�6#Ϙ�M�Fn8]2����2�mY�'���;�{�
���ߨ�Ձ�
�MIz�J_�TG&ҫ���zz�q�n/���]-s�������4o��5�	ad��[�����jBC��wtf���Rc[��k�.	��9���c�\�tX�	�Ag�ٙ Gqi$,"j9�.�� nD!&'��B��֤���b����|,�v�R4��v	��mk
��1�\�2#��X�-8Jjq�u�l �R+I#UU�_U�pČNK�ũˆ�?y'�o��|�G�y�f(ErD_1fC:j�?�^�\?V��NkV?R���>�h�;�__�oJ�.�P	����p2M��`��'�`����眿PKEePQ�&�D��:#pip/_vendor/resolvelib/resolvers.py�[[o��~ׯ�u�2vw
�h6I��hw�5�ÐF�Ț5E�Ҏ����3wr(�i��C"�3g�ܾs��<�M׳��*Q��b��#ˋ����ɀ
�fL�5������T��,TS=�Ό�/��w�>�h��oo����_E���Mw�[���5?���Jd�Ez�Ŋ�\t��}��?�.��XQq�����/�hq^�>-�4���wlǕ`z��xU1a�)�q�D�v'��bǦ*�/h�G?$�q��:4CUɝ`^���uD���ODn7�v���X�s��`��"}'8��q�8̸�-#�N0�}S�+�z�&�02(Şm6���f�)Q�W��d��!���]���b8o�;2���#r�=��~^�#2���D?tud `����t�k����	XE�{#�m�uKRo��7������r�Hy{�TâJ���]�4�*��I�D�\e*����������ǯJO�}��{be#���)�V�?�j(�����vB��~���
fjHj��m����8�@_�ǡÃ�<���w�ћMU��vB0���
�PWz�%�J�_[&�{=�!�m붰��Tn8�ȋ}�Il�G�UB����z�@�*���Y�`P�Ž�����`!w���*�"�}�<֨��}���Z�,����R0
d��ı[�O����r�`�t
�s����ɬI!wCm6	��E�٘�m񩷠\Dh�fql����x5�����q��9f�i�ݲ�� A��+��ꑟ�^wil1�Q��ʻ뵏G�A�,贠���[
"<A�>=�aD���� ��K�����n[��Fš)E��0P�X����Cd��B����A2�-����F����w!B)$�f`Ve��=H��OK��0�t沌����R-'���k����R�2���M�EG��@W6
\�L��{���$&=�<��ua��Oq����خ��e]n��� Tv����=E��Yhh��6�
h�{�|!8 ◊�f���`ѐ@��4�g)ߎɌ�u}s�J����M�3�\ΘH-��%��IN�
��è��.S��Q�R�'j<�%􎢻��Q��J��n��Ǒ�S��С_>k�9gi��F�r޶���+�e�:�Ҙ�b��ǻWj��x6��_(�q���d4�ُc�k,hU]o�ab�ZQȽ�l��L��i[Ho�@��lj��?
�z	iҁ?���=�J�Ԝ}j��mt,��k�^i[�)��
�����}D���T���U���'&��-�>v]���X�'&}:�D6Q:WT*N�L�>%��"i����P��6
���֍.�F����6�<^7�!ڗ3�5U��g�4d',���o`��_��7���w�L�zT���7eu�wuA�1<�#�K�˄D&)M�UX~�1a�)��Q�� ����~o��NW�aVy��,�'j�ӤW�Q�t�h�Z��_�NyW� ��*vE7N�7m�F�:T��7zE*!�5�,���On+4d�.��)�!՛�?z�1��'(�������;[	i�� :A±iu�>o���
LH���5�Mw
�4�G=J�Z���P]3M!���#�ڤ���K�Z��o��2nC���X�N�Kf �~��kmA���WTJ�����.����yѴ�h	zk���#Zˤ�XG�:�,s�zܸ@a!�l�i�?�%&QJ����!9�9xT��)����-���&^�0n��D����
W��j�l/-�3J6��|��?O�9r�u(�N�^C���i;�C�DWk�
T��ؤ�La:����Hב�r����	�� �<��x�S
:3a/��L�M1t(�
�ܘN/�c�5�9��2��+�ˇWU������!���_V��������o���� ])� ��O��Bu�!�
�x����W��$Du�{։�=ܘV��əܘ�}��Jdmf��&�ʛ�H��)d�.�X�H�Z&3z�����t��i�H,I�ظ!�Q�r:����޼a�R8S�U���@x������uޠ�#R��Lg��	�j+p���+��.'MU*MGӀ�ymI�9$� �{4�N�x��,&*P�Ah"j�93J.��4=��_XԨXbZ�'l�v���m߁b'�O�xZ����2��[qjZV����Hj���欢'���宆�T��y$Y�܎�x���b�4�J��lS݀��k�4�6=F�<��]��1#�)��m�f0�=7�#��s4�%zֽ��#i0�U���;��Q�?�TP��:\|�(�ˀ��U(�@�hW���	��z�"4u�����j!�:�����?�C��f�R����}@�_7k=�*�'f
�$�2�d�Ԃ��>�<�sC�J�2G�<�—xĤ�hA�N�o�!�z��!��	P�JϨV�+�2���{u��d^���F>�YЍo�ޥ&�����V$Q���[p2"�8��{��_`ƙ%�Q:7��œ�K띡��.:�=t%*V�%1<�ä�G��4G�5ϧퟦ�cT?O���ݛ.i*F=���H"A?[��aow��_�;��ToL$&�馬�.A�Ȯ;�KT�l3#��K��˵�bvz�>���0!�RnO��ҴޅL�ȿl��v-A|!�&�lm��W`��ɮT^F1c4����^�+�>���oI�E�M,�d�6(ӹ���@�A��@�$5�J��x}����>S��, 2r�g����Uc
C퓹����a"ڨl9����D.�&�6�#.�+�Kj&D�oǀF9�-M�� ���4��.t����&�/,A�6-��Ke�g�35�!��0�24��X�DBeX�4��z��G�^t��P��A+�l–hHbڎ9�/a�s���d�8�'�?4�"�g�e5tb��WMo�W�c9��R)P�I�h���/��j�-�dr֪��)%||��|MTtŎ�	^5��;���^�K�L͐8�I{̕'m�Sh�M�`�x{���b����~��q�4��/VhW+�H7�����
v����¾��v���y�r����0t�����yx��\�����n�7����K;��$mx�U3E������9��!zV��3�ƥ�$h��z������=���P�yxY`��Ϝ1�ډkU���C����ݓ��W�n�ɞ�Y�VJ\nm��^���/���&"X��]���4�6)�7	��ǜ�q�H��Y+�+H��q�$G�$:D��Ϻ�9�
܎x�gxqD�3�>�<�z>����ۊ@��LŌ����3�h4(�m�>4۳���W`�gL��aœ���_�����i��W"�w-�<����	u�讴�0@�cq�h
�\}O��������7����i��?�'��^L�cc��4[�|�!��\�Cfa����Aػ��5y�a.�9�o��O�H���15��M�o˷��vǝ��y|.��X����c%�HȔ���L�b<��dm?娧L������j�#\��{Ŷ�u��-�ё��S���j'���DfJm#(��`N������h�@u�-���T
�~�I�����!PD���+v�x8]�<!6������9n�3�s��z�e��"f�%�R���3+�AVֽUC�VاM=����.\��]@L=$����R�E�G���:�Q��uƘ��ѩ��8ۺ�p�ߑ��e�GTu�#?������9X�'�>�ʁIv�yI �X^Es܁�[D��D����z�����D?���e�
+܆1�9a+��B�C�⪻<-���,��>E��4�h+��BQC���ˢ_���uʡ�g)�҇n$�����"2~m}�vjj[��k�
��e�)r�	�R"�����Ɓ���3������g�k�֐ii{*�
U�A*,��.(����PKEePQU�P�!pip/_vendor/resolvelib/structs.py�UMo�0��W����^l�m�a��K�E�ZɐԤ��>J��lg5r�E�||d��Y_���!�nX]f��}�w+�g�^��?��s�
�E�x�h���*�p��K%�~�Y�D���ݟ�8Y��Ot�<1m.�po��
�>�z������KB�Xq��8=�f��A�Q�7fq��8�B�K�[��V�Ie�
PfS:���B���z���	f`KVU��@p��M#�c��]�
1k!�퓶�U&��.�B�9:���Cy�ߖX?�,M����B��P-�q�q>�/|ΉH���8M4�-���ۀ2a�"�f�3~3F�l�^�/�:�N��C�d}���H���@���N=O��KT<+��&*�>
\lhXR�"�HuR^����M�y����$�}�ŌTj]gq�sŊ�"��S�-Ԟf��f2P����禃-f�%H`��s�o��
�D���1�v��zן4�T��Fe�n}7��f��Ye���Pբ�(��&�xm$�EL-�:�8��
bD}��As�R��@QʊT�K'N�WH��s�X�Є$�.��z��D��TS+��o���<_�PKEePQ)pip/_vendor/resolvelib/compat/__init__.pyPKEePQaT��S0pip/_vendor/resolvelib/compat/collections_abc.py��O�ɉ�W�U�V
N-,M�KNU���*)���R����\�������b�Ĥd��܂����Ԋ�ԂO��kQQ~v�PKEePQ!���pip/_vendor/toml/__init__.py}��n� ��<�������C�u���#<	02�S�~4i���������6 �<�������z�5'L���6'h>�J�/t��A��#�
8�aH���R�_&�F՞0b��;�>g��Q�>�ΐh���Rh[x�QO�HѦ��EyV�2ӑ6��չ��t#&є9�YYxuA옩NM�D�	��{�޺	azyu.'-݈�ڻp�}��D�2����L\���*��l���r��]n��Q��U{����М׹w��Nne�PKEePQ���C��pip/_vendor/toml/common.py]�A
�0�ὧx�E\�=F�S$Ƒ$�d�hO_ݴ���y|-L��^���j8�q�
OuU�T����X"%�jZ<�8A�!�3&F�mՆ��}j��:$U�*JU��Ru��t��K�HyJ�$��G	�=;#��m�H~&}�|PKEePQa#��� (�pip/_vendor/toml/decoder.py�=ks۶��+XvwHՒ�vz��Խ�m�����v�t�약ʢb����b'����xR���.f�Hpppp^88���h��y[l󓂿�ɺ��Q�D�ɦ(�&��
���<4'\yW즋C^��z�V�ʹ}'[����ޝ�k�?=�uST�(�U�M�>�f'�E�����2��ѧQY��͢_]���&�z����VX�ik�%�O��Y���E�Z��-okxONNV�:Z��6�i����K�?�	�c@/�|}s���U��S�����)ʦ�ʛ<ݍe���:�>�:X���e�����\b[46�f��͛�6���K��
d����G�/�Q�j��f��Ð{�Akc��ē���\�ŏ/��u�S����?V�j_���I~�����l����˟���ɫ����9rT>���;��q:?�|}�����1���/��_�1�5F"�l��!)�!GƥN��6{�(F��ìE(=�s���[D����	գ9Z�b�6�f=����q��n�ŪF#�mY�(�7ƾl��L��׌N�sU���P]�!�P�z]�+����C�P9y�G�b7|�mI�n��%�uUo�6%�1�d���1��=u��ٔ����c���j>�Ѱ�NJ8���Q���9�4�{����M�E�~��ߢr�]�8z{*%�6��m�e�pS�P̓��e�)ڇ��X�-�ۅ^�ౄ�g�.ć�gI�C�W�m^�D��Z����a�C�ARSP��đ�A�
�N
j&�W{���%Ɉ���TA�PGq�d��P�֧	�*a���A�m�U��<z@�<�_��֍ۚH��=#��<lЈ
�j�݉�qA?/���D��Y%��;�5���}��o	���$�J�2�D*i�����h-n���X!���@��Q�S��K��.�6*�yac%��π��$ɱ���a5�������邿���%���M���Ye�
�R8L�b�LA	&�Y��z��O�U}�h#$���g�:�t����>����;��b���N	�M��ҵP���LW}�cU��9��ψJ0��h
�����lؒ!���NV-�Xܾ�_7n�Y�~4��ۜ��j���(���!��><G�
��O ]��.��$�L�PVys��H�N��EiEv�5�u����C�r�?��#�AҘ�QHh�>���m.� ��F(�_��`�v �X�;� ��4�뗬jw^=��dF�I�ۼ�P�EH��~���nj�
4_�/�ʈ�j"�!�@_Ju��b^Ь��D�u��M�ާ�����ނ?s���g�n���58��>_I.;Q^�pך����j�L�*_u=ǡ�Q]&�v=�*!U�ؑWp�뛔~�"g�#!��y0����ktl]�[�'D��vf��Y]z�~���95F_�>4�k5%
7)>]��q��$��aE�=�v�<��"_�Te�!8.�/�Wn�q��Z+�1�>uP�ѻA��<e���3��$2;4K,�����#s�P���*T�+%x
5�I'��&u��l4���k�ow�â͖�u�p�64=�n����ύ���XF�:��w�OIo4)�Z|,�Fi��PG�;�IFi~Hh�y`�
�F,hS �fu�b��cV]!a��E�x��]�r��5�&_)�4��j݀6B.��\�?���C��L�z[����[-��Z&�=�n��l�\����_��fB��y�
�
a6}ֱ�E�r%�%�S-�$��c�t[5�d���A���?�\uFb��7EK��k���4AUpT
�xyԯn�u
��|C����P�"��hޙ���Is�`�j����iS��@@n�L�C�����fSH���D��w4N^)7Z7m*��hb����3�]��:�R<� ��~�dBh���&��Z!�n�y��b��5j��~2��wv�.��$���0�`OZ�3AP�����8sX�5*�FW��`
tѯj�ћͼ��
;�W���ϸ�L��x�Ʋ(��[��x���~m���b������������u��-/�����+1����B0@� A��X1�rd�۱���6���zX��j���5��n
&��ͯ��-E��%TR�8���,^y��Qlw���GGȳ&���a���SՔ`�8���c������S:-p�AEy\�!��v�PP"`��e�ՅR,��F�m0N2BB��H������G��B���	�^�z�
D�$�mpF� &S8��w\6k\<�5АK҄���[x����e0K��0�x�勹إc\�P'������Q?i�h/=�m˭�p��lr~=��ؤ�3�z�{��V�IQtA��nZ�3KꞬ7ct:ЎeNA^�0����?��%<���ym�F~�
4ߺpB���8�	vyX؆�z(�^�w�m���n	��;s�x��\�#\d،��rXQV�GN}C�k�9�hKV_=x��d��$޵k�u��83{�	�qQ�CϽ���î]��c:rA���eF��s4�)wFtTp6�7�-��Rt�U�Jj��<V�h䃤��e�ǒ>`ɏ%}���&jl��Z�}B.X�Xm[��:kA*�s�5@�`��
*�
T��@eo㮑;d�º��J��І'"+B>��B ��p�X9$��v��M�K�o�{��
�5���]�ShGm��1,rZ�i��=���:QI)�A�c����:���1f/=�e�@�
�?%	&!8gh,�B���V��<���e���㊼ּ����� ����I�8�EI�Q���ơ������!ATxf�
�a�������j&�s�72*��c�B�wͤ�����Uk1�ޡˮ�ot��ꦠ�\��Xz]����it��֪vH�z�3��NԔ�:������M��Vc-�?���6;�F��[��[4�7�_�	��c���E��MU��QϚi�����OI�27m�g���o0���ȡ
��9�
�[Q��=�3�-��`�X���Q�z�eȷ�|%��&�^�=�щޝ�y����O�22')����R��k�3R��C��n-%�ۤ���cB:��9���f=̠Ʊ�pK3���d��RP���b���~dr	��<�O(�!�h�{�����-��Z:[6��;�)�qt�|$m��9o2ջtն��a�q�}V�_�a�84���?�Eй��.GԮ��O�R#�r7FI�[���	��&�sw,r������;��e��{(b`���G�"l5�	�Gu�z@��{� ����'0�hP�Y�MZ�@��oX#/�$�t%.Z��{�Y��g-7h�����̝!2�<�ɵ��|��C<?�X8��5���^0pAOU��:��&W��f]�6Z\����I$�Z��h���@ٺk*�pH���R��0	;�jIX���ӿ�r�I:	���{�efZ�����̯xz��p�J���c_�pG%3���49�e�9ɴ�o�س��x�>;ΗE\U��3v��3��hw ILT��3�$1S�ѶK��L"�O	P�N�V͞P�^�Vo�<������t�q���9�(��F]�J�z��-�C��U���J��@[���rgo����5����k����3
��c��n4r)�[<Q��@xJ����(�n�����d92{�����AYhՊf�O���0�tQ�L�|�J~�%@��2iE���pBq)"2C�,1�e����p�	�`8����zd��ߴ<6 ��Vگ{̺�:�V���˲��H��.�)��Cx�'�
��}̤�%&l0��}��#�Y��!1w�xa���^���Y���@Y���۬�+��uO�#Q�������i��F��)3}d�Ţ�K?*�xW�␩Rr+�dz���x�g�O�>5C�݇13�� >c������'�Q��r�գ�>]?M?��}�0;��Wв�5$�f���A�.8�����ϟ�_�Vx��m�"�T�#�+m-
�}��g�R�=r�����x��c�{�����f0dp$�QL��2�^����&�m�AYl���J
,@a�ӹg����G�n� ���y6ᨋ�D::������mqSW
�\�T`�}���9al�翿v�,8�Zf�{cPX�3{P�uJA�䟁p�_2r���Yp
ؾ�j�?]Q
�=z��i���3�NӞ�w��`LwO����6l�-Z80泮�p.���ۼk7�n2�sF>��=�>�Y���ORp�f���W�Rj�R�sh��t$F�gtfz~}�Y�~�
m1�F�N��ز���-<G�v�M��&dK������.�k0�����0��nlJ�ҝ��9��4����ٗמe������H��6m����G�~~>;�����F�/g����Ic���3gO�:��%q
t�77�.o��8����Ma�:_��^5w��W���C�����Mǃ��1v(�"��qH�{�Q��{d2���H�̜D�(�y{�n�:���{>��g�0�DŽt�ߚϜ=�����k�A��02x�N���,O\5���D�� f��ף)�ⵙ%��rrv~���|��W_g��ľ�����?��,�\�����&�Q� �=�E�*S���-&��w{,O���h��ju� /^��e�~�2_-Hz�G�_�<5��5�Yu9��YH�.����=c"
���)�����Oᱠ�)ڸ�M��%Ek����%5�i�O�\�6Ep�m�߬0�W�M����	n�y��^�+K����1��_�池h��j�v��H������9��̳�82���E�{A�F�q+j��Wx�����Gw癒��
2��f>X ��?�r�6��s5�]�Ld��FZ��~�0�7E��_�:�ڽ@�t�T}�ͷ�����Ӆ�Ψw��LZY��8Z��h�Y1r4|5��1^RD��j~@�4n��5G$�
r��M�����N��P_��\�Xw0	��ھ���º��yv�
�.̣����VDC� x?`6lqc�<�	h�k �Uy�\ۤtIh4~Ik�� =�o`TW����U��t�
8Af o����4�Շ5${@'6�T�h�	>��E\.I���]�h7�'�j���B%G��J�t�x���}�
��۰��Wy��`��^��KjU��*}��ձ�C'3ת��R�a…�1҅!�F.�ޝ�f
Q��_���-��mGJ�8�ܷ�O'*�g�Q�g�ْ�.!I��t@��[z�d����F����w�ANLF���<�Y��u<�u�>q['$��.��°&�^j��C,��^�EO#��;t�C"��'��{���^�o�i�vO�Vt��
"S��"�E�q��=�Fq8��3���Nk����@3�P˝ÃI�n ��l�R����O<��̮�nQ�n��� =���O,�����7;���?��5�@��6�8=+o��)�z��x�XĄ�{�D�=�w�A9��ي�b�M�'�Ut�gj�Ɔ��𲘳����@k��-,`Ct�5D�qU�@ʫ��tR�n)��ޗ��/�td��5>��P��?vs��E9�v�9�M7P��i�wYQ[Z�%-�ؼh�3����'
]�.2	U�Ȗx=ɏS�H�:(���T�8-W~ES����_�}w3y�
�=,6��i��s��G�ӓ�ٟ�����'��l=< K��>��wm��i��_�#^�χ��n��.�},	�a�~hu�:H���.tw9�]��t����I��F��j�"������ސʏ�����?�e�l��
���@���_�G��rey�11Ɛ�6{�6;d�e�ߡ�#�飒z��R�����ɬ����;�8w$�,&*tD���V��|'OTur't
蕼�"�+���w}7��hd���k��Ǔ���k�i	�Qԉ^𵇢�q�%2�H���K5S�5��Q�� +S@���n�U�u��J��P�Bz1B�|>�9�p�vlS4��*Gt��ʹMϙ��ϾTh:\>�j-^dr���S�bN ���]ā��nƖ��&��8����sM�{̃E�h7�h��?��	��y��S���{��
�I/�"�9A����:���3]Z����֭lb@��l���u�y��.��LV��� M�)kwQ4�>N�)�b�a$Av&��8`L�[iov�o��o?�ޟ(���3<�͹}�t��\�h�E5+b"&�fE��m���M&O�N�f�����8b�F�H� nC�v���3�dp_���bZ3��I����O��Kin8�Z?S�����w�Ć
:�p���;��G�6�e��-/��yg*��4�΄��ȁ�����-�\������vN��#����N�
累`겓T�*��h����HK����Լ��s��~t*8�V�{}��LV��ɽ��<�ۿBP�y�=q��u�=D�1�I��1nn���XX��9~��q2�ޫ5�c;�DY�x�B�17�\�Wq�
^mu��(�)�|��ck�H�d�����1=A]JQ�l���ﴔ,��8��Qc�J
\�+���q{PWo]%#��qAT��;�A�S�'�;��~����[��U�9���[����$��>�1̞��X>,��@=��f�a RS����>s�j`��e�\�p�2CXcU��l��ן-���u����O9�B�`D��U4C:��w�Z�"z�- "2�!��4�V���w���I�<�r!ٺ[��J�0@|~<�}���+����5��]�f��alyQ7���w{s�`����1�hK�,Yէ�Ua�yj��:�@)���V����͈"
����?0��a�*�_0F�#J�����ՠU��?�8h
���_��#{��G^�+��/����+�]^W���co~��/h��P��6��U"�њ������}o��v^WA-�����4��k����P,t.���G�P�^ˁrȒ{u;�W�w?'��/K�D��c�]�J���n�
i�q[4���׸�����1��Ox��$��vR�)���C��U$�E�F�A珷T�H������0b�Q�
�T2�IQ�iu�=*���� D�k�Y�6��j5I_���h���0�_UDg��P`��Q�Y�����LL_G�W�)^�[��	�k�7d��3-U/�*ܬEꝓ�[�w�;�Y�n�66��M؊܁�,�=�Ȟ~�Ljv����Ia�̌Ne]t�>vc��1}A��'Y��%��_�}�pU#I-�QeF*7��%��-����"[ԅ���m�֦�y�ޘ��� �BS�ʗ7DD�{�G�}����gr�PU�[���)��Ƨ��T�
I$�zL��E�߆�ar��UG�HM^��:����s!���ĝs�����+m��~��^X�m��|�I��5B�jfʊ��ໞHFv�"SQ���w�;��$w[��ln�V۱G��4P9%,��лk�F�ځXQ�n��ϩ��ҋ�[�ީ$:��'���˞��{!��i��?��YY�
�y������i��Me�+��P��`=,��\��+�LJ��&�C�$��N3�������RA֣w��]���;�*�$6�bm���%��A\-���<Y���њ��^���j�����8��"5uA��v�N��QKn��M�zy{�f��0�􅥥s���$ZJ��\D�-ɣX�������
�ɱ<�l<S$
�ްڷ��QÑ�#��R�U��ű{��݄7��Ϻ��W�PU�� ��	�/�/CF[,7�'�ȕ��θ{��ocT��{!Loͥ�d�^r�ٙ_���߂.����V�����ԫpB�����#��)�;�0�����-"I!��of���;����@t^j���F�,t�6y�-G���/+�e����]Бfp(��jX��Џ�܊n�m�:/�j�Dv�\����E'a዁��$�K�v#�3|�K\�Mx�z^�UxZ��<+x�kr�����v��g��C�׎�?�}�4Ā���*�w��c1��Ψ��Ǥ�ǹhN�M��$|:��[�Dƒ�/l�y����Yc��:�kd �7�����N_O����5��PKEePQ�v*g�
�&pip/_vendor/toml/encoder.py�ko�8�O��$���mQ���n(�/����}�bщ62�R��\�~3CJ"i9Ns��!��y�pT�])UͲ��u��\?��W�P��J�X�7�.-�Y�N?��f���z�E&UR�]��̸j�?�"�"�*�w����-RN�\U��\l%{;gѫq<1�4"G
lΪZ�F��oY���H��v̸ ���#��T^��46,�JXʶy�G�N]W?r�~���8�!�����vƾt0B�QyYK��n�⬾�Eu#�"cW䕊g��t�.�������K��T�m��F
д�Թ�&��E	��"�h����F	K�_iq�4-&	��J�"�eI[��K�[�.J�^)	��v�K�C}��h* �
��m��beZUF]�&
��f��ҳPȲg��
�])�m{|輑���he]a4��`�5�ae�Q��Xf��놑�j��!�rQz�����
M�}�+;.//Kp���۷o�S쨃�F�9��-'I��4���C�j���p��,H�O�Wu��6�����Ag�O�&��$>,m9��
z�e>^-�6��R��I��`�C"�A�Ʒx0�f����w$��zS��Y���i�a�@�cVq:� tRpݮc�Al�r6�I�X��5�%��ȳH�+ڸ��3��E5+�<k1�JLai �;�U��c� =�����g1uI9J�L�����j�����~��C
4x�T�X,:���|��5ߕ�ú�JŎ~pEv�H'=y�r��0?V]8�#ߐ?�E�r�Td�[k	LJfR��������_ Ɨb)�C$7�*8t_���Yg�3���]�N����q:�Q���K��$]��������EĮ3F,]l��嵊��C��7��n�*�|�B�G�z#�r(
)D=�E˙{�foڮ(l���o��_�	�R���[���9�8gaz$ә�x]�c#kN�����������6T��;pa���t5��k�xY��h�\���C�|���\�� FY�5b�D��
.�
�-��s@�L�Gݼ��ܨq�C+dF��Y@b�ۋ��˜}`�a�n�����Iu[�{�W���}��C���0X��<.���u��l#�t�A]
Zz��vS
�̙c�9$A�,����Eŏ�5���Y�9C��V����#3��i��0����-dZwgˠ�>	��m���g��~؋�8	\�8u��z#�ۊ�^�Sԝ��0B퓼�F(��������|�v�*a����m T�+�2��M���)Y�֐���X�&oV��nB�*���iT�P^��P����%��Ϙ��?r����Sptl��6!H0
}�[-"�?]�Fl*����Z�.w��=G����Y�م�����"�]e)�ϺP�X)�(vᡝ����.��̎Gw�ˏ@�x�p��>���������a|��&Շ�#\�r�P>���Jh� ����s�	���hz�E�5��7X�n���e�ub�=��Q�X�ǁ�1W�/u[�ys������^(~iC^#0B@��QlW��T�1�a5�i���2��O�8@V͕����M]���믯��6W	���I��k��FI5�Y��z��� ��6�� �Y݆�aL���A*93��=�[p��1'0��h�	��s콏��m��%Yt�F�R�E|,P>��P�ҡa����
�v���yˏ�6T�S�����A�ۦd��5=��Pꇲw�N-±"�V�k";ƶ�[S��O(	8H�C�_G9-В+K��� �^�#��x�*&Kv��?��6l��ؿ�Ą��`�!㚺���������<�xp
�ڮ��O�_i%�+���Цi���	��T��ဩ7kJ��ٙ[�f�C�cg~��#�P�2��&R��&�����O�������t3(�ad�i��餳�����ƀڎ�q�Y:���#7%�v�À�ң�>&��jEw�Y�P3�44_;�G���1v{��>8���jLw����NW:���n�
G4�!̤
��㰾���Q��$~��Izz�''�]v,}�XC�i�TSp�t�+�	��oN�z��ѻ,����T�?����Q0�ϒY_
�C�
�i�D��'��L��OTCkъ����x3�M�t�(�L_ceOJ�.���^�v)̮�Ǖ3�]h�n�b�c�X/
�R��y���L��ݛ]j����ٚ�m<���oZ����s�~�Ӻ��i�"
2n)�νB;�h{�)ڛ���I�
��BSGɏ�Lqґ[�+,����P�_y�������!�ߐ�À9(� �c���F���k�2��"��g��5��f�\��lY/�R��>����(�,^ԤP�X�Bז���I��0�E��D8p�]����/���d�U=���J
���S!��x�Z��au9�a�݄41���
�X��j�t+b�����I�lf^7$�o�E9p�l�O?L��(ʄn�oV�0C'1^��R�7��#F&�.�:p
E�E(Z*�w_�4|W�_�# ^2��o�n�ų��#��A2�)�=Ra\)�X6;4�}�J���'�fi}S�W�lE襆���^��tz�ԛ(�oѫ1{�o�o-�w���F��}yi��_�Q١A��_��_{��{ͱS�-K!@�/PKEePQ�W�Օzpip/_vendor/toml/ordered.py���
!�w�"����:w��FԈ�>s�]q(tj�����p�!�i�S3��b��]�iʭL�Y㋒��p�w�ɰ��6P)�v�����J��%�>��8U
N�W}f1��F�KO�!���!��=�4$��oPKEePQ��jpip/_vendor/toml/tz.py���j�0��~
�Kӵ;r�+d��bB#o���� O?�
���NG���_��w����A���y�Un��aO-c�Է!@�Lߌ�E����P���j��ثF�tJ�I�J����;_�S%�Q��g�	Q	�g����E�Z�C����qL�6��y
�+��
>DZ[*nزz:nW��v �y�^"2�H�m
N!vyvi��[��aw�{1��Һ3%�a���|\����~}uLf���,�Ŗ�PKEePQ}o��2{
pip/_vendor/urllib3/__init__.py�V[o�6~ׯ8P�*۰����$@��=
�tds�H�����!)Zr�X���wn���y�|�\�z��5W����k˕�^)���l@�3$�YN��VTU��XU��^ilc�p�(g�zϴ�P�ŸrJ�3��z��`Y�etO��Sx��*�#!',�Zc�=�hh��^{p��j�ꜰ�g�V��]�,�}a�l�:���Q���V_���{i*&Bh4=��>����Y.��é��=c��u�6s7N.[�Վ���-�P��:��y�����,{Oh����$@���/|GԹU�^o Te��l��R˴�18�LH���	q㳬���;��77���F�+*H������ٱoj_J�ENq��HӋ��k�{�9y*��?���!�A�Ȁ~�Sv����t�4[�A5[�!m6�€�0n#��i*ci���s���0;�n�F`�ƞ�o99$�$yί�;�/i�,7XR��P䢪$�h�EI
��\�6�((,#.�I��/(n�������:&�s�ߡ��4|q�~��	��,ݧ�nb��!D�>l������Y� �"��&�$
��#<��Q!��rG����)7�!KB!SUq�mU���-4����CJkZ�F�K�-�sK�i����%XEzV?�b=�?b�l"8��&ϣy-��J��O��֯e�4�ł��_��EܛO����
�Ŭ�9�4GfJ���D�#S��"�m��H�sw(�_�����a��9��,�@&��%QR_ �"�0�ǁZ7�sƾ��f}O+����3�]j�LtU�Q[����3;�D#/-�_CX�\�.�����n���٨)�:�*�"�$�kꃛ.�
�Z�F��+��v�;N�L��``�@�-l�t���p�
�`���Eh��Y��]��߬��§u��Ϸ�>�ا��\�J�'��7ҏ�����{��T'����Mu4���ь7h�H����%{�gĞV����̧sz���/i�8�����?�}�9��/Ģf�J73(�T� ߿�1�`�Z���y���CG�b��_PKEePQĸ;;�(*#pip/_vendor/urllib3/_collections.py�Zko�6��_A8Xnma�Φ����E�
Z�6��)?���璔DJ���?$�E^�=�қ�ز�jS���۲�4�kUd�+���LWNj3�׆6$E��D�"W1_'ͮ�xY�v�~�5_g�}>�D���3���������	}W	��fۇ��~�0�����MQm�����\8���uf�'W�ҳ�+hJ�ZT�U�D��u�Ub�Y�Aj�z��JKa��xV㭮x"�<��v���~�RQ��[�h�&���k��8C��CDQ�U%N�B�J�u"݋���w�/���+��Z�,�c,���H ~v�U���5���&s6��ӧ���grM�~������<��+��1"Qhi���db�����L���P|#X����Џ��w2�c[|�/�K�C��f�J�)nn	KK3A�=9��#>	�	��rl.j�i7�ű��>�ؚ����2�ugʟ�An�-����f)3��-�+�ېR*UY(��̓��w;Q�M���d�-���T6]\x
��;on|�������&i��%ސ+:5�%Lx+�[��ļimw�)��dz�e�S����y ���"����x�V��{>�	`���G�s���������Xg��ܶ�� ���)<������@@�	h)D��R��df�Z�)9�yKVC����-���w+aR0_�Ŋˢ���`mo�\c/������/�J;g�k:����\�&�$	2r��\gGK�j� �&}Yz���N���#����"ë��I*1��z�۰=�4�j�"".�pNK��N�;�d�V�9�UX�U��*ƚm̮ŭ�s���)�
��QO�{�M�nz��Z�|�������-ϔ�u������p�*rJ^hk����D��-ىx;�\'d�qrR��8r
{!�)]̍�1Ȟ�X��R	�
�c��H
Љ�3&ﰛ�S�j��(՛�7uN���]���Ɠ���K���D�s����B`2UE�5���c)��o�ؐ*K���:`2P���-�_dq�D�A2wl��q� ��W|���
��s�PRܙ�0oLگh#%��Y����\V*G֢Xv,�m�i	���YηBu�U�b����lE̕�rg��W�>7i*�]y6��4���[3���2��`o�@5=XH&U��(���՜r�v�0�n�BJl'�!^�q&y�c[C���K���W�c�E`�@Xr�
Җ`K������'�V�T�
���Ĺ��j5$WG}0!���ʤ��n�a�sͳ��\�9�t�[�N��R��-��([Z>ut���3K�[4+��tB�ˤgD<�y���Z8���(J'-�q�{N���1I�!�
�g�c�Uu+CP:�q���Ĩ�OL�D,Ç�7�b+,,^[RY��c���M�!k��s�_B�FӏB/.��^��M7E�\�j��bXy�������p�����,,P_n�ݔ0���p���>5��ӆ�9k�w]:�?:�v���#��Q0pξ��&��%z�Pus�/gqK���t�u!�:���0�=d��3rX���-���8{����"$�����z`�8@��p���������As``�=�>#?�j�\wx��S��&�����z�Ҁ!�8�*�Ջ��/�x�d��
�)Ǎ��RT��OO|n)�*�G�%/�ά�7���I6��+�u�<�(��F����A(Kzd�sئ[`��*�:E���-3S����	ክ�nE�fl����O�04�@�j��u�%%X#Y�8��<�����J��N��A)!���'����,���+�h�]ӱN��f�j��/9��� ��
��"?���r���y��@(�s��+긼T��8���Q�G��[۠]���[�f�9���07���8N!�O�* ��mc�w��o2��@E#��ҠF|�nr�E{�~G�T���q��ϫ�\�È������R�Ɵ�
�PjZ�fTVrG�Ȫ#P����	R�5-�x�A5X�-������^��$��w4y�M@�"떵����w�fLҍ|�|�QϠ�:��\�Yن��hu,�9ݑ����5��7�!7D���*M��lj�����i�����4:4ˎ(暙����B(8���X�u��#�:���Ʀ���IJ�n�a��z�3���㫮%N;�L�8
�`e�<��g�M���Q�q����v�`�|�=���N�Jx<�5G�CC6�/�l��.w@?�/9g�Z6�-Gk�t���b,K�fd��!`�>���Q���S�-�ި��2Ϗ�8S�nMao?l�M�K�
�)3���+�mw�>�M�I�^?ߎ+�m;Wl��n���ݠ��^�=�b�X� ���ʐrZ�1��1�l�n�� �6���pΫ��J����}6�����(D�ݧ�"���KO�FJC�u�s0X�z�w��ŕ^��6�x�q��p�;�=����"�
{>����P�Q����_�vX�$��9�8��)�E������y>�rEՀ�Qhє���pG�V�v��vWީg[�%"��)'�H�~p�U��9ޙ�1�-�W�E�q�U{E��5�9�OȆ��f"��Z�K<e�i]frmV�\]�t�k���"h|�����'�y��j��>��+Q���][�LE��lž��k٠j��jn�a/���b��:�+l+o�q��-d��v4��#)�}[����N��;s�Z��ך���C�dH�'�8���D»�.��N�"aK<�=�e��;�K��vZ,�m
9��;s=L��ȓ�6-N
���,œ �=��=�b�@564[��C�z��dq!)m�	�0�Z}��_"o+�����iԄ�Nw����7w7[�Q�-1r��KKQ�(�o�l|,a�pX���
2o�5����ði-���7�FD�zJN��6y��8%���;֣%6�Hs��Ot����J,�/�*����]x;�<B�S{�|�Fi{a�븣ˤfc�V�M����2�E��ڔM�%��']lv	��:�"���-\�ы !�dI�Ҋ@r�0#��͝Fiw�M�������콇=�B�_~�H]O*TRɵ��ΐ"��rAwS��e�7g.��&��]�c���j�A�F��
r!��v��U�-���%�7��k�ORǣmK�jm�4��]����5��Ɛ��LQ�$�F	�ߎ����a�e�/^\�.���/z{�fpL�u�T�2�
٠W�R�/T6,D��&p�!����ͩ�F{���ʥ�k��PKEePQt�!�'}8!pip/_vendor/urllib3/connection.py�;�w㶑��@���T"3�u��zzW��&~q쭭d_o��)�XS�+�m���� �r6����[S 03��@k)v,��uUKE,ەBV,^)������>�qūl�|��f��U(��Drϫ���g��K)$����~�2*�_�o�)
1,��>�pe����&��p'>�Ӷ��(�3^4D|�\�;E��*b���_
m�𒀱'�?�3�����Q%3;�2�y�Y�e����=b�P����!V^[��C�u�	.h���iU�lB���.�����U�$[gɌ]	�
��D�5�$���0����dF��S�̑���C��]����A~�(�lϟI��4��j�)V	��Y��r��U,���<������X^\4����Xgi�Ⱦ�Թ���W@���k�RkT�yq[��
/N�
�|�uؼ:���pI3<�)�ʣ]\%�h+T����Sv�e�r��؝�U�#����Q�"�RSo|�R�.�`�\�\�2+*=�H�Z�y�z%����y�@�2.#m��=�*KPҚ�y`�\)�¾�q��y�T���	�}�
�.�� ��Q�p]�:D*�r`ܜ�}��;��7ϧ��|y���ϣ��~�RG�I��.��i���5GW����[�6uK��q�pd��+�l^""`g9�;�P���o���U``���$��D������lq���O�؇��!>/���z�^�?�stv}�<�����������ӛ��I&�r��/'�y�oO���_������'_�';=���c��6��z�;��fc5������
Ɓ/�Cj���V�!���Ƙ�F�{ݠㅧ����)+G!��wސ�R|�R%��I���J�I�PV`fVRu�|��l�,�\�0�=�9(IY���
�^N��!�8g���2E���|XҬ
��:�����V�B$�t�N�?܃�I^�|62.���v���f�k�IER�@qb����gw�D�U)D�a�;�s�Z&<'�Ai<��o�y�@o=��nȂCG	�Z-8��G�V]����0dk�1fO�8�h|x��q�W��o�2r)ww�>C33�R��,�Z^+�f*^��68��MΟ�|#$��˳w������O(�`�E����n`ŷ�S�*�pG
�E���<z�fQC�����*爆}�y�N��x��",A6��2aڀE0�l����f�!~>�3�K��[���������w��5C�w�Ż�ˋ虦��-�R� �+�j�so3lu �QОw%�i� ��pNA�>��M��M���(�̙>�p`�y2c�q_Ā݀
�d@h������:�4p���yu�;g�
XC1�,����Q2��hZ�0I��$m��7����K���q�x�5(
�"���;_O���(����ə2c�����˙'�}X�2k5�R�9i���'
��s2a31��K��B��ދ�yƖ䡨�,6� EY�w���8�f�
�]��,�w5Ү�ۑk���������N8�^�{ �II��i�#8G��
� �0�2[A�Jr�s�̀QRg,V*T�*�"%jTKg�f���qg���8�b��j xVQ<���%`.2������p�S�ZkS�y�0F�j[+�	R��R-͖��0��o���i�kB����Z����
H̚ɛ�a��"�i��_����4����[��k곙*G�O`�ࣀW9�9���I|����̅��K�GK��-�D������%���%�t���;�@�x,�]Q	�Ɍi�Ă��Q��0�H�0q�Q����"��l�8PB�&K�p`]0�@��4���� 9D���r��#��0'P��p�T���G'R(e�
]o$�Q�D�.�TT5	-T򪖅�QZ(*�B��<Kh}��iX�9���˗#N�V;����;f}����R��b�I-���L"�T�w6U~#9
@
Wj�ڐ�2R��C���!�;�#c�n
���3Ug�0�|��G&68��z�[����cO\���
�r��%�HNj�%8�A�0�T�D�{�[v#�@X�#�]��#?b;��z4�
Gǡ{!́Л��� `��	�NhG�����	��&��t1,Zb=(Nx5=$�������@�OYYot씥`�Ouk��|[`vj���j2�xj6��������v��W>��~S�����.�='c]�q{�iƝ�
�Kɡ��)Ni�c��r�qR�o������%[0{��&�&0xâ�Rs�W�!�Doep��i6{����-�ϯg�m���d��D��|��D/
�t`�Ϳ�}t����X��XoH�
�>��� G�z�2ـ�z:c����N|�"Ѵ�˺21̰Og�S
^��O����T
�嶈ՙ����	T�p�:�4�+ZZ;��?b,8����uF��2[�������dK����=�,XS�!*��U�а%[�M���2�L~�V�e���w+'�(J�uy���Hs�)�R�U�;��J�4�����Vt���@G�@-p�aΣ��	��|��x��T��>R����*��
�᷉�t�yԶ�{bJ^�����geS�-jȘ��:�Cc���Z�c��k΢hՊ��'�!Z�C����yjඛ��N�crA��0�D\g�Փo�g`c��Zs鰨�*�"x�xi�/�r�F�Gd`/u!Mr��A	�(����C�QW�m�G�З,X�6����3��!v��2�B����9��}�(���W��
�����������,�6@)A#r�oHB���oƓނ�0�o�C�4��������!D��:�	��#h����.hh�hܟ�IN�ץ�+�c(@���| w��/6�QD�!����g�:��6�������Ξ��`LGwCcQ��Ḋ�q����y'�^o�cJ��R��|������ �yg8ш{�8��x��y����A�L��i���N/�����.�����Kpœ\v�S��v�b��/���x�N��Ȓ��]�i.@̝���5�g9��E��Ohx��l��0,;
����-_�E��k�(��F\û���I<�2��m���w�"�:|nr*���m�Q�@#ck�'h���-|�](��ɫ��m?��HDN1���Us(��r������Ǝ?_���w����ʾCE?q�
�
�Ց�o�U�i����T7sV(�<��ܪ{�흃���p��	6�[�g�z����gyn�Pg��%�����fqn��s%�ڥ؈>3:���1kEî�����4�H��UKi֡��l4�ǂ�f&�r4M�ve��b }}T�G�9��s*.���w:�
s;#����������
��2��!(�+��d�	�����c�t�v��b�� �G+��/��]�{���\��/��h���(�%t�Ck��@��L���m��m�s��W�eZ�� 8����Z{L�Ū>=0��NTP[�z�OvW��4�e6��w��qb���K��D��ީ�T��N$���i|&쿘s��%�Y�Sa/���0�?��6����*�!Y�	^��$�Ϟ��@�����*TLG��ӵG}�U�WMB��W���I��<piЃ��{������%�rI��&y��m�V�di��l^6��^���82��}������s�ot��Rg>p�1h@��Ʒ�[?���xO�ɥ;{�NqC�`�tž��<��Įo��
F��g��6�'�>��y���7���H�^�@�]��o���_z���t!č��[���F�Ϙ���;k@uzs����c廬qk"��ht��	��&�Q&Pu�����9F_I ���K�)����da=8m-�K�:mq�Ikp�
]����COpӎ%�Uu�{g�S�{׋IX���~����~���ĉW�J�%�����%�����=o|$��4�'���e���/�S]su}��
�K�ZMwY&BBE�x�[=�b���{��y�-�����=<�����f��90�`����gyykN�S�O��q��n
�[�Em�f`O��K
�A��`���GC�%O�=sO�=�…	��>�w��Lz�����gx?c�?�M +A��W��|�wS��������1���G��q��o�. /֙��-�_�+�Z��+u���0w%!b��gP�G�����Akoޞ��o^�1���̾�j	J��;�_�k�f��Q_���?Âԧ`'Y����&XV���1~B?~�����t#@e��P�������e/2w���x��p��d���Q�wpS$�
�Z��;����ݟ�t.1�b��9�J�i������<�E�B�`�D
��~pv��}j�s�3�B�Cr}
���1����o�Wj�!���X?��
T�2Nw�M�6����7�Ӽ#"@��.��5{;����c�gno^�?��쌌�PKEePQ��@a&��%pip/_vendor/urllib3/connectionpool.py�=io�ȕ�+�2�ze��$3kDt�=3F��>2XL-�$���H�� ��uW����!B�-��WU�^��W]��������ϳj�k�>+�d[����#uYt]��u�^W�Z��{���]w���
��vy-���h����{�|�?�Y_mE;��`���#1��b�Wm#5��Q��u+E��mk�K�vm�.�K�]��}/�Rto�N�����o�f-J���vY��\ԃp��*>�}�����~��9W߿��_6R,a�މ�
B�?0���kq��m���g&
U�by]��̥��ۢ_n��QSl���s�ժ�	�L�'u3Y}�`V��m{c���Z-͐�E¯�\.7b+x/��vo�0����Ե���?��/��M�x��/�����[c�c��*D���-�i#w@uu�����s�:1�J���yٵ��(�G����竪�]++|�o돣�q�!���(���{Wo?u_o>����*�axHH�Q�Q̡����̛��u�wA�q�WT3�,�R���vI�k�)��j�7��ѧwe6��|���\W,*�/����9�|>9:���b�{h�^��e��3d�<Zր�̒����9
}4�ʸ�
\]g
��99����sj|��}2�Yє~��A�����9��<�^3\�v'��$+[���-�3�NtK����}|w)5��Mc�d6H��Vپ:���Ft�9��Î�ɇ[j`��`��03��x�6���*?�%\s�b2�j�~>KQ���q��|�xq��^�OWT�b1�^��<�;�$���&G�Y�0������<�ˌ��|�"a���no�<�v��M˝��;5qg������F$�b��S�x�MFكl��w��.���Lm��/XDq�7���	�9v��n�Z]�r�P�K���܏�A!�o���o��S^���ìzUUԙUѓvd�C0�si�`ڴ�SE��]I���dqU�`6���I0;ذ�D>l`����MF�l����:��A�4yۭϖ����WEqU|�䱸Z>:{Y]�����'�}r4���0�9)b�3�A��g�=�|=�ԯ�||��/�<��?a4̔b.3�N����˩,V"dl��`�1%3��A"�`ۡ*�|��'z��aZ�X��<�D�M��Ux�j�ր���ZWW]��@���x���3�@&����r�ސ�~dFc����F۷Z:�y^�`$��}_�|Y5D�W�yT�<�N�����-4!�k���`�UI�:{�?B>�8�>�sp��H���MS�۶��o��D�ٓ��M]/A�Vk�Իn��G��G,x6
��P!�*,Y؊ETSV7U9��U��(�Y����1���T�9P�$�Z��$"�B��65�PЃ��j�%ԕ�!^@�S�`�>�P��+ԘA�f[@����9]Ò7����Z3T��y�l��āAC �a��X6�t�	���c�D�����#�k6�Zl�O�]���
:�ɺLV7� ��o"_��,�^�4�F�=������-�aUO���@B&z���{�>+�D��S�hn+`�0�%���,%`k�7P!��8�ג���F�أ�{���XL���x>t�iiD<��Ba�q���;��7�~�@�i�	�!�\�U��hʋ������c
F
����D-
Z-�
���
t@�Z�#H��Xq9�Ewp����٦�4of��_)Ž7EPY���v��A�[�-Q��Y:ґ-|���e=�Lna�$��|hj°�u!����0�e��{�W��*��J�NaU���P�g|�GՃ,��;�GV#\�:���oFWAi~	Jڦ�R0�PYu��z?%>SBUNDL]ox�nꟜ���n1J�fa�tI�n�S���w��v�?c���Ç�z~}댰,�bQ`�/3
���1����PN���\[�p����e5�>Ǧ�?�?b��6���G��m�oMo���n��XI�1����L	���ŷ�>��0�p��������ܳ�q�����s�͂�L�ɋ�4Ct�Q�+��19q6��GOp����HD}�w�QZIMc�٩��L|cU�#3}?G�bNj�~v�W8D��H	l_us�L�c0|۩��߶@Է�q2
f�]�cE��K�mY�`����J'���7m�P���O�8�E%
N�)
�L����-�tj�'��zG�"�T��Q+�##g����e��|7�dRL�|��9;�x#�@d8�9��@�l7t;0Pe�O��sW|βGq#w��js�
�M\��gu�]4d
�.ֵ8A�r�v �4|ha�\��i�Ao1hI��XoA�����?�E�{�io��ܚ�ڬ(Q���TZ6������N��5����B�4Z 5�49�x�=�U�i��O�W�����<
ʅQ2&��R�&�?g�cӢn�9��؛�,Ȏ���6�������<S�t�h�K
s��T��9pZG��x�=��tD"�����R�eZZ �5c�����a���]�p���)76p�}�.LP+�H�+��q�٫?T��*≼Q�5�o���a~����~edg�f�dT-$��*�_��x���1��s�l��{e�?�-*T	W-+�H���qL����`�bYo_����_��A�
�F�>�ļ�n[؅�j�C�H���K���Q���c%�%�XT�g=�!X��>G~e����'h�T�7z��"���V��d<�Ҝ?0u�n}���V��N�����k�
���ی�A�mEGT\��fC�������7�u=��O0�:A��!i$yW._���-R	r
Q��4���^��^��)+�n��A��Ф�ѿ1^
���G�֋���j������O"����jH@��
�R};�@{<�f�%ī~�
X��>A�2��г�e���}��~��kж;Jv�Q6nB�0�%�`���Q��'���$j�n�G�ő#�]y��׃Usy�����U�t�>b9�&6�q�%g��ˡ�9�
�S�_ÕC������gf��ɚ�Zd-|!�rӢFo���%�st�3%Y��%]�{4�<������{�&7P��j<�I'�8Rn ���}Z'��T�-��q&&�
��U}�Z���S�"<ԤoD�f[�XB�)�"��C~ȇ@��DE1Ĵ��4F[]�p�
��}_4 �@�1/��39D���$�������9,��#B��Nl�)/#��<dı�6<��u�����R	h������aSނ):�
���PR���$�Q���mzTǰ�LJ���%�X���G6�t_y���}/�M�
&05�d�;����5ʑ��Ĉ|:�l��h{�;:��DQC`fc�F
��G�@U�l������b��i$D�|�s��v6�UUW�~�3�LW)��K��^Z5RƂu]7�0G�)z�K��*o�@�{��G�����	k�3�0>�xh^_�6̂��H�Me��ite�h�Ɲ��Z�I)ބ=p3y/8�_\��r�W��8��&�K�D1�)�8�1Ž8OdIH\b�*.(F�M��z�DB��9P�H#��(�?b������](}N�޵RVhe��$#����/�C��u������8k�u�.�F���lYC��E�r٠J�Z�����x���WO\�FU敘�;��8��;�`:�&���x�	�~SD��I�U��_�z���B��Aƺ˖��>#�i>����\�Ry��Z��&\,:�[GP���\����ϔ
��Ҵ����N�����=f���z�tmܙ����g�(��r(��R
/�ր麺Z\/@�G�P�Q,�\�(��,��t�d�4���%.�*�Mb�A��p������i�nE�@���i.FD&�%�F��}��P=�=�=�%X,JH��N%�p��eUv�i�!�8I����'O�^�9k����?a.#�UR^���M��&���#焫<P8����Y�p�\�Nb��"��j~4��i<����;
;04��w��l4dy�d�lsyC1�3|K�y[�X��M�{L2���-�9��3U�%��pn�`r���(�iBwo�==��f]��L9C�H	a���e���.p3d�T=�L�#�<֠�&F�a։)'��w`%8���Ei�AZ�]�����@{"-P�+�K����=� 9�x�Q9䖘
����Ǭh�h��`�-�`� �7��ST� )�<���ZC
��'k�C�/�'���ᆰ
~�X]��.�y.��O;��ρ�RYNUe.1խM�Oߘ���e󺡜�"������c6�RT7B-��� ���.����j�.��rҰZ���S�0rW2z�25#��7C�O�'U��������Vr>�U��UcAywa�^$&�ޑAN�7��a��rZ�+x���Ɯ����U����Zd�5���~��S�n+�deu�^�GX�5琡�Z�4,�ai��ņ�D���%z)-��u7��"�DOZ��`D�$��;��\ߚ��hηe�� �F����Á���	�$�̱�"�#�s���5mލ;B�e�
x�L]Uj��w����F�h�&��vf��l���uLm�K�߈�6;f�o�G�T;W����8Ga�mQլ�S&��#}�b�s�������!�6��E.U�j�G��'Q�)ěc�{��h��&�������i�O�P���:�}��I2r)���^(��r�y����4j�r΁�(�/�Q���A�p�Ҋ��.�`"̣�{"\h~?����
�E���\�f�C��׈=v�,������N�7�]��֤g;;n�������/<��Үy
(�V��o�1�W%{��0D�jU8�՞��I-�|q
���XB0�K�C��
�1Eޫ�O�9�(�I*7ylf2�*����?)�n��W�}P�D�a�m�5QjX�(j���ewAHv���c�S���cT��B�E����
%�'-��2L����Np�z�˕4.�9L=g�V����.��@�-����
�ã�g-L>�
�Ϭ�KL�hA{j��ƾ\�=���ō��4�[����K��`�cJ�����ߣH�HDè�
�A��d��K��8gh�m*��15u�9_]�y?�,�&�
����$A����W{[��g/L!�ΣPSK�ȹ@�*/�߁����[�l�҈`�{O����gt��F��/�]o����<�ּ����E+[�ً=�����o�_�O+z ����>�p�I��Xc��������G�O��|�E�(���I4�6�t��>.t"�����]��:�BX���=je�^�i���Ȉ�ihචI��[�RO��O���{�A�\�"'8}��(��و;�v+��4�k��j);]?�C`@�:��K���h�q<�l
?�U�k��)*�e�?�ڝ�RD��ޢ�����bY8^�#�Q�Z,M��P�9�����r��{��C��=x#�q,�d�T����&e�*?3I:���9pvƐ4:�d&�XN���"�8
D,�lZU&gz֡[�=�����Y�%�U�^��s��Q�������n�1!+��y�����x#�h���A_��2�ps˺�t2X*�1a���=�u�:�֧���<���bz��'lW�5���A2{����{���飧x�+���I�]`�����BW�!�2�����G����m<�PO�&�3��%��N��
���:�|���B�L]t�2@�^�G8�"[�8���q��D5=�۞%#q���
�j��8�/7ƺa}�Ȕ6zW�Bz�����@׶ػu�c����xo<W��$l�Y��>��d&i����q,�q�|�C	�8����س�뢁0�K�B�p�Um-�6JI@���Vm���U٢9+2i��Vq*��(�@�����LF�L�B�k/H���,�I\���E%�
^
</�5�R�'Ykh}zP"Ց����ީ@'���P�\�]�H=����ѦL�e�b��'@m�OYN9_�xGk�8턷&�]z���'�N���'��~J�
�W�R����E��@�N=��]��U�JHg/�#���R4Ҕ�ه�gsʾbܝ[̭�9�!�"��X��<ߪ��X��\�OQ�S�uа����p����0q�%Q�e%.��ܶ<���>��XM.:|/7���]�j�������b1�C
�l�����g[ʴ�y
J�t�9?T����oZ�O�Xm�,{a��]��J)�r�p���*�i�@�)�R����y3��8�f�����i1��M9
6�HmJ/����(�ݮCƸ�h����w�Ҩ����	����[_���%�095Q�升H���,8i�^^W4a��<A=btl��Gs�+�%	�H���b��Ƒ�3���"�c��iR��.Q��(3y@ʙ��:<+S�+y�n��"ُT-0�&�ԫ<Π0�O
j�=�W6];��)�)&Cc*��t=�hn���E��Nn�,I�Е;S�*JL�52KM��σ�r�Y/5�2�dǒ��ȘM)����~�8���O���[�l�{�>$]�
W��ݞ)�e�\yp��ܝ�.v��ٻ��J)�.�h�#�t6p�::e
�3
��v�r�5��CLl�x��a�6mS����*c���cʱ�� �j�C+a��{�$���^f���F8��q��9"� �A�����I3y5Ϻb�2\��G"����D�����FTs=fWPQa��R�?6	Rdܩ]��F���v;��������x��(��A�J����G�VqB2�X�hP
��{tH!�9"����`��}��9�{L�i�Ҕ�sY-r��Y�@M&��{g�i��J�����1ޜ�&w��Y%|�X��/ͫ%d:�϶�]�6\�mr=��	��>�5�L�^�51'dgD�N���1��^�(�,�;���=�B-N�
��:9\״2^�g����Ȉ��Y�ތ���l�D'�	��q��Fp#j�n�>(*��s��s'�`&�R�n�>�6�q.��k_d̳uƑ6�L�v>hǴ
��d(�gx�8���UVS��wOU����z����+�������a�W9``l�L
"�0e��Hz����G:A��~����h���fE�'�qj��q'Tin;�4��'����YA1�&�;dV��yv�g��:��
��A�՟�����[�k�U���E]Y��M|.��2g)/��	��<�A�-�e��CFR�M���n�?����}_��F�����wZ�jx�����x���!�Q����&?m��3Q�~���z�@.��Sk3��*s�����p��I,�p��'�a�o���!~+���,�{�/L�������΅��9H�/�G[�f��W�����L6:	-�	��4fG^���0avnyP&4(Ǩ!����\'�'?>��=Ew.kа�S�n[�k�GPN�dJ��X�wX���!��Z�L���qV��e�]����E��U��D�բ��~&��	��E�-X�%�O���yBsu0e��y��*��55Ex�:�N�=��lbV	x`���@z��5[�9$�VIU�˕�tZʡ�]�b��j���Ʉ�H��9h��I"��I�u�:6���¥S���e�|�k\t6�b��kƘT:�>�%P�5�F�@��>+�E��w�19@q@���L'@�x�Z�g|�;Q�_/�.�{���9��"�N���Ɠ��<�ѝЙ�Y##���SffjNJ���M�J��_��
�q������+�Z������s�Y���£�c/�5���D]RO=���2f�軋#��$�v�����#0��+��E^nGܳ=�T���<�`aǪ�Pb*�>�)ٲ�<5W܄~����{"{�xNRx���D�Ɯ
ƳB��@f��0�Ph
����_������g����|��&�ߚ��X�s�g���<�)$S������c���B�Y��ҋF����]�`�M%�݅����O���Z��P݆��:U�3	��_�ID$�,(x��8΃���o0'���M)�����	��Sa����f��~�T�۶<_HY/2�6�W_�"n�:���JQ*�y�pY4���
�����z��y��g�����3fEl`8�E�C�_��	�{���~��b��$K�˵]�9�z��n��$0xT��5��J�x�-#���ĩk���:��%�ى�I����i����ar|�T��ط0�)�5�������%�����J��(L���E��s.�4�a��T��!���3��SA��A~]�C�~!�S�VXߤ�,u�-F�P����{�
�;�vI�uvm�?��Ͻ|��IT���A��B��S��'�HJ͙&��:���4%����?um���?�+44���_��v�C��'� �&�=�FS��J�`)�BP�k��m���fAbD���	M�+����'����E��:��-�&�XX&
||eO��ۭ�G��|UW�%=	�2�D�\�P\C��s@��,�
>�����X�5L�#�X��PDE	��p9�p�$���o��fwqlGl*$Ӄ���)R<���+e�FJ���`Ä�M��Y�.M_Xd�sk��kI�9��LS6@�r|G�N�Ę�}�+�i"W'2�|{�\��[�8��:�D�0�)��:�4���Z���,~~��K�7C�:q
�/��������7O�/2q��}�O �_��<�l"�і����dd`B�&J䜨��q�Ӡ�h�!���o!6�	��~�!��༘��z��Z� ��M��Нx���y�6͜���/�F��1����/;�c�P?y-���F�0�q�A��p�>O�<~�}�vKc2����%�ka�W��:��?�jKh��c�W����>�$��ݮ�F�8��5����I�����FCS��Y�t�UB��=y O�l����-X�d�*��6F۬�����{!�ԉ��(aA�v)�=������X��X�|�o� �A�8ը�	�#�Oⴧ�Fb��P��?0�(K��P2TC��Z<��6p�}G���$oc=L��{�0�;�ݶ�i��jKU@�O�I�YX:��?�EC�T��x��M������
��l+�d�/)�	+�1[]���/�v�L���+��
��7.Qs��&�Λ��L��B�C���}��:�����E���n��1���R���ŧYpO��o�쏐�N�Q��]���ҋ���p��K�y�'�]|8�f'����{���.D�8tD�ߕNO���<H��AQ{���Y��.�zүBr`��л�p
6�kݒ���3����`A�5˱�]�J���Onh^�d����e�S~+����ŊTbp���wH��=����{	�*=��xJR��P��5.v;�eW���zLU���6ڠ�%`�lv4~��
Х~�s>�����7�u�<��J���ņS���!4X�LK��=�E���![�����?��'_���i�&��V��^�@7DS��?�w��Ϗ��Os&�>E�PKEePQ�b�,	!pip/_vendor/urllib3/exceptions.py�X[o�~�� �
E��B�,�U�ƀ���>��Jb=CNI�d�h{�9�\5���m�也�\6Fg,�6�+��"&�\���p"�6xm��o��X�2����9�Gq*�r��[�,O�K��-�K�\G퓫��n���"wR+{uu��Z����~n�6��p4�b�o@OD�-+�H���NZ��H�d@7s �"�n�T�a��"x�߽�ܽ֩����|m��s�bN��+�YD�8=K�� �tQ4�"݌�x�2a-�<P�x:�C���T�(������k;`�lئ:jr7")b^5~`_A�\��)�(/L�-���`D��EY(��l��J��U�[��:o�ʌ�Wݱ��؎��ձ������Z�0�M	g`I�Y}]���m����J�V\��΄ߒK
��Px���8��1؊m�L-��S,+k�D���r�_�o��v�A�9���o=��	���?s��M��0����~�'�v�6r+O#���ߕ�_D��5y�tƝ�Ax��\s<�gZ9����\TZ���,t4�Y�	�	�$%^r0-��x��$���'ҍ6��ԇ)d��<w���u�J3l
���B<��k�Jw�\�*�΃�Z��
�|Ӈ���R8§��������̊��"[����H1k	D"���i�
�(#���*N��ߙ�\ӧ�B:A1�eR?  Fo�
#<5Y�a�`~���b�^vR�ns��Y�D���B s��<�O��G�$��UurN�ʦ�A� yŮ-�xY�͈JF���ti?N�@���ںَ��H��F+��*�#�IJ���Ps�)�V��[9v��KÐ
S=�!%��Q�����F���^�t�����ۃ̄.��������5
�P�FJ���O ��@;O��Rnoc���g�*�huƆ|�q�Qg�/d�BWl���S����M������'P,	oB⶞��z���i�N���]��1{5R�v��C�"b�B��	wO�R�a�´�`l�6f�!*�.�l{w��;�P��]+�N�<�U��e�n��=�i�~
KDE/�~�<�8tj˰G�1;���|�EV��N��S%Ͷ�=ڂ���g?����j���6ϳ��"k߻3S@-&+l,�w������T������lK̃VC[�7�*(}�ȵp?&�}l�4��w�M�?��nt��[���A�����-�O���]bύ
�O%��
�CFX�ɔ���B�H���d~���a?����j����g���P�{IxT�j����}D+pt:Ě�R�ϩ������m�KCf����|1_�΢�r�c��:
��ձ"�����~>���{��XP
a����ո"%��,'��4^j���%(�ad��рE��'YOT���?!?�n�oɫû�_���[�S&CAe�ϋ���U$���"d�9��BfG8�3Z�>~�#t�b�;XYzDNY\�0]��k�s��n�)w��l���Q�6r[���4��t8J��*/n�{7�1�J˶�I�E�z5�>�_��P����M��J���
j��r�vK>�ʸ�4,�4@V�+�uA�r�[;��gM�Oܢl��������
@u�f�1P|�#�5'�O��իi`/�T�8Mj�ւ��Q��w�D'O&�*�r1H���/4���8D��Q�%��Le/{�uhFo7��h��kg����%~㭅�K;��ق��5���Mл�
�����˯��bw�q�a*ԳH��yz�z�_xS�w`�ؿF��&A��>(tܻ�C'G���cga�OE_�O����(i���"�f�J�T>6�m�b����u�	ma�#B~�e�� ߈��}���q�\��Ϭ�;���
���+C6��ڰ�{�;��ŀ��E�6���t�o��a�=z�^��O�D8��'���0�Š9Uha���T�,�up��$؍'���k=�q����-���@{�����fX]:�������#�H�pE�v
��3*%8=)_�G�.�}V��g�}ˎ����ܷ�;r=?��\�x��G���A
?[��@Y�ҕ}�
:���V�"�`՝Y"����ˏ���k�M����0Dh�k3���<�ir6$<���vQ�xt�C��?�a[9��ml{���"�מ�#��A��{,��1-,4^Bk��MK�vRb6-62���I_a���Ţ�>�p��u���0��@'�A0àK�c�S#�n�Ge�A��D�3�++pU�hP�Wh\3���z�`�5�kD��PKEePQ�7��	i!pip/_vendor/urllib3/fields.py�Yyo���_�b� ��ƶ�A�M��q$Y��mP#r$1�H.gh[M���� ���d��`@�p�o�}��e�#a��dU�0$ɮ�KI�J�i%y��Gf��X��J&��K�d���B�G�5�҂E�lÅ��h4���l*.D����_')�؎Ol`U*+�4��L��(�$�S!K�v^0�x���F4"��x/5��#@z$_F����y�J�#�(����@kW��5+�d2���|Y���F����dy+bYq}�k��m`���z������T+������=b���%m�u^���ż�4a��f��_[玥����$�*��X(�",��oU.9��r�����~i�����I��#cI�c�d��K�,3�c�L�*ee�j��R<��,�6�����V�6�d
!˳�ه��_kqĄ�ɭv�b

.�@M�^hN_� ���G�cۧ���|	���fi�z�%
�
A[���<K�-WR�����rQ�wI�L��r���K��N\Z�7pgJ�S��T[��$�cn�`��e�+l�J2V����ׅ��1G\߫�z��F1��S�>�
��i�y�]__���8p�^`�,H5~*�S��S�r�z�,�
aCLy��a"J���"^H��p����e:6k�x���&D��
�=Z�栖���o�9!OȻ�܂����r�����m���j����0"5�~j�,�To�!�J:�
B�U�Cs:ryw
m�j}��%�>[�q{��=��>c�r`����7����ޜ�<�<���V[+�:>�ͼ9�|
�����HY���#���k�:4�_*��,L����h􄜥��\e�[�H%6U`���1{?�\�g�m���OtHZ1�V_��V�͸-�(
�l��dz�~�N	�\�Va��K�m��<L4?��f��a`�Vy��_F��5a��� �"��I�y�r���=;(�„Қ����mЫ�� ��~�)����=�Z9��]u�o �x�S�d���"bPY��҇���:�������L3�SQ�|+X��;i�`���]���T�����V��.5/��[��U�ֺ�i��1������Ty��+�ew	�5��To�L
_�ppk����G��i�q+e!�GG���@n�V4ɏ�NG�G��
��Ot����B��?t�1Q�E �q����A�&���;��`H��@|��}*Y��s��XL1���J�D���x9���T@��
�A^$<��|�	Lۉ�3�Nc�	��(5Y��މ�o�^!�,�Ϧ�B<n-�}��6�i�#��i:Ҽ�`bi3�O�6��0n�Dr���V#��$Kd�R�����������"@b��i�	�*"u����x�გ��5��&��7�>_�gl�+f�\a��5���~RN�	Fk��!o���dx\mԲ8Ȧ�qb9��2�B1�yS;Ģf��C��Bq�~a����G����o�!�FV��]����a�m�&�&.�$�G)T:�cN6�|�25�|�\������?����ꔪSu�ɒ�!���^7�yO�ܣ�"w����U��:�
��
J ދ|�ipJ
�4��(�daG�����*Z\�CA��á��{��L.__�U!�(�[^ri�+���Jk(���h>��c����W�O:o�-G൏���|��	��.�b�W�C_r�������fC@�g�]�(v �� �V�f�F֒��O��8�~�i[24o��.����t�3vd7���^;X�;�6l`�# �9m��O�'�kG�(���c{f�?�Gn:��ށN���:z��{�`��n8 �#��Tg�F�^:�e;�Lw a��,�!p97Ï��Ե�g&J_�4ҟ��ן�xY&�����3ѡI������-rM7�z�����;�����-->�	����gP�[��ф�ZS��I�k��1�:
��G[[�n��l�s�g;�Dr���9��&7��]��DI����)v=#���mqz��4�g���+S�V�.�؅,�=V�f�'���#�������.������M�{�l*0-��fw�D�J�=G�V}'��MJ�-x�bi{9���	`?]�SL�Y�����_�sMJ3w>��5 �u�o}�v
��7�Do��Oa�3�i�N�B�L�uo��I��L��\�3ͻi)�b��k���ݦ�n8�Z�uB.ԯ�o%�5A�򜘻܆օ���7A�/�紊P�%-Ό[��w��Y�����dו�C����#�u튊�q�N-mvu�7Ρ'�V�YJ��,��s_��b��A������z�s7�z""��ǀ�M>������0��4����]����=}ܽ�hn5�B�|T+luv�=^���T^}�}�?,��ؒ�"��Mz��D�iB�LJ����&ΥL*�l��U�O=��0��9ޑ[���Bt���4�ա���PKEePQ/�]&}�	pip/_vendor/urllib3/filepost.py�U���6��+*�
�A (\�%h���Hz)�B��њ]�THjw}ɷgHQ�-{7�%r���{�aktE�n0X �^��Z��;�˕P��BLߵn��ӗ�I�z<�'�7{�v�1���׷��m��b��Ҵ[ŽV�lf�O�u@���$�7¡��
�Z�}��]����/I�[�wZ[,*=���}�o�'M��q0�]ō��
u#�kK%��^�;TZm�:��eHv8�Rjkl�R��L[6��e/_�y�-(a��ۘ�g
D�R�YP��� )�f�X�'����kg���E�[��A���K����[�’�-d�+��
D��A����,Y�M-��M�m0R��U�+X�0S"D� ���Ƙ�*D��"�嫣_7,PZ<��v�I��B�
đ�y��I�e�}�v�i���1�]�f���L�G�b�
�$X��K�:����x�'��>K�-)�v�B;��;4�:d�%��E�E�x�My�r�
�w�����o�?ً��[*�,"���o�=.vZ�'��~���G���Dύ+ȴk��sB�ɽ��.$����I?����˒��EZ!�!^�k�o߿��u�E*7d���䁆?O��ॢ��~�<���HSy�X�8�z�PQ���G�a��)�B�A����b����k��\���xCe���R�{).�����X��읒`�˪,]����E�pل�O���˼[�&3�
��ӈ�f�R�Oh��1-�?�G���[Q�n1�"�u&������﹡�u�s'*!��?
���W�}�� 
����G܍�YM�q��q�k��!�H@z�t�q8�W�#�@'3"ľAw��Y�:�O�PKEePQ�����E"pip/_vendor/urllib3/poolmanager.py�<ks�Ƶ�+v�Ɉt)8�r�\�0Uu���XN3���R�x��$�����'Jr����>Ξ=�s�0��މ4�tm��4j���Vdk]�]+S�>1�y]�2oU]i;�骼���
�������׻��૞L6xT�0�i�d.��<��eqYWm�*٘�y]U�|��߾�ӥ��	f4v>�JׇT�[��f����>Bn6��:�p�oY���MS7�ݿ�ms�~j������껊ǿ�n�R4
hn�u��_�D��� ����Z:����$0���[��5e��0�hi7�د��̦F�_'u�M_��v[ڬ�ZU"(G��@8��M=�2�L�4+K����0E���*���.Ĕ�|��"��G�
�;��$ײ�>�f��U���O&WW?�߿��/?����e~Lo$@R��2q��n���
d)���Z��l4p��$-T��i�}k���}��]�S��䙸(KA�0�"k�����6C���B��"ܪB��a��H�H�Z
�pL/D�Њ�*dS�@�K�N��Ѣ�
&u�t9�/CT�Iʔ�e�c��_�3��Ķ���0r��U��V�d��zS�}xϓ~5���:Z͒�����F%v3��o�&t�5�L��h��#�{i���Lr5>�"6�s�6����F��ѽN���ͪ\�z#`2m��y$-�3V_��{���^���s�2�3�(�-~*%m����<���!8x*۴f��+J�
.4+�,�p��:�[4
��-�b��7*�����]����Hm�y��EW�_��A��anLO`	p�W��8����U�%Qa����X����	�A��w��kk�zK�FUy��v�W|s��3�;U�]�K&h����e����ljV�]s��r#R�+�ʖ���ف��
l8I3^o!���;?grM���e#�VVK��@�gv�0�y�]րe��y������Kq��_�ql�ty��ȪB G�,93-OAqd�U�neB��1���Ӊ"$���f�kZ�yE�KN��Ⱥ����"�mġ�ĝ�[b�6I���r��*0d�"VV����<9��l
�;W+�C����P��1#�`�3��
��9q�����6عaZ#o�88xw�y��8�W+$5|!!�e�0l{)���zR�/r�i�n�������BH�9$7�LJ��!lxx���@�B��3��@����WQ���9���u(��g�J��b׵�eD�_n���$�{�)�h6]�Z�>�	.���E���$�%e}���A!@��G�j�=H��i�C\<IB%ٮ��&�4��>��([���!T`�l��t�A�=�>�r�6�%"a�S1^��V��+�w�UK��,�HT+wz6	 bF�k
y2K	}���F�b�j��gӞ�d���-���̏!�}�� ��d{6��]k��B���S�fx>duZ�C�2n�����`����X�!;D��$=I����,Iо3Fn��e*� 7�}�G���W�\lQ�X`��al�ֈe@�1q(҈��d�q��H�2d��q٣��/��8�	�'̞?�NtB�Dh�6�=Z$�P���0Ƌ�����L��nE�C�����5�Q�8d��{R�F�u�oE���֐�k')	0�$V{~ndY ��^�
]4�E�*�ȎFk�B
'��o�����m��s_����UY9;�,�ٞ/<��B��d�$dNJ#hq�m�cG�t�^=��,��{Ď���Y�V`��Ɠh�
Ti�܍*3�t�����������~"�8$��]J�^��v�5H��G E��[��yfB=-ef�!�	��Xp9H�6���-�)6V&��(������I�d�������R�
ΏO��?H[ͽ����]��"(m�����7��nݶs��V6���[I,+�� ��>ہ�=?�8�_}���A�(�r�x�|5���B��V�f'߼~�'(��/^\�5���޽8�=�w�*?�!���ᥬfv/]�O��8=��ц�����6MgZ�������VJ��e!���XK�`ʣ��� ;��`��Uj9^j�L^���k-S�o�2ۭ��b��%���<��(`�|-�7�z�W�ig
�M����Q���,!�}�d�OěG\A����F��3vg����i�>O1��O�Yi���#X0x3�1���R��n�i�)�+�-`�F�u1�`V�;�A����DxA��AfNb`j=�qi:�u6�ol�Z.0��!�`	
��τq�4����j���5�"lE���wL�����0&�ݑB���,o9�0��Qg� ��󱊱>�s�v�
TԖ�WE�T�
��=�х G�U�2)�+���f��~���d�sFQ�<�Q���a��#8b3L�����U�i,�%\���F�8'����8�{D˻E+.� h�F�&L��/Ye@cE/]��m�Z�'�`��ԋ���86�Q)M��Iql߀m����s(�x]5~j��S������gĔ���
s��Ao�ξã��x�����c�l*���ꟷPl{V6��׻}��@��b�"�2��t��>rGqJz��j�6�)��+�lp��N7��޶�{�B���s�~-��r�g�	�j)�+�����;����:|G6>0���0j�r����Fb��Q��2
Ij<b���<�Z��)�%[KtɆ �
�(��N�
:�Y�Y����*���ޢ�l�N6׀��Hژ�D��!Z��۬Q��x�^�M�
pv=O�.�?D�;�r�Ҩ#�����އ�˳�ۚ��z/s�Qz�ۨ�M�i@�Y�y~l{T!4v�K]�ȩ���콧S���9���_~�Zd?�Ǘ�j%~��/"�3{�>��vk���P��CG��cQϮòb�IpT�T�z@�U��m����?c�	�iѪ�[g��G��#TҲ%���2�Gd���6�9���‚�����‱���1�.��@z����.
Rtd$	;O�=b<���?�{Z_&*���p�@q���	�JDž�y�E��?�:��C9$�GE-�[�6�B�� ���>(�0�(�y���$Oz&�Dsg)=��*Y�b+4Mz8��W*���⩴�V��f��q}����Y�Fu��1�G	��OH@Z����%�GcF���*
q��N�����J�T�5"�c�q�7��
��8�a��W��,�D��(�;}o<�b�6����ʴτA�>��8��8a�����Nd�ۺ56Gm�+��"
������#�H�"�}�f��%�2�Q�v(E��m�͟�5(v�$�K� �K�|�
�[��A
�QØ��֖̎����
�X�r�:\�?����(����9-F��2ʹ�.���~Q�.h"�R�)��M�Ro��\�Q�P���$a��e�w��|�^�D�p$�F����:�b<4�̬���?ms�`�(��w��\7�K�V=�����GP��J��Q�tP:�F��f�3�9J����Q=2�� �i[s;bΆOl�9ݛ1A�`�7�֧�)-*س�rv�����>{�t�5*�Y���4x��4̼)�9� �uӔ
��˷lA3�V�`�����؟�Bd]ᆦ���O��xƈ*y;��D�7w���Nc/����.�L	�C�u�$�>|��0욏�f`P����!�64Zp!y���ܶ4o6V�f�����mC�{�}.).�D�VZ���tF��z3xj�����K�ؒ�[�a����SP��2�N<���)Y��� ��}
� �5c{�^��\�+S�c�E�E\�6W�Է�4r���>�q�����(�Ƨ%�w��n�Ŕ��̬Yp��kA�lBʤ���r��~�n|����z�57�,�U:�����F�P`�%a�����8^ے���;��Z�[b�*����
u��]Uai�$Xi��9� ���.*lS�$$)N����"?�oW���D��D�'�nGN�1�'P>D�9ei��%�}x��:�"�2�3�u����K񜭥��ǯ9�#|����e�A���ў�*��em��جGK�a!��/�ށi�$�M|b�M,�>|;��,�0�͕[���f�ػ���>�}��Ҧ�M�y�&>���+�{�q�,�÷
�#@u��?љ�󽆡�`s2�WE���F��?�p$�р�6��G��v�Q������h��Ƿo__��&��;��/Ľ5�
���a����As�ș�p�@�v:SC�~S�e>ભ{HFx�W�^��f�?,Q��Dp��BL��r.���+�l��
���E�5���K[ᣜ	H�9XY[�,[�N�#ȭ�6�bc�HTl�
�UI�g/_}9h�y��"��[�^=��Y�*�����k�y�q����C�/�����BE�׃u�U�%���*�����hԝ��>>7�D���(&B��H3c�o��O}�4��>SS�=q��RXA���~D��Q��
B9���[

���i��}�!M1i¿�L$�e���}.6]�������R��
N	��eϘ����?�w0@���6�����'^��w���-n��ѻ�kA���.�3ۏ����;7� �d�R�)��X�ceI֒A��;0�l3Ł`�����ꩆ6���Z�c%	�f~�Ǟ.	q�}��#�F_P'%��A���'��^�
����W��E���4ΧM�����@� ��<(�$<Y1Mg��om��lw��+vk�틬��A��.`�@��1�u`��]�g���uǏ�Ý-}9:�`�Y���L���Hl��w��W���e�-L�8��X�;��.��`�ſm�����<�[k����D�?����$����`�w�'����]v؋�I���\C|ۭ)�1A���@�/���ϧC/���*��"���~-�<�{��B�ٖ�����x�x�j���m�*?�>EF��(������M:�"�2�lְa��'�uij�4ش$N��6�d4��%�T�؃b����m�	�� $���d̾e6���p�U�%����Oqu�u�AqΧ�(��c�K��7sf�w�8t��
PKEePQKC*��pip/_vendor/urllib3/request.py�X[o�6~��8�>�N5���A&m4���b��蘍$����}�CQ�d+�`ѮDE~<��\���9-����F.���RKb]鬶r�<O&[��lU&K]�v�,6:�˼ά*��˭6y*���K�y��J*���w��2��S�c
�d2Y.E�A�s��(�eeo��鴊��&UE�3��Yn�|1!��(r�K]<�BXR�^TA��zY�~�y�L沀��ȁ�XA]�bE�����7;'*Z�ŋ�o��&]�X��:K��/��=�V$��-?Y�+rQ�:&᩷�*����F?����N<+H����I���y����xc2�M��U�9��ߩ�έ�%�쭒Y�������^�O%�n�9�͐7S�/=�ԊT�d�d�gj��m��t@�”����ӏ?Ќm�v���!�뫋1}�����j����k��������O�mꊁ�	��s�]�lc� ;�p�	
��..��?��*��&�'&ei���2���.Y���eiti����K&,{��H���Jb��#�ׁ�4�m�zJ{Qo
e��ԯ�tX%M��z��I��A��f��U���TBv�@��1�E&�����B�
���K�����!	a�nz�[�ʜ�ר�JS���׻�������׉��-����嬒�6n�8���;}�e�Jxd�Ǿ��|ʘ
����'��������
�e�F���{����u�
s�zv��w�ѿ�b]Y#66�7B�0��is�L��ѦS�9�ҧO�b}�
S1$i��O��p9|��}A��j�\�ts�u=o��ڬ�F�!�(:4��˧}ϡmi��-ȏ�?���*����g,��6��V�4�f-*$�$�ժ���G�v�~�	d�^�r��a̢)c3P&�9�k9�Q:j�u��"�mB7�6�@�p�qz˹\W�ւ��u �TY�*\Z8��?]�<��S���\���/!��w� �;48�TKd���9R-�7޹\���&a��zϞ�0�{*����y˰�,���'�`�,���`,��5�vն�I]^IC�ٍDK�'�`W��Cn7���:$�i�Q"�䟖����t�};����]O�x�$!ZU�:sU�����=i]b�v3�Np�-)@f����*O�u�D6vp�Ͽ��דy�?Zs9�Yp@��C0��9���}ӵ�fjoy�ZmA����m:I��h�0{!=b�?�B�͟��q�Y��y{�5d��9�����wG��4��y\yaS.!���ת�L�t�΢.Z�!�Ȓ���{t)��$��ݞ-jX1<�JW	߿�i��];�݆S@(���i+���lׇ�0Ȉ܇+;��#Q�B��C�n�����=>�J�[�s��:�kԻgi� Z�w��jo���Emw=�?��A�S���"�.��[<��g���%`Wt��C�ⷬ����%tA�igf�\-&�@L�7�WΜsj��Vfȃ0�!Z������nr���?�!��T��V�邦ka���[D&��)3���}�Ә���P�_M�#�D0�Oå�n��V���
+��`~u0kU?PNA� U.�K�8*w��1~ˁ�ݛƴG�{=��#�֝Z��c*��n��h���*�@0�����i]s��_9p�h����8���_D�6z_!���C�lhԴ�ʗp�ϘU�@�.����xb�+�;ow'4��{�,f�q#|Ȧ.}���1�3�z�S[>|��+L/+B˒?P�I��#�|y��o[��Ȍ�i��崬�c�mO����aׁ�mq^�����ͱ��7rX
J�%�Q[ry���F�E:p�O]���>��.،�s�/)It>�K}\O%���,]�;�3�BmZ�S����:=�)۸'��xf����F������sC	>���sZ�}q���7��W����m���'s���K��PKEePQ��~�=npip/_vendor/urllib3/response.py�=ks�ȑ�+pt�D�)�$���(Y[���ٖKҞ�r\$HI�@��C4��~��c�@�%���ڕD`��������eYl��d��M)&�(�l����YUdM-&��`���E^�/u��T3�d���J���ߠ��;-�_Y�Z���AU�^�
L�nD��UtK/�A��(ˢ4-/��A]��"��V��<ė����=��܊_G��"<L<�Y&�uZ䕂���݇�D���t.���lHP_��������@��b�M�t��1��c0���^�y�փJ��yZma0�/�M~/��*�����S��,]0�� �����V����CU��<�z��w�T����~�o��i��iO�Y*rZ�5SAvFə�6e/!��+�-/'�i�4�K9w�-�&K���
�M5���d
�>8F�����D���p2ɓ
����`�%U�_fI-x�a1�p1�,��E���d2�D����_��2-�z��ݕ��^/�:�7���{�s�$�B�
�*x8��ȀwRץ|!�
��
�G��PC�

$3��xY��e�5=5��Ł��#@��Fɚ�?Q�9�^��(b��o�J�NGdx-�$Y%:��E%�"�5�~/�-�02�kx�q��ٻ��||uuw�R�EH�<�I�0�i�dYN�*jo��o�Vn�[�Qavysus{7yw����
t=���w?]�ȇ����~|������w/��ih��ݻ��<�>zu���V8���0���
�}-��L�Ñ�m��;T��W(����!v�4$Ϟ�~�៸��@���i�Tzq��?��VyQ
�_�,kQF�ZD�Y��`�Υ�������p��=CF�e�;�i�fp�E����i%s�P�F��Q�)��y\�u��n��� �;�,\�7 �&��ss��#?Bj�N_#%�[��0��`Z�(Ƥ�b9�^%
��m�E�t& }t���(��!w?���du��|.���Q�N�#��ޏ�;`˺��I>_;}��6�7�P���:p����' }J2����e9���&���%�t������D���,��Q^fM�M�Oj�$r3�����0O
����7?��81�^-#�O��al��P��̈́ȣd�7(Iu%04��@Š60�u���}Im:�m��~����)%��$�@�/��.e
jM�P�-`�V�#ܜ;E
(�(|\�����1_�w�N�f`�bM���>J,D�:�L�
x����p�]��F�;6���+�ƃ�g3X�U�eW#}:����ɧ6��@�b1t�z<'%�{+8���˙=��0��a�j���9,J�T7����O�A�����Nm1KKÚ�mH�앰�;�|3vږ�h�E|u�楷���6��G��<�!^���%�:�k;7�4k�A�YSOksu:���t
�%xY�cA��X�6>Z�
>٭o��W
z��ڊ��#��pG�"��8��x��2���Bq��	��>��5X�p���lG8�= ~?��Ŕ ��&c�l��2G9J��.ЖG)�,H�`I����DŒ�<\�pr��^R���+p����#2�L�����L)���olSW�g#1'R�8��ϱ��x(/@��Y����a^�}8�
�&bg ^��q&�b�)�w��iL��2;2�P�;RB�P�Nw�LWhti���#sK��y���{�'%	�U�5Gi
��DN^��'Y#�Pb�%f�*�6嶨@pFW��Dt�c��;5ؽe**3�;Z/z��!��utF�~6�Ϧ�`
/�_��N
��g���fn�k#���C�0��^�I&�U�6h]�{}|����=z���'e7N� £Mho��:����M�����ҏ���� ���Ƭ��E❂���.��M^_^\�fk�cR�H0>wK^3���
d1���|}usyq7��{y���%���d�8>�/����ן'�s(��7� 烁y����9����:?6O�j?�T��g��k��'8�i[J��۽����
�-��{d<�ދM��H�����Cv_��	��u�h旰s�7IS�E�f�|3�iR�N��\���Y
�)p���L(�Do��s�0G�
J�/%s�[������>`d��/]�@��y�ò�\���:���:���l:�/-�*�D���_��|�܆�������`M����]|�=lx?�n��7�7i
��XL����Ў[��q+���|��n�W��{c�1έ�GFg����F���Ϣ�`���ܬ��5��QU�3:A@�ʫ%��R ~�");����%0ֲ��.'P�v�����p�F�*�1�Q�;R�
����ոy���-О�:��J�2�ūQ�Y��T|���dL��h_��F�"�(�lm��s 	A��XC0����A�uV�:�aan��P^p*�GF� ���zd�t�T��a-yRiM2���cDH���=���b�w�W�|Eӱ��V�dŜ��5<��\����Ī[$m�-�ߛi���T�!���tP�Ƞ$N�`��i��!�G� ��a�̎��� 	�;�.�y4�B��e�T�Z*Uw��ه
���:�1ou�h�"p��r���	ᑨ��~_ą�
�J���f(�:q�'����u� �6E1��F4K
��F�:��E�i����/Q��d~�鐲;8����V�^���S��fq��� �ߣ
E���Q+>b������M(�Np��c7��=[��x�?*�Y��O�g�4��Ro�DRf)D�0����hm����񣹇���v�!B�0��}�5G�f�=�lǮ�q�v����L*�-AZ�,�c����-y��]�!��,COƒT�@�DU-�2��%{�
K��
cA�dS49�g�ia��gx�M�6�AY����bP�f��`4�"E˄�Ga6w�먆��h��+��̎���k�d�f{u��GN�e�<$i��0�Z!o�`��&� ��_�ʶZ*�X�3r����\y�%���CVZ�n;кf�@'�S"}`/�6�A��=�*-��3�����,��%� �KA�]�Ԩ��7+V�.)QN[/i	n��!L��j���� �Ni�*FD���?�5�#w���T�H�En�\D?��8��E�">�9x�p����+��E$�Rf��8-�Ϻ`�el�pyי�V}�Q�g�t�\�)G�V��%��	�yN�
y0o&"��M0ع��AX�/
��k}}w:��Gr=3��E^5@JbM��p7GK�եb��u%-���ղ��aL�_��f>��1�s�J��V���w�P�Ő�83/�1$	Q���O��Z�� ��j�5���6�~��������N�`xC�g�-���,+���:79�A��%����F��W��۰?�i�,'o��0�#�8�e8GDCieo�=S�1���q��.HKi�@/z�M�״��@���~�N�b�
}c字��/�������}*��!/YHK��"�p�L
=�4	%�*�@�|��xAŽ
��������Fhy�G�U�<��)|�샟ƒ?]�|=p���?nYD��<�BA��WQ5[ڼڍ��t�Ԃ�'��;)�a��0C-Δ��N��0�P2�b�@ż���o����ja|��*��ާ�<�ъ��.H����TY�~�3QP�%�����ڙ�S�-�َ�O�M+�/)���K��,��Hjȝ�i���%�<9'�
�������fr��-�s�W��t49v<�GbGa����"Pc;��Q�R!ƞ/}�	j.���Վv��4
<ַBJ1g��qC��髡����/~��-����9It
��t)��u�ޠ�x{�)h�2X�
m��K{�G9�~'�K����:��$c�i���ϧ��	��#�~
d��LT���e3+O��6�9R�`C����V~�"�Ӏl�ti���AF�����q��h�8k�}�7©k����Iu�۪ ��^}�����u�~�]`��w`q?�,�rV���G�A[�G��)
��T�1:M89MC��yP�G���e����NWk�'٦����I�������7�  ��1A�m��w��'e�ST���\����Yt�$2w���A9��K�pK��@U`㽨��<�h��4�!P�ЅA�S�i�,�6�X���zL��%�N���(H�g�.a*9�kE���r�x���FH��L��}$�2�kF�$�84�⾔�C1:���Çv�!�F_cPN�LCAEy��ߤ���,Vm���c���<`/W�ϱ+̍R���e:�_��W?f��G���> ����u1�S�7DsX�벸9�g%Q���P���1��uY��6�Ĵ1Hxm= M�,�4ۻh:BéAV�B0�"%^��&2.���U.�&D��hJ�E��H-��^ˇ����@��2���U!�f
�DL��)!)1"EI��>�b��I�4�%zB�ƚiGnD���j��Q{ǀ�
�L�G/����Y.ӹ��ㄐ68L/��#�VS���$Z��,}"1=��:�.��t�]zX|$��X��IB,��[�\d����v�Mj(O>��W�l����ᢀ'CWV�vdo�����M͉[~z?t�^�4t95�M�%%NRF}B��a��wE�,)R)1�0&��S�ԦS��t� 7�Z
�̿�ɹ��	6��-F�%O#b1�rE/x�䄀��>�c�]왘',3�E!*x���!]�bC�\(p��)XM_6Y���ښG����
��|a��}xT��Y��h �A�^�Jtg㬛�����DIk��k��kK�=��2ՙ��aW���u���E�U^�t��χ�u�	�y:MQ�Q*����r�s }:�~�k��%�`������ƎF�-e��Q�i�Eا�J+$�ap~��c���t�޸ŧ�-�a�n0�^�\&�
];�]I$
c��"n)���Z�P2:���w�,�rq��a�|�� �ʄ�p$��X��A�`._� ��b���r�t�V�%~�f��%��(7GRX�ϢW�j�WI�G��ϪGː�2�g9M��b ��^���	��
y"}��cy�ĄO�I�$C"�}b:>P�;Ӕ��QȺ�kг)���_�����i4Ddξ�v֬��a�E���F�|�o���ิ�i�E�]	��>T�I�r'8�k�K�$�0@�B ���%��j���P%�:�N�ʉ��mw����S7}�t���c�M�l��E��8���EǬ?sQ2w�d����J�����G4_z��N��6�y�df�TO�`��<�,���L��.�mm���̅$���-JL]��'5�H�f�xd�G�m��Ibe���|�&Ѵ+�C���)��#�|�Y9z�V�#{�������8�q�Q���e�w��y�-��4������a*�T�cE�k�0(�"����)2���üHP�����J��,6S�LK(]~�<�a��;F�����!���$$Q1��
uā&����wǦ��:�\U&׈l�y�����9�g��S���mp�؜fT�
V�^%C#���@��l��yyp�Ĩ�=
���z��Ȍ���Z9��*\-n���;\�T�jk�|�	b�T�@��ϟ�`��.�F�H��I�h��6���P�Y5��Ǿ�F_�u��H�n�\d�<�H���/�ӱ����K��
�*��f�Um�07ZJ[��xX�@���Y�\ꋑ�S�\�f:m����Ô��X�Ժ"뫫�߇?�h��c�q1H�
l?i"d�<Se��O(vXGW���y�(�G�Td�M��QU��cR�<e��:
�!ء�OYl�*�T]Z���*0U���\gZ�D)��*9-U}��Z������Le���}`6���+���E؈W�Y���H�͵�����G�/?^�v��YW\��[&M��6�
\�N�֔\%[O%��}*~IL|9����?��#/�A�D_����SG�GAXmm;���?��7U��@Q�-�;�"��
OF�?��-b��L]/d�O�b��'us��!'�r���^�����r�m���9�A��[��8E���1HG���3@�MR��;�1�~l��Qߜ<[��N�`���'�i�d�������h@a��
[w^�[8��VP%x�O��f/���	�ܢ ��jJ��]��GV��ZH���.ڲK<���&-�>�x������[���e^.
�)�g����p4e4�gnA/>�v#�>�긇9g����0��Yvu�0�K\�\�J�sy���38�*�6�e�֑�������QQa��їfRZâ�YJ�xu���N�fC2�h^&;.��5Y��Ec���_��(ہ��l�jU����D��C��X
���A��E��섑�5�Vg��J�_g���"E�D��g$-�+Y���_:��%/e+�%s�g�߀8}:6i��zP�n��
t���)��TŇ��e����h\���Y�+F������kX�L.�qO��3!Y�/��%����*Y����[�e6ZC��g�<��+*_ܼ}ɐ��M�
Q��:�q���[���2��|�����?9�1��B#��<o�{�'Q�I���<�0���!}5#�3�mFi����	9(ON7�M3I��,�P�����S\��I:=�F�JL�-%�nvD�h��}���*��}q
j�Y�J��QlL�P���&��]�`Y��*(5QUAL�yE��o�T�C#�hc����4�6ϧ�ߏ̊��3�dAuU��4�T�{��-���hչѝ���5i���i!ꖠ_S-K�
�>��~��>��#�x�b�Ѿ+/�'I�o�'��tK��;��P��K<�w�ې�7e��)�3~-_A��.�¬�v3�>�4n�2-�L}f0����t�Öj�ug�s
�H`	�x���pFOp���P7iE{�D;~�a-Ʌ�#�|��۩��Sں�-H��8"��#Cx�l�պ�F��d�P�+T�!�<�~����"��T=��H[�cO�R��T�K 1���/�_�3}yP�ɖ�
�4ϚU����(�b�w�bd\�t�fGh"���y�7�GC�g���o;z�ȑ}+C�7V��O��_/T��B��{G΍<���o�r&�N�XU��u����a��WK�2X�l��u:�K�P3���3��Z�I��f�puQ�#6z��1 P��?�tt�9n]���s|��[卮������YCw�G���.:�-�b�23%p�j;
�s�7��c��v��%f���
�/E��Q�~:�R�VO���ħ�3�h���		�|F'CBݰ]����^��:�:�ŐtTW~����PKEePQ'pip/_vendor/urllib3/contrib/__init__.pyPKEePQ*����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#�PKEePQ�V�;f+(pip/_vendor/urllib3/contrib/appengine.py�Zms۸��_�*sc�F���7Ou_��<M.n��M��� �p&	A�V;�o�.���b�Z�$���b_�}��d-w\�Bdm�HU�=Ϙ$�TB䤠%ݲ�4;ڐV‹�Bl���u��%;������X�����<e䏻�����E��6��jR���VS�.2�ʋ���Dy��|�J�(�~�E�����"�M-
R�*N���DÜ��_^T�n�-�Q�{��(���c'��:i��9�2qT��e��Z�}9�]��y1`�-�F�$q����!k��e�fD��dұBk�ŀ�t�(X.���g	�"%R���9�ٞ�O[�c˨�5�۸f��L6ӳ��˳99���|s�;V3B��*�oh�E)����G/n�P�V4�_f��,7�JgRi�T�7�)E�GH�H�H�59��& @�S%gL:�]����[��md(�aXj_�䯢%)-�
�2ͩ����W�7;'w�i��WR!�s�ٰ��{k�Qy )�Ӷ�
-St�$�(��Wi�B(�0TF^���P>
��;A�m#��Š���t�������τ�R����^���5O�Ny.�r�Ĺ����������i 6���:������n)��s��-�^Y��o
]�3���,�Z����jes���r��i�TLv቟�W�ɗ����ӛ?_/����7?�Kr��-;���1�� �?�6��E������&ܘ`���l��r�(�uY�.G��!
v���m[+�e@
��kQ�l��;�&Pa"���d�6`�$�	����ۆ%�{d���O��n1���Z��Uj~q\��$���q!��!oj��:��*x�i�1e&�
�T��p]ע���?���G���5�����E#R�{CK^00�7rw��|�9L
�|�_?20t&;"Y��N���4m���kZ:#B@R���r�ż�c^13��"��슩���'��X��H�ܨa���`	���$JE8��[�|�G�6IR�PƊ��w���oa�2�\d
o���)y���'�����LAT��7�,�J9�U��0���~���ЀQ��_�G�X�kX)��a4#bc���-��2U�!
��IHd�_a.�2�6�͒@ϗBS�!P����9����a��Ҩ�~_��~�|�F� �y���r,F�^^\A�e�o����<�S�c�="�S�����N�0�ɯs�ͦ�ta�Ҹl+���ѵ(�a.�?T5.�j'@�W/I��t}h��f8�wz^s�C�Zm��4���P(��`$�������Ow�?��P��)�{1́�y:�H�r<>dli���I��N�|3�K�.���@7�鉳���<H')����a�%�Ȏ�*���^/�:����X�w$Y�J٣H#�ςQ�Ɠ����l1��!\f�6҄�[s��t��f�p�	$
ۨ�ڜѤ�e�ge��v�5́L�sq���@����R���m׮)�x2�K��g�0!�o
f^�}�����
���I��(���'(���o��]}���c �j#��W��֥bP?z�B�M�C���b������r�����f���@uo�'�ˠfvB������I&���Zd�^�?'�Lõ�L�0]��r���x��˲#��[�W���!�k�ߔhH�����܉��H����%�H��f���n��2x�@I��eB�X�?�O����\�l���N[�}����x�翆dT�
��([(���Y��ڣO:d��H�e��gnSap15g�٣��h��w	�t��/o�L�0�2��:�����`�CW��M�D�}�-��I#�i�e�I�-����@���=�t��6n��_���L���DZP�*LK�^k%+4<���l1��X4ؓMO�x(1,N�r	
����'�4�)�b\*E�`�On��>��O#���6G�k�8���N��}��i���ڰ�~Ӆ�i���M0�N�m�L0�ڍ�N���@�7�PvL{l�/����IS����Lvt�j��e�rؓ���0�����$z3�/r�H����)�. ��C/� ov,�W�k��������^tj"J'ճ#Y��^b�:<���m#aO�B�� �_������d�z9�4��sS��y��7&�	�[�%,-�"zN�R�r��l�:�{����d79U��<�a��;4��P�U	�R��0
�
��6�غ�N'�����F���118���a�ɑ��������#���XSؗa�b��ďi&�1s����a��n��q��\h?AN�y@���hs�U�-���gvTj|$t�=���g:H��(�
�=�B�ɬ�&M�S�cIe�_�װ�J��!��cvr؞�	���T�<	�Ǡ:�N��go�3$�*<�ͯ��8$g���H�RO�\��{���I���U-��`:�j�d�V�����b�g�<"�LE�i���( A��u<�ɺmT���=�R�U�����x��M�"T-6>�`�N������D�B6�L��(c���.���@K�a����~f��S\[O�I���#����/ �͍����ghtշ����%s�k�{���؇ň
`)C޳�%��3��*���N�I���1鎘h�_���ObU7w��o��]�7���C3s�1c�=��~�v-Z�2W�/I��#`�/p��y�+B�ބ@W鋋��?��4
�6l{G��.Ƭ�����f�Q[�����(�`���0	���o���<C��G��t��Y���������棁�dq����3��i�7q���kb���v�����P�	^�k�"�{��S��0���%��[�-}�S�(4
6��9����tܪsX��YY�;�J9���}F��X��9p��{R��2<�\�yuԪW;�#�;�%@¡A��5;�^�Bdt�� P�z{.��P�����W�1?�2.��hFϲR�-��ȩN�+O!���hM��=��b��S�\�
�nr��E��7ۂ����u�S�{?��L�¦$��~2�}�h�w�_��~.	��
͟�f�.��Gg�dÉI�/�g+��?PKEePQ��͡@'pip/_vendor/urllib3/contrib/ntlmpool.py�W�o�6~�_�� w�b��c02/
��E�N ���f-�IE��;��AYN�a�_,�ǻ���}�<�ݬ��Z�=��T�|G
�Ӏ�<W�mJ	�|% �!��T��ѕ�%��I@$���*f��1O �q�K!�yv^��"M��9��y���7�̧�����g$���*DaY��"t#y��#�>�v)��4��h�G@��\�Y3���Ea��]�>�]�<�X1�č6&�t2��K��'|�[��!5�8�F���; ~�4�}�q.N��DS܏�1���4#��*+R�0�$4'�,�<a*�?�j��e��کIc��<�x�>���&����?˙�"_B�
H)A��}�%;�/�~�Ẑ��6'a������&�c����Ti�Bp�`m��=��#�@��U���d�J�
ݤ_	�>��~qu��g5�d�EFU窨G���"�&f@�	OnD�&s�:]��v����y@���c�0ӟ�2�$��G�|;�"e���L�b ���;�֓ǰ,��l�h���o�l͑2�4r�"]V�6��� Ah�-��F��r���9�cS��2C�ҵ��(�[VJE6@P(��I�g)�p�F�B��;/��� ��s2m-�G�6��o�L��R���`7M�6P�Cr�Xi��mg�LzA�ũ�',�\��Ms�3�Q������ו�7#�;���"eO�}k͑��.��@�\���Rx��,���^9�^]oM�t���w;"Z�~rп w�'$�W��UR��op�!ԠL*�grf$<� �HG7�����j�_��-.���Ӻ�J�U��ڒj0�t��y�X��������#7<�u���r<4�X���NB�b�㛶���g0[/D*�J���֫�}F�$Ͽq��+�������kC%�t2�R��4M/`�߸=L�#��>��n5�qʥ9
o�M��o>c)�RQ<����qm��Gt�-�h��~}��H�y�&u��TL���4M!��ju��r��hZ�D[��N{=6�o���Wc��%��a�Y��ٖ��
vL�2^��pr�f�)>��a�A��	ʐ���Y+� �w�מ�X%�_i���}���o�㡢]���c�zѤ�V �#�;�+#*x��ZS.�.���7��hʀ��bl2�k�����_�]ެ�.�U����=h���=��cim �/�����oEp���:勭�a$?��/�ɠ�l�_'�a7�W��϶���H%8^e�k0JIs����e�Y)�v�
�uמb�iϾΞ఻ED�x&��"�������u�����}Ҿe�:�t��Ԇ'_���h#r��J�@��(K������3w�nڹcb���I-u�v�=�^�L�:׽c�~�2`���pe8j[4h���-;r�PKEePQ��S�*�@(pip/_vendor/urllib3/contrib/pyopenssl.py�;ks�ȑ�+���2�`��l�)a*Z��Y�%�(��q�@��@2DsS��~�=@����C�u�����{�{��~�7�^�MR���zU�Y����v[�D���R��ذr�Β�(e���
�,�VTl#�4��g�`�\&�-C��e�H����98�Eɇ���|Vi��d.C�`,z�2Q��/.�x�d��Ң�1.@a'HP�)��$�I�	0O<]���*)GAT,�G@��0z�DoQ�i���^�˷79ϐ)0��6���{��?@$�y)�2�W[歓,YWkv����k@!EQ���YX���5��f��֓A`��A��C�Y%���5��8�r��
4<˒��ɣ2ݲ�8�`"�r�
Q��a�<rX�M-�V����3("
3#+�Z	�)�H��a��d�ɓ�Ψ�jI%�n��I��0��Ӵw����t�?�L�����J��}��O���A��"�P3%o4	c���yo��9�؜/�h�!.�������gd?��(2t�٬HJUE)��/|6�E\�`��Qa��l��F�2YsV��y�"w`�j�U.<��gC�d����e)���?ɚ�w�,�WI��<�%�y�&��XJ!��(z�k�[mhi��������r\!נ��
C�I̒��� �F�͊gdF�ޘ�e�B�k�+<S6��B�h80t0�U�<�0fV$1�b\2�(�y�S��_�_M{`���E��pb�
p����TY�7̂�>�A0�J�< �E��$oE����3Q��L14r����V�:�_�}�����|r�n|\M����=�;��}Yr�Ve���_���$I��$�\�Ƨ�S.!����,�H�#�6�X}

�%E�L�m���H�A��9Z,���L�y!Ҫ�z��{h}��ۉ�f����
Y��?�1
�&��Y�=��	����qi�08��R�g�q�;�Cf�`���(�}����/u�i��#�LN�c����1-�m/V�(p]�1Z��2�����4Nt�	�0�?n��'7J�-�#��GE�#֩��ZZ���Xb���K2���%�
6��#�b�ov3R/".|��Ƃ_3`-4K�K󈑵���(�/j[����e��ăB8ƈ}�w����R�^ ��s��c%��M�-(�)�޻�i�oG�^Vaއ�b\��@uk3�x�7�$D���#Ƞ`��{�qe}#�w�$�����ߜ�\:O]���o����n.�4�ǝ�xҜB�����!I��l��?��À8�� 4����f>5H�)���6�!��'i�0_G��Ԧ���i��<��7���7ݔ���������0i!V	Ɩ��>���7������g6aon�'7�gW����]�n��&w㋽��m�����*�\ >�P�������fZz��=��z�G��{��C*�.��]�8'�E"�|	vVǟ(�����[��nr?~��9��t�1�|����L�ziPGrZ���s�3 �$˯_�!��}���W�K/2� ���L!�=�ߋ�o� �@�b�6цc>f
R�����u��rxA�@����I
f,^Èkqx���]́��4����v|���!�9�B��+�[Y~Ƞ�];�,v�e��y� w��e
�Du�ǎ
��Ȗ�.!�B�
D	��hQB��B7�D����0��Q
ո)������b0���~%Ŧ`3'e�a��-U/�(kh�:l���`�)fnj7��'�����1LRL�J�1&B�?}n�?��؄�P�D�c�P��/;;�hPn	�	&VLG�K�K�0�
��g���.u/MɶN�B�tɇ��Z;PU�0���^nY����?����v�7\�5�/�Nα�m��\��dm���
�<�p
��9��P�PX��j,9T��WX�n�Z9f�Qu���#z��oG58J!*�*��x���?��[��㬠���>���	���J���S�Mٴ�L�,��4���oM�
��Mr�Z�1
������Pƺ��UZ�l	(lu��+ٟ�F�KM�]ZB|���E�_��D�
�`��(�8��>��O&@TF>��m���!� &Ba�	T6�Ep7�&�j�`SDX��b׎�a�D�_
��I�>�_��<d\�]�����~P��%P:��ϲx��©�X֝E�*j|-�	E6����9wY���唕��P�6Z�]�Fz�?�G��Xa��I�c���	}�t�	�:�-��������+��"k'��Z�
��J��	h߮J�M���}Y��Vh.\`�;�l�D����)�{b���N-"H���I7}��Q$�ޅ�� ί�N�T_9�}� !�&����%���4�� �H�����!�T}���	����#�Kb�橹�]X���F��S�3�N?w�k�PPZd^?,�$���[�HR���1{?�n@$$�'�g���:�_�m������-c_��)��jr#>����	��>JIq�Z_�%��v�`��ݰ�PJ�Zl_1��@��!;v��(�W��rq�C_�ؠ��5�� LKJ�s�!��"��]���*ԝ�!Z�c��C��B�sx�]�@+'��ΈtX�:�.ﺂ/s^>vv;)�ʱl�b*_�조����h���~���!Ӭ'�P��<ZA`�V����Re uC)��otjFR$ ��qbg�v_�A-�%�(�\1�����mVz������
�/�nez�H�Hӳkf�A����	����}^R�,4�EX�~ �e!r�m�vO4T�AT�ɫ�'�����>5�ܓ��Y�(/E�gT���)X�]kh����y��ξ�v�O�݅꼋����I�k-@W�v؜��g\�)�w�͹��vt�s������������
�
�>��[Ei�[�փ*/�5w�e��B%d`�:	�E����	e*o%�5%�@a$�����!�=���"Tb��rR�T��q��ve�2H�<��.T'E��$��b@�đ�o� jLwT2谑]�c6�ij��3��(R��c����[�b��8�2I�lbi�PklP����잖/��mh��~��qJY5����Pm���3�^������UҨ��ٷ�Z��-$�R��T�DmC�A����|�!sqO���"���"�-=W� ��#ֺ�|�(�Nա�,������}��c���U���A���L0L�Ϙso�4b�`����Jpt�.��j�N΀���sM�
���7�e�€F�JB
21�(�;��N੒:��������S�3u*�ב9�H(�l^�7R���'>"���%�̞��Y�!1쐞j��+�|��.�ҥ]
�P�å�[$����6�v��[I��g�b��i�#�!��x.�<�X#��9�]K�'�g�@��l�ѷ;�BЎ�͉Mq����x�
��mk��s2A�v�T�`_ڼ�\�ط��4�M���U2��B�4��-P�Q���4���߳�f��t4b'����i����I=jx�%�۫W���S��.�v���	YM��iQm�s���p�7�1�t��q	6����d��e(U�����Q�i����[`jD9'�F7pu��.���Q���Q����Xl2��Q�H�n|>��4���>�_�|���`��a���a�M<Fg�]oB�M%�z�����#xoХ
����ӥ�0�;R�(±;��s�s����z�j����Myy}\���XXaP�%D��lWxzP�n��Ww��}�
sk�fL:~��U:�z�u�rX��_�k���|����x�k��r[�E-+��p>��2�NV�m���$
�z�F�������b&�da���$86�y����n��g������W�ٮ�
v`�~a�U�)�W�R]A��5Toiڭ�R�a�ٙ��*59��c�XnMƏ�����	쐋>9hO�5�ew+�-�,ݹ#�����V��]N��~���G��M,n.��K/�U�|�J�]��!��@e��˘�N������khD�Ϙ���a�9�]o�o�n��NlhK�'Y(��r�U8���Yl��e������X��8�3��b{5�CC�晱W뼱vk�rr5���v�M�!?p��ο7�]�-�?e���ھȰ��W�}s"0�?��NgiI3O;���z�?j��>��z��)J�����Vp�U�0vɷ
#Q�_�2�2�ט*��s��>y�֒m�i�^C
���E���GG'�AK�]H�*���N\>熮�p;�k�h�l
��J�k[;}%�;aᚅ������O}�2�i,�Sx|5r��1g�GSe����v�J.a�M�|�lV�iW |��MS��{;�間q��f�{<�ٹ�i?��!*��ns�6pZӄުv�F�S����h�AZ�[˙Fs��R�~�l��NDCF]�ïi����@��S8��.p�{��{S�S�uXL}D��e����5�(xo�%�O4��J�(�=�	{��b� mY�譹r�V���7���IA���"���!^���H�)��	5vT�7{�=��%WAx�gr�MEN��1�(��4�;> ��sNzh2������~��^.x���v��Z<��+�����v�^�����i��pnF|M}Zet�����R-�
��%u�D$�*L2�~x�$�%��k6B�m��LC��&t
+�A�P���_�:u|��QN�S�����?�_��K�t ��{i���!{�Z<]^���; 9ŷ!�)�E`���>���G�'�s7��J��X�
@��LJk��rv�0{��>���K��}V����:Cj��.[+���$a{��z��fG�͜�9{�ɔq� {�'�����Ao�h����*������\U?]�hj�5��H�_ߧ�
�Ń}m@b噝��[6�h8�WBZ>}v�́Ç�j�y����o�7S
�n3s)�L��1p�2wm�:-3����~�q�PKEePQ�$���#�~.pip/_vendor/urllib3/contrib/securetransport.py�=ks�6��+���y"s�3I6�wW#�3��X>ɓ�\*�Pd1�H�h��_?)Yvv�n�\��M�Fw�_h�GGG���L�fA�N�B��]��(�8�fo�C��خe�u:��(��^�b�[�$A=Hq{5�C�,��H+e.�\�	��S���eZ�X���B��j�2�����V�L�>2(O1�a�}�����D��}p';�d.�`�U�%w��NW�j�ޛ�4;YFwK�	@�Af=eN��r�q!�k�L�W�b5��:'|�=Ik�#`>Oq,���I��`�d2O�	�xR��i��00� .d���"��A[�l��0�J���Dz�l̑d��ϒ^0�L�$t���ʼ�Ye�?�(�3��e��=��Z� ��t#�<I���@3��Eu��B���hӏ�2r�irw4X9Ӈ�j�^i�Lג���ވo�~�c!dR���VɅ"y^J��(X��2
��5p
~��3Y ��>L�"�f C�2��xW"�ć|�q�a�D�D:z0��
�#�Cx
c\%���� 4V�������=M=�#��hA&���l���z"�aaμTHF��W¨��Y�#�G�S��Sy9�L�e��>��c�>P/�U��q��!X���
`��SL�9�*� /�l�@1Xt9r�Ҍ-Ғ������d��Ef�5�Ȃl�~"d�$���Ep��˳8�q1��X1��iƫ:�A�&=��9����(�0�<�ѵ����5KA	̶�@�&�(�	pI/4�/sE�A��f�l
�
�śקߜ����')�G���f�{�,��n@�@l�F�w��B�{b�I�;�2���e�l�ȊT�A� �LjZ�bd�q��iTXX�`����~s�E�MU�������2���Я+ymR"�4
㒖�~G��Gah���X���hG�W���,��eO��P��=>$0j0�?��ց�%�9(�X*�"�E2{�LWd�R5+ ٢���a�	idZ_J=/RT�8M��y����
+��ѼX@�J��v���^�KPb(zL@�+��hL-C4r4���&��N�Sx|���s2�����]/�Q
������[-&����R�]_����n&��T�'n���j4���է��{��^�o�����ߎiPn4�"�������7���|��^#���D��Mr;|��O�ͧ��x:4.��r#
?�o=����~�_]�p��	f2A\�`|��d�í�0����wC����j��W��Ǟ���R�1@�ybS�T|�0��8n�܎��8����v�`Ɠ۪���t���h
(�4'cI���^���4��?M�6N���"���9gn�����D_�+�0#�*}���Q�Q��/��	y�/�eI��HsoK�g�+W��,����E�m�J@?���>����y�qBh��w��,"�����Dh��������%V2;��r�cpb
�K��A%ʬ�ԇ��˧� ˂���5�b����L�/����D���`�q:����`(�l{&�q�}�|-�h�g�ExC0u����G͜����/�\bDo���#P�2f5q.��Dփy�^r�so� ��CG�h�_��t|��ڹ���;�r2��觟������5��N����?��Ṹ�J�����Q6��
��?��X�u�C߫����D�PǗ薀�%s�
>a�DQóAf	���/�ٶ\��2��[eQ�3�K
��4����"�$I7ࢽ�c6OA�A�"G�~�=L���.�.*�ΰ@�PYi"@"i���Q #��cO9!F鮔9�|/��ϕ��:�&��gc���ʐ�3%��r<�y��,�vF4(�B"���K���4�9�b
�K�]
-�\�Z0�����
]�S0��XÍ���[������:]�q@�V�OB�bȮ��æY���10�c3!V%x@.��-�$��"��\�
��P��&�~
M�S������MK�]���D�@�,���.��Kp3pأ�c) 8��IE�2C
 e�c�>����J�|��9�B�����A\ʋj�58|��6�<��ⅸB�Q(��O��W�5�C�@����/���������>0��hN�FjI׽
^iX���c7�[�3�����㿻�:��fp������OK��!F~b�	H�Z?]/���n��������_�E�%�
M�C4�W�њ2%R�3��\��V��AD�Aek���G��1����'��u9�¦y� �󇃋C������S��7��}��`⽧t=}��
P�w�<w��sG4���{�ڿ_�x���7OC��ݟ9߿�l���w��p��diP������Rt�wu|��:�]�$1����=s^ϙ����?c]=cMU���=��q�����Sb7W���ʛ�����,��d|;��Ёx�m08�	�k���.H�@{�ivN_	��%�R���te�	�
�U.9(t�ѫ`�/���@��w*N_{�}��9.�0�}kVQ��0���	S4��������7
©��/�w����hyPY�l�q,ׂ�O�����r|�d�=�Ѓ�����>
Ƿ���>�#��p��^-��Q��b���a����Ru8�ݢ��
…�\.D�Fc��2��c�����:( ��{�Q9��	�F�@�N���,H����Ag ��Nj�u�C�>l`{ޏ�����dx;�_Oo0S��+6��혦my���BVeQ϶�lQ&��/-l��1Z��x�Qr��N���N��i�J����!��L]�^_��]#8��=1�����nZ�J�K��2e�����V9��~Mo�N��6�8
�aBm�T�	�儗5��E�*qi�1�Y��F37u����&�q��v��S��F�Q2�@$F	m��U�Y�����j�0�0�G;~z�sݥ�V�l��z׭'H�g�v<*�FZ&�ڤ+�v��Z���
����GEL�aҏ�#6��~��"!�h�4#1�$�i@��@hzA�W"E���7��� J�w`2�R۞�M���h����HU�����ī�G�.��3����9�S|�o��ƓpY&�~�MټL��(�z��(�P�b�W��6VS�j���5�=�۽�q��{0rQƭf0�}-����5%�3��z�H������;�W�a�g���΅)[͉�/g��|��<����d8��Zr_ތn��$}����.ְ��
��p�L�j���k�`�w-�a"�T��u�`�Mo����]��Qt�*�e����(�K����%��6��tqeX�2Ȝ�Od��5����l[���Nl.h�t<V�$w~Pt-��@������v�妆�;���-6��5�noe�*�ՃGsbK�����4U��Q{.�j+���lS��O�=����"/yG0�/�x���ܼ�ݲT�*ʫ3,���Z͈�̟j��j���m숾n�3gK�M��ط���6k�^�5
:nn��C� ���I�[�q� i����A�����sVM�	��OeҰp!,V��| 0��z^U
@����Wr�be'V���x�<�\�f��?�`٣�/s.wH3x��u�Y�_�R�(��@�K@�k�>�8�~G��؈���1��h��̯)���Tu�����K��"�E1�VL�8N%:/�}l��C1J��]� ����!K��<K��cޭ�g���1e�����u�����T����&]7�ڏ�_�+�����e��)������j+3m����c�=
�����T��Q�_���.��֟G-ƚ�v
�t����<x�J���՗\�~�5�]I���,��	@�Ej������/����.���p�,2�mN��h)
`jDU��u�T����P�$��gZ�G�*!�ڠ#�V��G��Fzq��K�]��hn��-�߅�!��!����D����|�
�k���.yԂ�
XY-�db|px٩A����%M�ZWP
�'�g
f��ʰ�V3�K�Z��b�1%�*H��
1Z�e=ؾ��YF(��d�`�8��4SUak��!U�T��`QH�� ,j�D�Dܶ��
���d#7��^�>FxJ������27�W��J���^��:���s�UH�|�@mI�,��T�S�`�]�5��f�I_�	���
���6,��=��/2�H8��=������&A�'=[�UD$*wm�������a�\d�����$��:
�����VG���
rE��_�a��B'@mA<��|�?ڃ�gmuY/�2/���y*s���g&�;:��B���
�bku�)�п��i��ˮ(xTUu�93tt0���[Q�}��0�hzz<Ţ.�
f�t������+���
�Hf�q���'[��5EO��k��U��Jw�cC��>�M��Ry2�sE�!�FõC��٠�����[��Q�7\��<s��pQ�������k>�$��('���N.�<w�E�"�@�A����8�	��'~��y�=�ƞ�P0��bG�
�x(�N5կb!::�ڂ�J��(G߫���C��),����B�E3�3[�P.<�0�)uE��x1=MA��->�ȅ	��;y!ޣ�!�}��v�<�98(����`�§��ߦP�y|�S��(��H�Ul���S	c6���3��UT.;�IT9�օ��Yfb�Ϲ>�T<�DDXt�`��S�2q8��'
�{��H�/e�ќ���f�����$�B��e�E1ᱸ)3�D��C���m!`��6k��1��C����V9m2�щ��e��с9�*.vw�Z��J��H�Va/"pEd��bv�~ˠ�$��q�9C���xBon�e�g���ih4MW�=��(���+;��>(�
.'���q#�f���~�^�&�
ݭu�:���=R
u�(	��!��`��q��,>}Jԡ 9���&KCi���L�y�#�s�5���j.�
��Z��	��hO�QӜ��Ϗ��[P�N	�2������>�3E�d�B�-��Ҷ�z��N���x|i>42���r��_�
X/�@�w���"uN����PM���Y	j�G&Ч=fu8d'��P�$t�gUf�s����m?�Ry`�S�,�������vh�^�+fޒ
�.���LJ�5X"e�req
��:w��]�������lŕ�(㤴52k�[�N��Beٲ�vy�1�����IО���_<ٝg�P�T,IW�R���h �;���8$��S�w@��[R��ի���t-�*� ��m�G�P�x�FSv;J@X�,��:�,Z	ň�"��a:A��S��m;�d�/5�s�Ơ�ޜ~�ǯ�{����=g��S`��j�vT��귯��\�?q��UR��pՇ/�=M@F�*L�"�"�W�@#/L�nij�$��mr�+}�J[W�N�v�Ӑ�c=�@'�������|="z�)��\���)��l���<�_��]������G3�:nO�,Z��8�E���P����*����1rE˰�O��C�������򬶄A�u�o�B����g�13�G�Sw�.�L� [Gl�Q�TC�=�
p:�ԩ#�
(�u��H#n(=YՎ��ӌ�F��[�rG��̸~���USI�\�)��zi1�f�wH�q2%�a������b9{^D�6��T2�9��FSO�n<��"�DS�w�v\4���&�j8�{�ӈԾz��y�h?�/lG��-�)�ٰi1������R*�c�h��;j�R�%uT9�b_����^��Urގ�b���m�ʶ�GEI�,*ŜR��%l�ׂV&'��݁P��F�j�X��n^:�������B��|�T����>��]�j��ޯ��[e����\�6�WKo�SS!�e�*>+y�7��zY/S��6~�U��NTC�Q����j���Og5��]�P͢�<C�f@��p��Ø����5��p|�F���2_4H{e�zwN�ce���U��O�����s& �s_RA��k�ގƟ�Y�C�=fMm�;I7Y�5xsKWq�II��S��BRۛ:�.m��U�xË��yb��A����qW���΍��.y��\��)X��%@�S�>�>�h^Q����V19_iuT��C��t��J����"p�Z/�
�
Px倣�L���S7*Z�N�~�ʉm�qD�����y-�X�AQ���JSm�0����mVI��F��f�4�0�}��V99���#���_S�J��]�*WrvmȵW�;�Dc�ga�G�]�R��޻�p�=��:�Y�އ/�.���<�x滑'x�&+Ck�r:’;]%��T�9U���M_���u�
!^�̰�ɘh4����49.��P^QXa�;ճU�k�eT��j�C��I�Ɲ
c��7�Q4�Je�u��I�Bu��V8hA	�gZ�'�e-)"C	��m�8H��9�+�{;��wl�������7���š�A��e�H� ����pPTe���f��&uᝮ���yf��J�܈��z��Y�MsY�^6�.������fj	�p��zi9����V3#T�a,�Hk�H�Y\�𒲝E���„��i[�Pն6r��	ی�d�n��q-�Q�SQx,�7���ʶ1��h�cn5�U���w�MD���|�����u[czgל���Nj��%�}���FM���^�gn�ࡠ�9�\[��Sv�D���x���S/�68���Mm�t���ԣ2/��蒙e�u,�`�Օ�2ƀ%��p/��AԶ�{+g�/��x��{m�,L`oAo�o�=.��L�� ]�R�0M�v6���O�9_�Ԕ�RF��(�v�D�k�i��JR������
p�U��
(��З3����3��/7	�_R�������Ŕ�H������<���N���ZN
!�V�T�:��)S��{�4�=L#��"G֩Ք�����U:�-x�*1��ZRa��&�m�G_�@�қ�����.Vf�=]�,�MI�ʕ��6�P�;�7N$�g���;`�op$$qpg~kA���UOWo�M�I�#g�3j!)��
���t�+`艶U[��.�T���s ��@��0��G
u3�RT��ˬ����
�,��&/�쟡�텸��ځe�'��<g��x=�5,���.�-�8�N����
N�
u��tU�$jXm3��W@Y�]���J�����gXM�%�f�ަ�E��O�|��Q�?>[e>t5�k{��[��f�Z����I��T%�&6����]�
�F�8<	�^���^Q��q�QeKw�x��)�]0�E�������z�'�5�;T�,��i킩�i7�wh9�F�w��U'ͯ�]Z��M������=��A4ݿ�����:��!���7�kN��n��Ix�i�W8R��ȧ� ���{?�y�^;X���`w��6�ʹIħ���H�L�>ò�Zx�����:+�-J�ʊ��l�a;��o����=��G?P�����n�Υ�ד�'����a��F��TιܼӡY>�U�}�eGz�
�9^�
���yu��߬�suئ��z�_�B�/S�}��_F� ��#��t�R}f����7o)��p븶�53	�����K\�ڜ9��:{^��\��gP��ۯl?�>�
�0}F���.%��z���XU%("�"��
.��S2������_~�!��?����֐d�Y�J4$�(Ԯ���ú��+,���h){m9��J���;����?���^6�Q���q+�f��N�.ex_�$�?����SR�ͪ�@���sp|U/.��^U��������N�&~�	����\-'���fgO�΃�[���^�Yf�\��H%��2ܟe�†ޞP���|�SH���]T6
�z��-����YYZ��v���M#_%�r��:F\}�jz�'������<I��Ħ�F��z�F�O�lke��U7K���v�:B��Ip��R��/W�L�4�L��Ӛ�:��q�H�}���[�[�c;�)��|�%��!��'��d���F��E��(F'�f��������9cGG�ő+���nL��`Q�:g�`�x��E��nԷ'I72��e좔�J���7�p{,w�;�2P��3>�R_BR��=NC.�0 �q
�*�)U'�H`�7�dw�>_V-l�A�N�F���Ib��>ޯXHdW'H��|H�b0�ϩ^�P!6��U�����hS<�Q�xQ�Tس�����ZU]�:5y�+�*���e�,Qn��Zp(븷�p��ےh^�P�����?�ԫ����S�o�Z7
ص���ߝ�5�	Y}G����v����c�v���9h������-���Zi����J���>����Bj��ڴ �{*����A _���$�#kOBid���K�;5��b�_չzn�R�\�+��:�j<�u�\^W�+����|¡�^-�9m~����U�wñ�Q=|�>F�w�aM�*P���O��e�j��U���6!������ς�;9�e���&�y��mؙ���w@�d��@�A�:-KU{�dG27��p�AL*?ȗѪ�ۅ�?QJ@�%k_.��Ǭ��z���&��}صn�0��Q��}���n�6�6��^҇�R�cw)nUl̍0�m�Oީ�рG'@q�Fԗ������>��ބj�膏-=p]خf���r�E�z���3j{�~��~�z�x�v$�~�z8���:���q`̴5W�Y��7PKEePQ]�V#F|$pip/_vendor/urllib3/contrib/socks.py�Y�o�6����Pt��{8���)�ȁ�M��٢d����D-Iy2(���{<$��m�#��?���ˋK�����S�����q$��8�=��T�h9�ZӲV���T��)'�m!59Iv?���g��L��9��X�Q+9/�MH��*��z�~�#+Z�E�� ��&�B�"2/JV�=��qh�\�J}��2I�[M9'7��?+"�!�KE����SHww��K�D���*�����p��{\whQ��!�NZr`T�����ӄr%��"��8����<���^ww��s��ow�4��J���n���M�^XI%��f��ܲǥu\�`�e��ɚV�`1�P�NB�x��4j ��$	���4�<�+��rQ��V-H�:���B�F�B`D�G�{��!�Y�H�1
}F�����(�p�[cRض5���lZE0�9�Z9�%8å*p�#��|��
�P����8��S��n��v2�{��wg�h�����L�`Ïs<9.�N�Ƿ�V��uG����N%���-HM�
V�*���Zka��2���F���Ľ�^Z�o�af/�B�1�_,q�:�����Ds�9q<ؕ1۶0U�2��
�}Ԓ\�E_z�oӗo$$FX�lYvh��g���toܒe�;��<����F���F�wf썔B�NT֠=e��NIb��^��z�<hu~�h�T~q�/+3�O��Ol
�����~h�N�Q���Ի�hl�&���@I�jX^@�CLwA<!�-��JH���R�
X���Z7
l�󏄳�"WI)�X},��^an��>9�?3��ty�G\o�׉������T,��E(����mg���6D����o퀃H0DY��ooo^u����!������`��/�α�x�N�z3�p����E@��!O!�'`'O�P����W|��a�l�{�Q�Ν�=o���k��"�~GQ�RC�5Z!��M�pߊ<���$�ɼ���K�e+�aC.��W�s�ono�_�!Ɍ�e©{K,h�Y���x�/m&W#)7q�t��x��)C��O^'�����:��@j�0J��,�����'�_���`�W��s�Ѣ����A�+��T�'��Y͠����[F�B�p�G�<�?�\dU�"x��a��Ǩ<�t`
��;��?6��sö3�bWT(X*ğ�P=�v������c�q~y�O��~���]]��.��E������:��"�1����3�ZG�ߛX5�C�1)c.�N=���h�*�R�<W�y�S[����N��jO �O��я�q*�u�T����P�g��+�/��%4]@sdr�r_�1}W
��3ND��P��qȦ�!x�]6�"�dɀN>��҉�6oT"@�V��:g+fs���)2>�����7������dS�g=UW�1������o)��)��b�IA��7�x��l�6{��p�t�����|�;u-/�9lhn.��������H=��Ҡ�zF>2쟿рc����o2�Gh�%+�>������:5���j�����9��
�!�x�h���s�c����Y
x��h �(��Qb{7���	W�T����{���^]\�h��zg��V�JL����`O��t1��F.�`�ָ��~5r���W+�ѦS�������e�o2��VAo0��]��/|���F�ˠ��}H�2՗�e
�^.ޱi��Le�sfr�K[�.�tI��!�
)ws��δ
���G�.������'��U�p�n�ET�?��=��
�h/.z5�E��	2���
PO׶�:׃j���3�!
"f��/8^m��\A��~_K���U���\�sMή�vK�2���M������6�>�%��'��]Wp����Sv��͛���k�ҷ��lz�z���i�^��=��������:�t\$�|�#�-�y4�`�ՀI�i&+.z���=�͘s�o�;?����Q��ˀ�Q���na?�z��ro��4n~�Ⱥ�,�O��_iwrF��J����`c~_y|�6�6�H�&� �� ��o���s)ILY ��PKEePQ8pip/_vendor/urllib3/contrib/_securetransport/__init__.pyPKEePQ]��A8pip/_vendor/urllib3/contrib/_securetransport/bindings.py�[{o�8�ߟ��â6�v��i�=�"ˍ��mXN��ba�2�"�:=��OCRR�d��W�E���Kj�ۭ��	ё�b�8�!�����:�Y��@�o{��=�Ï�!^�,��GdyQ��9�Ll�^��$��h}��X.:�#��ytvE�璧�.~�.ҖS�T"�Y���{�c�����
�z��/o��p�����L�'<�'':�[�6�1-�� �9!ޡG�M
�"ў� ��Н��x�7!"���`��l+x�#�C�#���!��mD��`��s�m]�/ǻl�r\��}4!(oE(�VH��a
��;���Xpe�QY�#{ڒ耶/(\Ph�&�l�QO��Б�&��j!���%p���]t6^����F�_��翟�����_�o���2'�~t����0x׃���:�>X�=�Q--���V��md9u�ŰlЁ��B����S��0$�c&�;>B Xt���q!Z;tp�f����a�=*ڟv�a'1�l���n����ݮst���A,~ WzL��gO���D?޺Nx�!� ���4���
W
lzbp.�8`Cb��,|Y�PG��x�ȑ�2��*p�><ͣaG��L���
�'.�5bg簼I"�檵�bv�X�HjsU��h']���w ���ML�,-!}Ml������2����2��D����tl�Q[3��Cw���v��b�����b���7��t>�!���0M�X1���r65�}:�g�����b�fӛ���&4��&�1V�5<jW��t����d��S��b�4��V�~;�Vhy�Z.L��|:��@�qc��}�m�
ȼ�f3*��i�`Ɋ�����j��z�����Wh�]�.�g���ڍ��`\@�vRR�)��6h3���_}=]̩I�b�^�c,^�3���i���27s�1���`@�;78u�<J@B�oMC�ilh3�4)���o�a�S�l�q%�AΑF�`H\Ț
n��vߵ"��G���~A�L�0am��+��^d6���m�^��x��,}�u*�
���&J��/N�W��>}o	q{��J}<���r1���U�۹���4Z�VH�@'z�T�ϒ]����-gO�I�h�J��O�(#H�i��N@P�	Jg
�M&6�m�l�Y�S+��$���Q17�J��-��?g�?Z0�8�t����ø�	E������;0d�tB�D�v���2�%�_Qg8�ˮ�6d7S�5�?�+���~G�A��I?ိV�اf�I���K�%lg����(��I*�1��ˈ��l�>���H�ݣ3��G>��w[/&L�A)� `�E�x������g�@#L�ռ{Ã��G>g�}c+�Xϱ�Znӂ�z��n��ںX�3�34
����ܴ�+�L�\G�~Ҷ�{hL���ۺT3�m+"'ȐZӄ�,�>�%���[��m���b/o�N(v��n�E"��+y��K֓I�a^��쇰�˿��4_-7�J*�:��}�~N����x�p�Y.,t����H�F���j�=�ѝ@�RO9�J�L����}X�)Ѐ�K+���KV-���x�"��2 ��+I1g��ò،�{����+ -��~��a6*i���%�a�F
�ޅOYˮ�m1�N��u"�k�L�V�X�k����Ӵ���!���ϐ��Y��r�'4e��7��)V��&�/��*v�8�$�
T���A��g���ƅ�>-K����_p����%K.+��eYi:6T�o"�T�D�[0]�
w��`H#O$��<8k}Y��)��z�`SVҨQ�I
!�$1A!��${9m�c�u��4�zY�T�WÈ*d�\Z�{�JF2�K�'�I���R����4I̴p�	�F���[�"�c�d�VG"X+ԣJk��Ƽ1vq�<Yh�������o�9<{�"����K�+55g+l�&�g�8O�x�<m�Sx�H=a���n7�-p	53�>��ٮBJ��-�3{4]P��<��2�'�ܓT-�P<=Ԍ|�qP���Y�d�w����ت�S��G�R���D�E���.׺?�}i58���T�,�ND�{jEr�W���L�a���bAl��5l�Ã�P#�,*gj"�&��S�rY	�D>�۟��m����U�M�am8��[�)Ki��6�W��P�Z}�Ռ�Xyn�����Of�zrSk�0=
�M���Ye2Ŀ*Ԫ��H�>�~�_��N|O"vY��dUA]�G����'=����cS�:�UmT�`�D'&vJ���Y��y2\��5����<��z!,.�S�u�Z���=��*�j�*VA'+e<Zn\Z�*��(=�+�T��_�5�Nb/�R�B�
Aܣ�k�Fҵ����	#h�H
��Sw�]MҤj[(��/}�
UA8���}Y�����ʹS:;=���h��2l�e�\�n�S
��5v�;�����s��?8	�N�'�;��s�p� g�T���ʈ�E��Py��ȗ*O�2b�A]E2��L�)7��J�V�6�E�6��j�p�����?VX���mv����=Ԯ�h'�9"ٝB��'���,^�G���u�}}���-��A{r��g-K�d?����v�ΓK�WP�L�q�����GH8~V���\�|�x�/�n�u��dt�翖QPp]~�WҮV/3�)5��BUU\>��ɖ-˿�*��5=�V\+���i%VWya�d�gػ�5�۲�k�*����C����Utr�6��/�=��é�=������T�"��/m�)�W6jïd�4����I�{���H�/�T�T�5/����<P���߮�u���hH�}>mI�
���aJ��E�/,ՙ��>�v��(�ӧ��Ռ�V��6�x�q��i�J�����q.�TMVB5�\B`��ނE.;!ZJ�>����(�*�,�fO�g��NK<�B[c�j��hP���w� cI��R�$uK*��Q�Rf)�$_kWy'
w�P�>�u�(�T�폻���>ϡ8���Z5mم���7@�>|H����
q"�|A����(DV(}`d!�:�зl�>ɑMcPٗF�L��P\�ݮ'�������yp9��A�|��	&��Պϕ���?,<�8��`� �MΠyXjA�o]�̴u���V���L�/�
�)�vj'{��_U!`D��G�!�}Z�7��`�'*ˡ����9���?����N^�̭�!�V��j�+l�Á�qc��س1���S�b{�ݠ���>��3�{˧��0�^��~�$ğ��;O$���{���؇̡_�
=\�U
��GF��[l;{�)x�"Ya����Y��r\X �P�O`��߫t�ӗ�?p�� ����~�����7W0�=$�#��](��@�8�(�ɜD��ߗ�-
O�^T�wz���s�|�)��}��t|:�?vJĊVQX��w� ����7��HeE�n��<y+B�Q|Bq&P�I�S��5	#�.ōB��Nr.��˨�:����@s�@� ]\7�e$:�
�3�>BP��k��9�蒼��������@Ec3�-�r�@�%l�5՘��p9���$�X���ӹ������@B��l6�#!&��ǂ�,;^cG�P�z���0d<�|߁H����f�8�d�=;a�cX�+���CiB
�!���ӻw;�]-��ͭ����N���]��%���a�n��
�iC��p�@E���ڠ��چ~?��ssv�~�E�٘�����g}p��V'YF�z9ó˔	�S9Wur�,�j9�����b�m8\H����J�)�ˌ��3���j�U�`�%�J/���Q*�\6��p��B��y�����W��QqaVV�N�Y��Cc9��*�KM?��H�Q1������XM��U�����L|9��8	�P
���"��D�p�pt��, ](�d���PKEePQ�
]^�.9pip/_vendor/urllib3/contrib/_securetransport/low_level.py�Z{o�8�ߟ��bQ�p��P,��"�����M��W� %*�F����o�H�v_w��29���f��t:y�7G�zP�X��Q��6�[)q��ި[#�Ѧ˲���M'�ەj��F���n�kQ�u֕�na���Zw"/�ʺj+��d�r�i"�*�V�Գ���d��=*Sm+�ީ��F��T��[Q�Y��p�جt���^	]��I29�F��}�K�I��&0.�R�9uO�Y�Zީ��;�-2]gʀe
'��X뼯�Y��Z���� H��:�E��|��@�R򾥓�JT�D6�1%聾�[U�[�I88T�2V=��U:����5[A��g�S�mպOe�L�u5<0ʽ�ó����N���'��k�:�=y@�m�"�(|~y��&��#�hʨ���F�ύAu���)�H6�3r)�^��_
T�K�0_^����8����Y\_�S �fz�w�D�k9=��o�_��������=�X'�_gk�t���Ί�)���={�j2�sU�EV,����Xn;�&�g@
�:u�/T
L�s�E�}� ɖ���fINJ��[��6H�7�
\��ܒ�3YUʤ�Fu��G&H��91���h��˳�ҙ�y�
�W�<�Ru(1щ�SRXCD�����@I�瀂*�g��M
���F��YI��N��Nn�x�j�ВG�=��b�-�}�^m9dի���"[�V���&w����"�>�H+�i��Ҡ5O��9B;ֺ�@��>K6K�ঁ�?�h�6���.3l���Z1�|�4bp���P*�؟j{A����o�o<~�/�c��E�}]bNM���R�g�;^%x4F�
�XN�;ݡ$�O(c��6�
�S��0J�?����/)yT��I5ǕR̟��`�>��A�/d����h�]���l;n����|s{q��v��:���t�]X��Uw���v�{̈��&�qx�E
:���n_>�����	½ѵ:h.��P&����&O���l6l�j�-�{�������0^ +��$:�������F2�?`Ԇ��y�b�0�=�YL��]U�:���&������*x���Ѐ$�^�?'��{���"�`�)�6����k)Sa�VFo0!{:(,xU���NQ����T�>�'M\�%�Ax�bRxsj'�F�y��gX�H����ѫ�'��!�g�mq�]�d���0�z4�{*���8��O�nn:�������m��h7��N�77�.<���ʄY�9�C#-0h�:��s��}����Fys-��[��e�����v5J�x (0!$ʜ�.�J�u�1�*�
�����[�,��\�%�)xe%3�,���`%���֦�',ک��A�t��3� m�J����lF����F" ��և�%Ÿ�ͩ�r�1AV��L�ha4,ǥeQfT��Fe�A�No�}Y�…�u��e�� �8���[��1豕�Ou�}�
|���u�F��ccޔm�~r�CO�I�iP���<{T�F���ޮb 1�v�㎘�I0�i����ن��n��D�s���hs���h���jcٗU�B3>,z�r�����'�x/b�C^�iS\��酈���(�BgK~�|m\�K����Ɣt
�s#��嚳"ho��:��'B��
(nt��v�{�r���XRVP�j��B�-�I�k=�׊S����,�B��@���T�>C���s�CR�/������Xx�@�2G��m\@:��7Iri��Y�6؏A�F�1Iru��
;�k�	��n��CvS:����u�(CV���{a=Rhrԕ�	5�0`sN81<�S���L)�G��Ƅ�g4�H�:�Wv�Ǻ� -��v!��2'0F���8"��'��G^@l��F� y2���S��������G�8Ld�����8V��w5$����\���$N� 9t��4�Γ���4��ZI8���i�o�3܅��U�L�����K藔���F=s�i;Fe~��͎dj�أ�3H-9�N�bSV�9Ԅ:�Ή�3�|~��|PS��Z
D����y�QctG~�
���!1ht7ʒ��=!�g����i|bĩ�m����1�� �����jŠ��'�?�vqC}���O3��x���#�j�:�.�È8]��>�iߩeAER��/�w���R��z0�ӛ��YW��_v���4:{�4�����Ni���,��'�N�����x	���W����QpcT���f����Y��<�y���t�P;�s���pVl����ՀJ�|��el��I��@�'��p�ȴ>9mt%F\�}���`m��K%K�j��Ei�2��	���-�%�`�����[D=N�Q�
�m�j��q�&m���&tC��^25���_aױ!��v���Q����¯���d����'�O<�OѾ����[���.�b�=7���w�(���M�9G�}�Q��<��{��?BD��K�l)�r]?ƹ�Q�	l����]���vL{�=YQɻv?U�w�+#�x�0��^b<7+�z8��X��I0H�\P�hq���Ю3"sMO�=>���xs�C=g�H��	{�Ie����Y��tx���׃p���(]�@A}��e�B@գN��=�̵Z�J5b�����{��!i0�A���H���)�O��� $���I%8i��ңIB	��3j�JB�����,����]=�.�`t���^�񽮿b5��~.|������a*N%5�{V��<܀���>��]�5� G�zO���}�����j���r���.T�,��YU�2�rg���S��W�+����]*�	��]u�^Bq��A�GNJ!`eE�ta���X	�v,t]VS�Z����8�^k���N�%� ]�%�)���9�
Ġ����I��=CZH5���M����0�|xg�
j�&�0k�]�p���{}��=phI�5譥ԡr�P97`n��bv�C���:�
�i@8��'��J���ěB�e̵j9�/j�j�(�6���/�:����-8����/E�=��]���Ë��􄓰d���;iCY#��0�mtUf��-C��;y��I^H��#q�#�eAx��H\H�APm�Dt��D��xC���R9�����xoiQ�@���@��7��C���H4�|@�ak��+�	HL�9�χ�ex�FH��f���h��EА�����@�Й��%�
�a����������a�%�U	*G�ڶ�R��
B�b6t�)w#$CA��a������
~9b��h�=��&ѽ�7.��	��sŘ�(OisD�r0GѬ�R�"�h��eY1�Y�V�|�a���S\gNf�Z�T�f���s?��!�����A©��t��H���z���W746�]i�u`%�����A���d٭�;E��b	%�j��~÷�#�/���šo�,S�z��3�"��Zmaq�����km�@{��<���">d�nf@�zb"��X�\ZP�)I�L��^���"'x	0�?o��B@
r|4W�_�a"����#����V�&�q���C��_R�{W����ф&d0�"�tpjs��F���;C.�ȏ��)�w����lp��(�l�!��q�`�����n�n��Y�d�9�3�U�D����0�Q�8{z���
���x�_�?��q��G�c�S��1�~P�2�>��OF�_,�Rĝ	�J�"��L��=�|Dh�2ig�7K��='q�EXj��tk��+αs��o.�'
Z`�������j���Ndg��PKEePQ�9��Pl(pip/_vendor/urllib3/packages/__init__.pyK+��U��O+-)-J��W��-�/*QHL*��)-I����@��`���9�%����%y���\\��99@l4�0�t4�PKEePQ�U�#pip/_vendor/urllib3/packages/six.py�=ks7��+pt�Bzi�-9�;W�
-�1w�:J���&�!(N4�a�!������`0OR��N�2g��F���h<x!���&�o���y}q���W����2��]�������(�輀�x�'���O�R�r����r>�XJ-��t�[9i$�p#ք/�Y��
WxP*��t	��h�>���p�$�|(�y�e+�n�%.�@&��.��^)�n���K7z�.��L���(KE,�4�=�2 /��ȇ�����@tG�p�@=�ہXEs���*��f��,b�#�Y�Bb�����Q, k@���9���Q��U�)�hU���<-�8�b%a�#����RLA�E�VЋ¹��J�Q�]C�;��%U��=�R���X�M����b&��h��[�U�<$)��b�Th��Cf��X\]|��<����J\N/~���ODwt�݁�<��x��Z�tt~���� F翉�M�Ob���t|u%.�@lrvy:C������g�0�/����lr
d�/�HEl2�Brg���Gx���N����s���b*F�r4��:M������X8���S(g|6>�B��&ƿ����8:=�€���a�\���ߦ��?^���'cH|?�F�O�\T�t49������1a]�!2����1&b�#�w|=�8��_�_O�uu�^�ϓ��@���+ˇ��V8D0��L�^l��OWcCR��G�@�
���|��t��O��ƁN,@)bx&=�K�,1C�������! v:��qY���q��B=}M����NG�/��K�(Ht�~���*�i�dc���Z&����CiG�[qy⇙J�iM�����.��C>h8��9���4>%r�Ty��@��8�B���X,�i����;��	�l�I��"��F��>l�>�췵��nďG�w8o� ���w��[�$�=x�)�/~+�<T��W�3�A��1��#�)m�n�ѩ�M��ƌ�ѯW��+�W�c�Cvd��z�fn"9��ED�m3����c̺��*�Y裆��5���:pSh��|]�&؁���n��5��⯬�n��n�Cqx��dh�rY@z�7��᛾x%�0��X��$��s�yH�K9J0Z�H�?����I��I�y�$�k/������r�HP��Y�R6��L3�Վ�O�M��~�&Q>zr�����M�8��"���+�P!q���rbZ߿݉��%Zs�_��I�|�@�CO3�XD���h^N0�a��v�
A1a� r𫉳#r ���ݕ̩O�Iq�@��(v��*��(J�FM�rj
u4q��v��#�#
�̼~X-�S���xqQ?X/ pK�b��-�a�Ӡ��ӱ�ne�d��&�eY���!	^��^��ioJ
�r
�Of�Gw``��`Y�f����-��6�p7�:�{���'%i����W�J,Wѽ���5�3Ò=�u�vL�U��q�RF�X��-�QS�L��AX7?cu�۲��M��C�pt��6͠��Y4���P)��a�4���F�Uw��Jc�d��(�ɇ3����i=*�1%���i*���b�a�EI�(�d���m�D���y)F헹�Ԣ�����_���n��-R[ژ�j��zU��3l)��ڙ`%�s��U��#�7%�� >���
�p�ůPCW�NrS��a� V�f�.��F~�\z���la���M�̌�>��P	��S��=N7���h�����V�t��[%B�Q��i"@���@���a����SU��&�`wv1u��^!�$�2�[��>��LC*#�^he���=��(W���]���i:2�ߑX �I�R
�0��-��hC	�� �Źs���\. �(�/Ǘ�����@уȅGf��bg8y���1&j����;�D
�W����jlD�wh*�d�P%V�%�)Aa���!T��E��/�4.�f�饁x	��)%V��t:z>S���2��Et�]�_��K��H������O+)/۵��iS��y��[��]�c$\K�U�?6�>���U1���&��]?�����{]�Vv��A]�(X�6v[�V��(O�	͔z0�F�p�bH����pቕ,���BU�`	?����~�8�������L����ޜ��	ar����2��X
��'����ۖЮ��L#�3P{�gH|���(��0e0)�,-x�eDs� Mp�q���Zz��vBn� +�x8|+�K����w��fPUr�&&6mh5���r!r��AqB�UӲe�l���|[�(�Qȹ�lw���02�
6lu�mv�^�%Q{*��� �}���4�?���:��:[R�I*W�[-&�qc�FJA�nZ�oi�S�����SrC���YB.E�]�f�&�^��7)�A-�����gb�e�A:4e�0꩞V�'�p��+��/%H���5p��,�!��G$6۱��8~h���5�4��u���4�m��%�������z��iւe��g+���~�8�d�X��
o��? ~ئ3ܝ)wPC��5�g]5PzK}eP)�ߪ5�2���Y�h�p���g����a�N��t|�l�*Kڀ�)���Q���^�&+YE�S�5�~�������_O-��𷘗��m�0δKD�7*Aگ�R�8��z�zQ��o׸�D���/��a���j����:��l�܆�4��g�Iu��<[�6N���K���^�#�L�5�ѝ/�pcf_�@���y�
	K�I�*pp=.U��@��dL�Ѐ4������y#�us�0�%h�5�:L�r��Y�[�B�P��lr6~_HA�!m!��m�Ҥ�D�l�U
5O��Ϊ�D3���۠U@�
e@$�TL���Rp��H���BT	��������+߳BTS��~��q��PI�Fኢ�"N]�6:ޥ��q�j=�����Lf�?�P�u�4ka�Ȼ�i��N�W͌Z��E-^(���
���c�3�� "ozb�T�P嵡�V���x���`�H%^��\��z�J���Z	�^�ܱ�T�+��L}
l��G�cj+VzG��Gc�k�
)�,�jybk�s��L놭
Q�-�H����S��͇�Nr�\ySJ�M
��ҽ+�`z�,%\D�R��I�z/����t&�Hi����
�bA�W���������%��Q�i��&��%���}I���$5�&���$ۈ��pG�(�Úҫb�N����
�g8��>��9
?)u[���N/��Kʻ�܃7��?�G	M���f%���wTu����Tՙ\�,0�*�v�c��ӱW)+D�F'�,�O���ߐ��Cy��~B��C
����r��$�)���.��d�Q]S�y�rZ��K<GŹ���u��z�(W3��[뫴��+���6��d��%����4Z�P��e�Oi����^��C������<7�``\��{"��ឨ6�Sq���Y����p��$�q㻣9� K����{��+6�i2i�ж�RQඌ�6{td���O�'5&j�͞��1��bf���I��yh�FM�����T�d�G�L��� ��^����z:v�������S��[��b�����y�݊Yߋ���i評tZ��-��q�.j��h�l�
(,�jQم���v�
>MO����5��Pq"f_�cd��^G��R/n֚��R�����Ma	w/�%�V���k/�UӤ�E9wkԣNau�v��%8�$�j*���V%��eX�y���%O���d��n!�K���Upl���-�u�i�+�u=�
���ާ�$��4��-$��ȅCr�p��Hk*���s��*�%��Y7�~�<���fE.�!<D����K�^S���h�fI�^
��Q�.�[ɯB���P�;�q�kT��P�~=����8c�,����zK�L�B��\1��|���X›�߫(/�n��������>����<�����ѽ�i<C避gG�4���Ѩ��"��Bh��W�p[��&�
�M$�J�$^�uf]8���P'�(��SÚ`9����cj��ޕQ�Ϫ�e\/���h_�!�sp�C���d��0��f��[적�=
Ak`�%E^6�[o&sc�㾞=X|E��3v��)"a�o��a]�I�Z8�Q�r
��[�_�q�9�����-ެ�E�nc#�ja!�"�}��5�8�n*�[�4�"Y��>*D&r5�O��	�C��.x"��O�P��7u3���v�SsG����1MW�p��wF�ޅ��ڕ@�ֈH���c�/]3n6+����*Z�Mg=o��.~�RH �D���=�5�npC<.f����j�?+�]�G���*���t�Ôr�:ڦZP�,}^@��ۨ-�T>�B�ťa3z��|y�j��z���yK�;��]�Z�(��c?Prp7<���Г�t�<�*��'��L���'�%����Ag�S1oγ#	��"�m��@���ȿ+V�_�c]
 �*`����4U���P�;i��w�8�=C��ӎj�sh=����(=?�����N�n�f�s����G���
�_ W�v�M���.Fw�M�/f��␎�!:���#�K�)�c΢,�;���J�r�2ݣ�a\�aޑ:u�^��*��4�P��xAR-
�}��"�lJ_�W��R�
�5�6H��9,�����
��C���T��#,�4��#���>`au'�i�esXAԵ�;��e�G�D���7��`��n��j,��TyC�@�qF_�}ohW��R�����ˍբٮ���ޭ
J8��k��@%��6�*�Z�G�u'7I��y�P���|H@�/b�&��
���O��`�:|��ڎ�P6��/�Z��XiP����]�+��6q݌@�_rg�[����6al�I��"�n5ȓڃ���ص54ēZ�<�U��m�;da��
�\2���9��ƛ!���0K[(��m��s��J�\�#�`L���dIP��v�����i$ߩ�?�^M��y�Z��ې�Wo��YV���x�������fI��N
��+��B��~z��w�C<������r��֠䕧}�j��Gډg���j|���#fQ� �P�Q�{D�9�Ű����QOqz�i:�3s���iP���S4�܈��k�5�N� �����9A+qݭ`�`	��M��ީX<�bǂv*�[��������wn�뛺��
 �3P����T�i��a,ׁ��^��߻�?�Ч����s�Rk��Z~(k)&�Pj؛հ�sH���v�F#{�l1~Z���k<[G͗ݸ=
�9�/~�s���}-�r��:���-zK���>M%wRG�f�"�" o���3����
�j�Tu�K7�M�C�'��c��"�~��](˪�ޅY4����rK�'Q���A��џ����]B,i⦗�U7�|�Re����
�0ӧ�k�|�I��B��������tVs�,�,1�P���Y��j�~����j��;#���N��l{<y͂C��Q'�9A䩗�5c@�R��Y�!�l��>��_h��2]��0�rpZ��{o����|���r0�ͭ��s:�^&��&e��҆�bԚY�^ā��%L�6��˾B�;=[�;�rA�YW
��Z}�UB7���J��gh���wm�b���T��p�Y�+kf�e[��VO(�D�Z0���԰�����Pٯ�u�|w`�,�Ng
}l��P	�˓J}�
�b�0�^px�B(^%�&����`te-|K��+���xe��u��#�pA/I�Q��M�ze��(?d�Ǔ�eo�n���붾9D��ȏb�9Ax�$/Ą9C��T1=Ѹ�u�'��F>��O�e�z�B-`�H�_�#(�uQe�C/�C͜��*�J�h
,�ty╱�(T�
��z����kL�M
�?z�h�c�(Kr�xpC�����<B�d&����R�:���WQ2�Q4o��J�\�Y�1ȟ�t�H&�3����@V�Z��*KR<YY��L\uA�:N0��j.�`�J�%��N5Я]s"�c͑�j�p��(������8�[��d|�+^p�ޯ�/�E��J��$d'��@�RzU��&�]��f�t�lF�����u�D����[�4��`A�n�1�9I$UK	(�[U��\	�FE��䊁�����-d��)I<�v~�"��f�r�d��'s����@qʡ*��Hu�O���vk���dY�1
��E��PupgɈ�qw��,�C -��a�
��ɀ�{TZMU�O��:��۾�<��:�Y���r>0	0h�oC9?�'A>OG���3����|�w!]���z��wՀ�<]�hiU������S����Y4�
t�}�/���T��!�\"�E��œ?j�$U���
j�lZ���(�O���	
�Ւ%E>�0�&T�V�|6���"�1�:pC��EX3�tB�s�R��]�wX
���h�d��y�?��M-����ԅh��&�<�W�Ѳ/�X��#V-�)���H�	t������ �����t���u�,��m'��
�������P7���\��ƵJV�Z��C]%So��T� ^+D)�1z����
�
CO���(�ҋx�[����mz�S0q4���z��0h��r��!�h��D�,���_:e���A��!pSȢ�B7E���i*����Rs�������W��^]ˠ�U� J�����O&U`��T�\�*j�~)�ݘF��)W�d���#%�WSDQcs�FSb!m���z�Ҏ�Y�x�_]=�8��KC#��%�|��|�w�YWi�c�?Xc^-�W�w�.^����t���P��9�!'����Bڴhߢ��D���.��������E����Eb�`�Vbˎ
+�6x<F�!��ʾ�&�7���~�ب84߯E���-�Z�D o8�B�,�	��f,6Be�艢V�e~�	��A�����U����4Y(
4��>[7R�
��@c7��]I�KM�����<�,�%[c�m.���8_N����_�һ+F�;�B	�����5M�!�s�o�3GS	`�~
3kI�>�i�x����b	|�_p��VE�7�$w����'�*2a�1�W�—�:���L�B\+(���0'�Uu�q�7��M~����\����SK��
���$�}���^�&���%~��KK���RhvK��偉��Ȥ�
$�H�j6w龅w��CX�;U�w�
���Q�#<�/��&C<A���nDU�^b��o�ĉ	}[��&�/���:I}�DD("��aH�jT�Q�+�p9�x�>���
a2!�/�V�QC~���i*���F�X3���;�����1���:oh�Mr��ޒ�feʹ�M��f�J1�ō}ڒ�B�O��B�I��ۄ���'7r#X��q��d�Z�
��#Ő�{ D�Q�v��m��NQ7I�P]+#�CѻEX�X�t��F��G+	�n��׳�(�KDM@��6
�P��5�e,�ML	���B(�$��(d�t����۪IP�3+�!�"満:�6ɠ��`\��5�'�k��QW����&=S\�]�f��OS�t��E2e�����4-)r���a�*�Wt\Աh�q&t6f��&E�E�����o����@V�
�M��/����X�ڕ���ͫ�B�����ǔ$+��a�P�T{�3�%�;�PKEePQ2pip/_vendor/urllib3/packages/backports/__init__.pyPKEePQò�I�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&���ƕ.	��l�$n���Rb�0��΄�}4��YbA�¶�*T���8���TJ*���+��{���O���F��
'���ɼ!���L\g\��ۣ����B5�(ƭ��X���u7�\�b5/���L�D��j
�=�����3�i�yX��q�P�*���{e��>�]�1���hϜ�V1�n�`��(�g|�y���D��A��w�d�?.�h�[t��I���)��X+���KU����]���1T�l$�ގ���?���ܭ/����v�}~
(�!!�F��=>�,Akh��i������74�Ζg7`_����Ǹ�EnV׌��Ex{/S(��ؽ���#���ǁN�K̕ռ�t~?34��~��o�w���j��~o�Ar�R��D�}��<N����U\��PKEePQ{I�\>�;pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py���n�0D�Q8R��R��V��K�	��7`�x#{���q($$|�l���۶c/C�2��S��f��=Z-�N�8��-��]%�l��a<��r=�H`�8j'>I��a,��X��<@�a|�[fS&�x���+�j�3���D<.�m |&�w��/��4]�#
�{2��P��R]�E��y����P�(n�3����K�	�<����h��N��[M���Y�l���U�js*e�R7{rT�����@�ᚢTѪ����)����X���^`��G!�8���o�y>XCe�TLH)�`�ߊ��k���/PKEePQ�|��@Bpip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py�Xmo�8��_1PPDN�in�=�@Ц��I�i���Z�b�2%�t߯�gH��I��w��"�3��<�B%I�v!i)\��-j�X�tL�J�N՚JS/�r�x>��oB�Z���R��*}MWW��$IF�:����ۅ�T�J�_�Br�ty��*�Km%	�_�u����m���!̺�R��5Ӄ���m���\�ⲅ[V��Z6�qdd�d7�Q�F�vZ@�\�\�y�,���4{�����FA�YI�1v��U�Mp�1��ur9��7��B���]��J��������:v�������?�~S
�f� ��Ն��^�_������	���h�f�V���1��F���?�%e�] �f?f#g6���ި&��H]ԆZ���\6���ScjN>=FԵ�f�a,�3��]Ӳ'�!h1�+�}/�q�T�p��I�*<���۰��%�
m٠`_Z�	u6N���ZUE.La��Ӡ௭�H�ym
~�޼zA���0!+��eˎF�TK-Wו͔t�g��9�iO�S���c�?|.)I׎
��ne4���A�]����ۍv�v��d閰vB{F.��t��m*�R���[�#��,	K���]���İp8���>�Rw<��vi�׊��ö��C1ؽCgւ�;�?����)��ZTH��a�.	s�ܥ���PG�52w��X����K#���AH��+dچ�I$�Rv!�HDS�@lH,�P��ޕ��#j�.�5��k�ED���֐�
��6�*8[��_�������4̇C>͙�SJ�1�5D�R�cl#r�p��)�h_ԃ����!X�"
���q�OݻN����
���v'���Rp']�r��K:�xK�aS�=ꓗ5(�Ş.��
��3��/F]��H�aD�&7�F�J�e�e`�a��{���s���$��?�w���r�=����YY�&����j�>[ĥ�U\Q=�w\2�4��i������m��*B���Ƚ�r�4���	��br96�!:ʢ�S�"9h�F~)Np�\Υ�p�E�N�ۘ�r�u/Kޢ��h���R����
�3�a��I��F��;ǝ����t�u։wR݇C�A�d��Ӯ���՘!_+�K��?��	�X�J�y���
.��,�֨v�UBG�C����K����@�;P��ƙ������%٧Z锥�ë:6��|~�������xUl�B�9���g+�x�K���`��~jҹ?a�ag��S�MJ�5��ңI�kl�H(����'��J��Jk��[�-�8ҡ�Ǔv�PM�,#��-��[�ɳKj�J��v�F�]6WΏi��]�{Y*͑Ąv]P��S�?�v9z���)�Sr�r��*�������Ep�W-��sH�C����늕!g�'HƜy�vm���R�����ƪ�פXN��-lD;��7�J��Nx�F�1Sͬ}L���"8 M:�
�8�|ކ��}���0�
q�]Un��;��M{�"%
�Z�0�5"�«�Ɵ���tٵth��W����{�½,D����瞥]�������y��ń�^L��}3'&�-V(twX����(�Ґ.4�
A5��v��ȫ�����q����F��*à}gD	]
`t&�;A�d��0�>�,���,��⻇�u��T�S�9��������۳���|οxs�ۻ�7�/�́H�M�h�i�=��I�6�p�;g��F������}�ޓ�e�7������	L'>�%���xk�����WU��"_jQ�1_��\[ŷ�DI����S�<o�w{���W�U|���J͍0`oF�^������[|�Ƕ5=�O����F�=��}�p�I��r�N��B.��fB7���Nc�X�S*��6,v`[K|��s;����-C|��z�Y�M^�8rF�n?n|�n�x�G(��߃�o�aG�!x�p0,�U���߭��d=b*ί8`5Pk"!����kP,u����o�V����������z����.�s����l!D-W��~���G�
U�S�>�v�_��W"�|=���i�cL?��ݖ���w߹��?��.=m��4��&���+��a\^�&���G=��t����b�p�qoA����Aԉ������r
(���j�1ğ�#�.��Z�	h���=�	PKEePQ��?��$pip/_vendor/urllib3/util/__init__.pym��n�0��<���t%�7衊��JQ���4r`h���MҾ���q�f91�?��LGz��&B���	y����Rg��K�8��t��Z��H��W�+��Y�>�����V8-(�H��u�eύGl��#ߦ,� ����6t���:n�	ሲE���=ZLN�4���k�h�)����Z�?]~��VP�ޖ⭂��b���H��������e�pi-��N�H����3B3�ނ���owfp!i����}Y�ź�B����g��Ԁz��4�f��z���/�,�"��?�Q[�(�"x)��z[4�w��g����;t��=���B�a�Ⱦ��_��W��U�q¾���m\L�p�]r��қ��ǡ�����˙�qטq�\�X�;��aa��ʰ�)��=b|7�x��jްPKEePQS�:�+&pip/_vendor/urllib3/util/connection.py�WYo7~ׯ��e��N! n�Fۈ���(V�.%���-ɕ���3<����,��7�7õ�;��u�j��Į��[Y-k���{��.�p7Zӥ�K�o��Y�?��k��]���X��&7���jVh�X��9�*�6B񜫽0Z�F���A��*^8�U^���	-M�gp/�C��S[�B�E1����G�����9�5�-��!"S%ح�e	+<#��e6� ����~�/�Y;_n���Xe�,�o[�%��_�5"�j��~�*�kA�/����[=C�P����<�Ƃ��r��I˗KpڃI�	
����ex�R�
8ÔE��r�<��.����pǜ3޳3��x^�ԟC���_=�ygR�h��uu�U@�|��S�410�u�fa�@�4;��5g�.Hg����J��[��[n8�8:	�{�28W)'�e�xB`�Ď�ڽy�=n�_^}����F�3XP��k��n�+��
3�ʧ�}�x�E���a�Dt�a��-s-��,�i�+6���0i�:�ɵ�a�V��V���.�
�s[��G�Z`=	U�\�ps���͞�0�����(�~w��j�6����[��a��y���gR�&�Q`8����x�z�[;Y���������W�?,�����ϋY,��<���P���J�7��TM1����x���J���C���\�5/8	7a�⩫+,��r���ՈC�����|(p/��8�:Ov�q��F����}`�(����+�9�Aw:��aA�7kP�'����3/���F�&ƕ�ҵRQL�tA.����K$�x:^���tH�^�0�A6��`Wc! �3n�k~
>�XD�=��*Ji�$�%e[�}In��2�֕�'AO���ϰ"������@�h\G�K�"rw����2��q� �v2�c<�8��Q��H^��%v�r��t�3�깆I���7L�k���L�P_�_�y�RP3�֚����5�^Rj������ m��_y*�&�Mig���_豕v�,�-(��@�ĴyD]��%d@
v�3O7j��L�F�Y�K�Y��cwo����>����k*lG��NϠ`
���=�ڠ��B��><im��z����19!*��uJ,�؋�ʑ�#f��{.#Y���<�6�&Nj��'c�.I'֏����t�-�����<Kx�I����7p��'Ó�GN΢&�
7#�ҙ��8D�8M�|�A�?�X�0,�c��tZm?/M�'7e��$�$�a�����dܯ붞�78`X�l��o�CʃyR(%X�	�Ơ�� U`<?Te}����%=N�t۷�U%�!(�D��Q[hU�h��A2`�)��}����m�Z*�&�|����S<�g938��#��i11V�Z��D��^/�S�z�o���t�B�q�K�p(�p�l.���g��m'�VqnC�-REBeǯ��˒\�/���Xa.n�A��a��]�
Wc�Cw�]k���T�[a����T����DT���"J�I����k�9�Ĕ�s|�Y+�Ԝ8�O;���`s�W����H��_���ښۋ�^]��=~g��-��_'��B�O$;���Өuy�aYħÁ�cW	���z�e�փ�q>:�Nh��?�
I�6pE�0���T�๣h�'D��(���өoͿ������|��ĭU���v"�3m6!"�?������j��xy�o��Džg��^�/Z����� M
�p�D����!fI�E�Hev�>�ϟ#��PKEePQ�,{0��!pip/_vendor/urllib3/util/queue.pymP�J�0��)��	Z���WO+({O�4�e0ͤ�Fŧ7I����@��	���	:v��؋�#��uh����4K��~S:a��U4D���,��o�AA:;x��U�,�Id��T-����J��h8c�Kr��A���ek�裠iz6�a3������N)չVNd��U٨�{?�3h�!OS%��
4�OFt��q�M�`B��Z�o\"�c����8�LTk��ⵟ&���Л�6��ֿuo��PKEePQ�.�H�#pip/_vendor/urllib3/util/request.py�Wmo�H��_12BI�c8B�HE*��*U�r_N'wcO�����]����ul�M
��M�}�홗l�� �6�kfȪ�ƁX[]6��9ڰ�ZX|�Y�x�*�F�i��"��hS+�{��rx�&s�m'��9�Nje;���N�B�K|����1�D����������닷��	ķ_d��)��8rf���>�F�])AX��X,�JM����ҟ�
�<�K����Wق���K���Ԋ'dF�6qeoN/.�__�_^�mz�s7_DQDB%�0ۢ(�ع�C�3Q��x�V+L�K����T��	�o2��r�Kʃ�3Ѹm�6�~�=*��f�ȷ��E�W������ga�
�>4‘)`�S����4��ZQδh����͵i��&Qf�V��B�^�+Kev�CNB1�	kk�K*�RZ��k�!Ѵ��3BYf��a�f6�_�dY��>j����r]Ub{ﵴ�d3�IFq�,,�ny[M�-���z$���
�"�l�o	���{��j٘���_�>K_�#�C惘钮Xd	G�&%*\1�w������6�h3��R�Y��G�6%�5��,��!#����,�$j:�����3a���W���z��帮��fIX��+�*����>�=�נ$f+�E��l��
�o�0� lH��=_v�<��o�np@�~��=����Τ��:�r��pz�0|k����}��	�D�GB�\���@�ş�L�|/}ǟ�$��_tiu�:�z�!�c��k����=�z<�'����HXa-�+_e1<�|=P��@�6n�f�ѹS�p��
���jGiZϧ�CR6�>0D0��֒�Bh�6"��8�s�.�H­����|M�J�8��qtRD�~N$P����C�m�#9ڑ�IsE�줥6����V����!g�a��4�Ս9��,��h˪�v�S�C�iel|�A�$
B�kg�ò���8�/a݇U��O��<��v�_\�u+�����I�?��-�*�f�����~{����;.��O�\�|;A��nZn�������'�>D��bo�G�-oD:=P����{f��	��Y��h���Opk�;#+ad�o�Nz��,$т�6A@d��8Y�}��Dz�wxXU[ڦ����n|�����:��,��d2zL@ᅲ8���v��V/0̻��.��_�0���/�k.Ay�ʸYy�O ����P�Z���Ý���f�ŧ��}�0������P|tߐF�e0xlP<��h��&v�s ������c��V
�!�n��e��o�f�����ئ1<�2GҼ��PKEePQ���/
$pip/_vendor/urllib3/util/response.py�V�n�6��+.�E$��fӪ��m��6(�bv2-]Yl$RCRv�A���=���-��9����(�
�x�Ke�m�l���jk�e=+��u��{��=�ѡ1�/ʖ� g�[��FG|/�7\���	Y��)��n��TQUX�EmCI�U"��y���}l�|�ph�4�����Q@�[�k��`i(�Y��)��S�~^�t4J�#�ҺFg�_l������YP2��r4��PI��րFo���~}�g�����az����l��N�(��ŷ���\Zϴ�F�{΀��y�Y;��?�cv�_�P�}NJ)��%a*�����E�M�H�@
��a��4��]O��/��w�^��m�I���3�8a�ko��
�m�ҧB���v&��,��q�N�P��qJ(z/��?�3�?:����%4l��ER������=�
h�o���F���Q�rTMm��D-"
����Z�AB��z���G����S}�<�[�y�Q�:�*7�g�MX�E��N�e3Ft3�0��,�;$�\3F�s��A�H��uu&�Zˁ�,k�[�D8a�I���V�v6%)�U��,��HBLj�n����f�[����L��.Kn����щ\h�D�#�+�2�t��s��G�I���|V��_��'�3V�Lb�?Q,M� ��h��`%ň�s%q8�WN$~���JV]�Y�O~�q��E�#�Iw4��S~*�)����e7v�X�Fdž���O� �%H�_�ȯ����T7��a �W��5RL�l�4躚l�H~],f4֕�Y,�-(�V�l�i�ڨ�,�I�h��)���s]*)	��{u���)�/m�la�[i����G��@�Xe1�h�i��<��V^<OLT--�e�n'���kA��ӥD׋���=C^�$�d��������uIʴ*Iy��Zv��mZ���m_��^�=38

���>�p�7�6��������Wa��V��2c�|�I�.��v����nL�����l 7���8���PKEePQ6c�K�<!pip/_vendor/urllib3/util/retry.py�[{��6��>J��I���x�ڍju��X��Ή]3J宼^
� �g���1�u�>�v7� 9ޤr*�L@��Cw����K�m۴�HS��e�0��˼mD*���Mv�9/w��؝l�º�s�n���5��Ħi���]�FTMY�C�?��}���\��ĉ�$�~-����,
�tL�m3���S�O��Z4Ճ��}U6%p鼺|�{-�#�$�WW�-ϳ��/,�{M>�|���	�e�ݟ�����LK+ى�-<�*JS�P����	{���jר�-+����(ǚ�`��
�+������8
�n�e��+ON�e�7Yݔ�p`�!�7�{����fؗx�U��	\">�
o��*��*{��k�Z}<�5�s^׌������TN4�׀�b��ڊ�%'�:�����c��<g�J�F�z
q��K����Y{I�
�"Ƭ.��	��[	V���v[���
	e�!�e#�YTx
��RD�sv�N�r~*5r�����}7�&������df��fؾi�0�=P���(���3����a��q�����=ŗ����=?��uyx�4����QT�j�`_�X�[�_�5��]�����c-����$��E��|���W�HAP/��y^����*h�N��]ŏG`vɔ�:]��<�V玉I<�dm���>q!�+��1���^s`��--�5,T<�X�y�.`
ˆ�S#��dE{X�Jnv9qS2���]�`;k�a-6�XR5+a�
vY[4ub%z#p���e���J`p�ո+��p����+�2�ECHQfW�S�0��inG�5N���<��E����}���}
m�_5Bc[��#lP���I�&f�m���`���Pv"/�c�&rq[p#�<�b�Uu�mbw���P�i����X.I_iY�fk�]*{`����c^<���Ϝ����$E�e+�{��2�M�����č	�ׇ�A�W��Q�G��h�u�ك�+JUe艀4���Ա*׀yw��.mĭ���QtŅ6�GV`xr��J)��������'�;��H	0�?�#����F
�>�-h�w`��pꑀn")�M��6;dvuv�b����tA�p�f�xo�,�S>��Z7��O�������Ϭ�f�|�?F"�O[Q��_B�
��,�1–2���$$�� ��(<�x�����r)[SP�Z�l�� <�IZ2xKa�74�ԛ��*���9��vX�8lD�/�|�g�^>�b�˂�+%HI�V���n������/!>npOF�����,��6*ī��(`�5�hhQ'��X�`S"��<x�j��◷���ͻW�o��W7�p��W��!xPL�5<uv^-e�`k��]ą�'":�'���
p�g�I��g�J��(��ri�o�Q#�pA��?
]�M�g�<Ҕ�8|�m�V�F�ݦ[���+1��d)�6`%�;!
}L�c_@��z0t�C	�p=��#�-��!��|@�gF�pd��ـ�~p�HQ�ru.�U�����3��=c���?�p��=mU��Sv�cf�4q�Q�T�/(�$9C��(�۶XO�	�tx3�0��0I&`�&�����$�h�8��N�(F��e�s�?�j�ﰗ���������������n��X���u,������5���X����\q�����w1�5�Y&�ko+yl��a�8"7����@d���
���9�`o��e�;�C���r]s,�P�3-�ý
�@RjGc@?���2�h7��!�B�y�˥d�����!ݕ5KpD�`�����0mdt�����L�`��L�++�т�X&D9V�	����æ�D���`�D��@�8X��
}�� �>��t1�A�7%���)du� *1E�e��􂬔쎾�3�6ay��z������b~��,.�ܤ��^�o��}���<�)ko/9��MGǭ�vN�����h�7hg�&�<�{a�Ħ=�@4���H���؄1x��FrmCN�͐��)S4���a�f~�
�T?���_�W����޽_\�������G���f���D�߾�~̾���}F�篮�痋9�_ߤ/߂��atт����,�"�d��*;�c:1n�Rq�-;{1�cF,M1*H���$���:���}�SX�ǎ���J��k���er̆�ұV)��;�����`Q���]q�*[�Y��^���ב ���OY��fRW~�R4�'����3R�ߠ��LI�N�m��J��t�ȃ~c� 7�BM@�i�;�V�]�ø�
��
�#C���? �f��{�y70Ĩ x�wߛL�q��t��J�!Jbj���߰���>��;QE1ŕ{���t>����R����.AP��.��"�BwL+-�� c�U[1w��ԂE3�$lS{փ��GY�~{��ⱏ�c�z��	a�Ǐo�Y?�F��^�#�!uaJy�V~�!�A��1v���$�YJ���m���-��8z�L�VP����
�1f'�D�6	�,D�C���8��*�KP��6��<!,Xey�<��M��(�I0L�$2[)��C�KX�#̣�	�(&��"t�sY���#�D
V��l(C�ǭ�3��u��t��MW0�e��B5Ý��.وU��F�e'Y̓h2�ۙ�o*v���=r����A��fm�N4���I��*}
jjsN*D����K'��$B����n*�$.1�
�T.��:�&rH�I��Z�a�[�'�u�]튲�1x�,�3.���"��o�,������T���V����VS4�E���j��\���g�x�+DƽX�X!k��\߬7"0���yd�&��r%N�>��s�!����R��y�
�ޤ>�5����s�T�d��&e�{�o��j����ɓZ�Γɷ��H(SU����~�ar���?�ÿ��&Ǐ�M���̹��y�'h�nhcS�1�ɛ	'��g�
��Z8��R%ޝ�h�~���#�
��Ό�9���h��,��r�J4<����W6��$Ěj�-R��=0M?R�V�tw����6i��V2�:3��^�^��!3���;�p]����M��/�ތ (	�q��"�h�P�F����AZ&�A���AAg��щ��r9ʈ�nFg	�=�䱬;�����ަ�ԘP�_*B���n�����Km�U���ΠqU�}Z����-u^68�`!��t�E]6�	I\��3az�r��D?��՘e��C�ξœx#��Z�IPa��ȕ��쬖���%W���x�(�R4�!�ű� 	�G�z>�cd%X�#eS/iV����
>��F_���x��C�U��-]�{_aVU�Wa2���)�S�?kt.]]
3>_��ڝH�;�����Ԫ
p��
��%��:$�s�1X�5q�\(��s	o|P&f��.1��w�P�+��[!�fM���unZ��1�`���L�t�Z�|��r/֟j�g;�ᕶ��e�a�K'qņ���WŅu�n��*�덪��h�OB�~�/*�G1�5+����� ��q(7Š�t��X���0F�&Cݕ��yU���[6���E/�AYX��Z�ɛ����[^e8-����W
5��Ʀ�\�>	t�8g���aV[��`�W�:EPW���mP��l���䴲���9�@����J��!,!D�I����0���N�ܤ���U�^�9/�����y�i��]X��N{Է��:�{�t7�)q��/����qnc��>`P^�_9�J/?��z�2]��!�t��f9Ƥ��l;�q�"��7<�z��`�LWf��M�Ai���b���krx���+��@X�OM�a�%P޵���_$7K�ғ*U���������S�r�T�����'}���T�T���q&��T6C���?VX�����c�%0��zJ�n�0v���撑�"�komаc\�m�ܽb;��DQ��U������nԯA�.���x{�^9������S�@�i\⋟��R�Q��z�c9b��9��
]�}˶�v�S�����Og���u=�L8;��z�h�Q=3b7���x�z�;7o��->�]1
C����f�f�Yd af}o�/z��':����$��_���zu����f�ס�3_�4�g�N߿n�M�w���#2��D�y����1��T�XDE=�Q@���a?ƙ�E�y��{�)���褏������LX�
K����v��Zꕐ�[�Q�˳Ox���La@�7��d�ɻ5���sWTޟ�%?��__]����w�]��i>����֣*�"U�;�����f:��47�����_צ-�{��?���,�'7�f_��k��[�4��Xe�Ƣ{��)���)�?^=wT�_>�T���YU���1��w�3��ѕ(R�Ľ����QƏX̋0�}�M�4��:"�7LƝ��4�W��o<�4<s�F��"��j�K$u��"_�F}��X��lD��lb�/N9��L|��S��/������l�\f�(/���5�l����/oG��[���ҁ����Y�=Ļ�o���<>�'PKEePQb�e��8 pip/_vendor/urllib3/util/ssl_.py�[ms�Hr��_1GU��-ْכ0QR\�>�ʖt��-_*��P�	x(��������b�%�!,�M====��t8/������^�*�D�\e-�*�u�"}�1�UY慽��2O���^/�2�߫m��̉�,�e���P/Y:�b����n!�E��,�2�>�B��Ͽg؅�2�4�w��6����h�q<�D��.^]�̈P��jU�E^ّ���qYe ��J�X�]&�yQ.ҋ
���SZU�nnYn+?�G�xU�K���Q������U��p�	.�ˬR��It��n|R��d<�|?~��L�n�ܣΉ�$W��Jd*���)��ע.�}U@�Y�X{b��cZ�X�E��!3��A}x��f}�a��/�Z�o_��߽u��5%j.�j���r%a �U4�h�=�Y��t�]��IE�)��	�����]H��+s,$]���C�T;d��"g���ەU]�Ͷ��B&�W0Xl�C�V"����PYNj@�<Ѫ����RaK�RU��ރd=��$bo��3,Bd�(I�?��	 �RnA���+�k%xl�r)2�?�4S��n�K��=�[��jY�e�*��n�=�w:u�q"���Ln�$�x��Xۭ2�N2m\��R�����T�������㫃���1�Y��GG;��f
v6�����FB�v��J��<��n[/`�ểs���>܎n?F'�j���
l��Dp{vt��ڟ�WLN$���p\�w����.���C���^�n?��#,^��U�1���˛�	�\��xܙ�):��BU�"a�!�M�u#j�9.<Ks�x���8]�Q�A�NŢ�W���l�>��s�e2,�dz	qO�-��Ϫ�&i�XݭQ�M]ep��r���G���^q�*%b%:K�D���z���/��z
��L���@��e�(�n��Ӎ��V<u�yN��g,<E�G��1/EZ@�Ki]�`U��*�ZE�N��d�PGV��CNR2lB�,U������������;Sum8���X�F�|+�����F�8H��5�t���3~B�2����rff��L�r]Q�*,K��8V�S���@=H	�e�kfIZIJl7�?~r��c�Z���{�i8�q5��@�!��JMF��ċ��"�
�3�Inn���7��ΎP
�j���NY��|i�x;���\Ɗ'����cP϶bd�Xo����Y@�rZS�0�k�
O�L3";W�����݇�=Ł���H�;������λ��ч!��_�O��&>ɏ�I��	�;��ၱ��7�v�uG�݁-��a�;���N�!}*�����3��3�.o`��QD�#��;�PEi��QԫT6��E\d���#{X6-
�`��E|">W.�g��)�Һ%�}找?I�P�S�(�:�K�P�&f��P��А����SŪ$3�x��0���h���::�Im���F�Y!.�~���N��~xrٯ_��|;0��eV�VY!$�_��t����]$��|qP�FݚG�E�X��Q���E|�l�SJ eW"���!�RP]������������;�ثn���$��?'
����R+���{nU�W��s�S��z`�p��X��4f���
�䒝hgb[7�����t�����`�'3py���}^��QT_�(��a�>"�0��@�NVe��m9I-�V�<}��<���U�b�D�(_�5F�b�z,%�����`��3�
<(A_ٳ�5� E��A�,l3�$֤��0-�T~���w&�g�0��Bng�w��	!:�Q^~��cm�a�u�v�di?�OgBDwЊ��vm���.^ 5�����#\�R���zA�9tc�`��!����]�ii]�z��z���^����V�o��Դ�96E�����*���m\P�(b=�p(�R��n�P<�R�#bH��e�r��5dTGrøt���k�����f��,�
���>7S�}��b;��5j����1�p����f<�����L�撛$�&���Pԃ�s��>b�Z49M�̎�(;��V��6ibzI���_���-�Lr8?)D!�D�1�ׇ�U�,Xm/�Ul��N}��9����E���H��eӷ�'-o3){�k��%�	�C}�gH�6uz�`_��Q���镧@�&<!�t(�/���\���@<�Q��7P�+��=��	lC��$Z�,��ŝLrI���O�kJ�x��j/�X�Lc�H�f���
�g�ҭ�����k��-RO��#;7*��ufz�WMs�$L�=��&���CZ7M9gC�J��\4	#�B7-]��: @�gjd�U�����}ʩPOڛbk�<�b��b�F&�ɦGdN�W�*�ZL	�Lae���2K���(�n�J�&h��+i�A�F�C��h7d,C���X��v;ҎK��gGs,ZA�1�uW��@x��m�V�/�>]��+�k8�w�ޫ�v�;^�ף~��Ojߍ�~e�75���	��g3�Ud!�W.�y��c[ZY%�kS�ڧtp���0�\T�柵W��K%	R֞�/G��O�0��:A�>�qg8IAM(ԉ��̕rwy83�B
#���T�/�R�](�k��8W���=
j���1�@�CP��1����DZGX�r�dӐΪ�c�
E�MZ-��u����*)�����JW!6&O�2�P~]��w`��;p�����һ��?]���H����$l4�,�Ӎ�U�YU�5��^O�^S|:��t:e�ө��"�Y�#�Ίg�o�G�:o��1U!�&�
$l�P���p��,m�$@��6�8�ԹBާB��[��B.nnOϊz�x�Z�Ɠ�PG����2�ҟ�ەʩX4|�:wk��Bq�Z�`��Ze�KL�,6i��4=�����	4�OL��	m(h�u� ��L���ԞA�a�f�@�*���B8��
}2 s�nVYSN�x�1Qf.��m�
R��T՘�Vt�:�m��8�����`��a,86~�kl##v���#�L��B��؍�����`�?��m��o^Z#��L�����k���"{i�PO�D�X"V�J	��aE8}�T�o/d���3~�H�ź�c��K��ng��8`�|�/F�ZVv���+_x�M�hE?X��>�����@�TDSг��&|��ǧ�L*qr�_��g��.[F�QZK5�1��yUT��k� �}vĂ��K��q�����P�}B=�Y�b�Q�[�ɓ��C�1j��b�9{��F�	ۤ�u��Z���K�CId����aRZծ�ix����Y(��-r�IN~��	�K��Ef.��]��)�2$�c��M���?;Dd�}���
WZ&:�e���<�;�{tJ��B�ƈ�~��/E��C ��1�E��I��6>r��t��d��m��hx0�^Ҷ���Gz�*c+i#`�����K��7#|��P�-6ykS�O����s��ǑY��t��cfeCڛ�6�qvOe_92���$

�w@�A�ӧ�zj���[L�Lgӻu�3�k�o��SE(l���<��~�"�g6Ag��k���Q�W��|q@o$�����/��l���mJ��d��Ehᴜ��!�ug3ϭl3���r��U5���SN�t�0�#���S�9�#�P�' �3�'��h��2u`�^��b��l�_-`�(S��*uj <v�6;泴gk[��򾍆��*JK�t��#~H&��ǭ9*�mm~yU��ѐ���|�8˲�@���`a����1e��.���ݮL����[z�`�SN\nW����۶��l�וu7�$t���3�1\;n$T�����W������,��kĘ�{X��5�(�2�R�1��I�d�3�Y��.ձ8�cz�07+(�{�֦�o�Қ�I(KT�b�%iB��h-�LU�%�(�qG�d	��G�m/�zM���b�o���Кp��˖%�^��d:�M�����x78Ծ�q�mt2���;��
�v#�k[���BT�=|{��@��L���z�A$�~�1е���^�M�eF޻�a�8)�`L/k7�sw����Y�Ex�&2S[��r��*�3��p|s;�y��!���+N[��ҹ�F6�(mvp��~�g�w194�aծvdJ{��Q�4,��4O�M%z��U@���F��=W��Z-W����_���[�5��cQ̩/�ܝbt�4cm��)rN%y��j��;��@
k�E)���T�<�f˔�&W�8@��k�� �������R}�V=$�ȉ��Uf�u��?�)qa@+�Ÿ�h>�z1��f-�_	޻>�o�4���d�$r�p��nl`T�qJ.��L*�i�t��0��*�rۄp�}���2�1�E
q�~t��w��t�"|cx�����?��9���C
��{�D d0��A�&���$#��Fn+���=�-��u�֔H�a+!�7��ɥ+ö�3�o
;L��C����7ԉ�Wf�=��p�e�����s���Ow��w6|j�R�f�`���	c���x7$x����u��ʯ����:��Q���2Q?�eǐ�y!��o�y4�EfQ��yv�x��?��,�ߴe �8��KD;<�;E�����/}�š��5��퓬#g��[>�͕�Wk*��tC�Z�����;�o�y��Y�
MaZټU��Jw��@>z}U�Ԍu�f�vN::y�HC�ա�~�s4&_��y�J_»/���0�
z��	D�1<�;�̼�C�j8]_s�3�<��u:\PK����߸u��.Ί"�ߨ���E�W��#�Z�%��~<�F^���?�_�Q��+�hv�,�*�-,7����'l8�~$C���3+� �v�<��)��">}�c����ft���n�~ Y�=�;b{0jE6M8sC���PKEePQ��G��&#pip/_vendor/urllib3/util/timeout.py�ێ۸�}���A�j���ۺ;ŦI6
����Ѧ%�f#�*I��>��{��E�%'��Z?dl��~?�F�=[.7��X.��wJ[��F5�K�������ņ��eFU�eV��m�z#j�>���]#��*&�ZV�
fwܲV���
`3���F:0���� 7��d����??{�|���g���-�^������^8��+�Y�Z���_,p�Rk�Q�g̈��V4�7�������u?�X��ej�7Q��i�7�P�{�*�ZY1�a��ˆ�Q^T����V�V��g�.#�e���?��j�1A��#9_\0�\^^��R�Fn{�Q+�����x��dT�E�@P-�Q~uJ5���OP�m�Z }�myS0-x}�]y3��p���|+�dy�g�0���`��ǯ^�=.�c|������Uj�x�x{�Y'�7��;Y혺Z�Z�Y*�F��p_C�*�
���|~F�Ҡ�ɉ���[ƛ�1�5�+�Ag\�~V�X�R�Z�<�}<�Տ_�-�"
$��݂�-o���N��j�7r��|1���U@	qق|���\�.�;HP
��`�Qt����&e�kž�%{���I�Cd��^+��A�� w�0����@G�	 ��� ��1�xyx�Q��`S�3��h7�ja���JF�	��m�-��G3{x�R�����3�W=hAm�g��Dm�H��e�v�2ED�5�9�iT?|7}U	���K�ș;�C��9տ��9� 
�i��X9���6�+����Qv��{�ٻ-<�;H~Jo�+��z#q���'���O��仧��~#���U����?��eD�*wR�WB<Kȫ��"r�*g2�;=Ȩ�z_oѵ�!Z$	�z+�E� �$L�j�ƻ�O1����9����YT?��Un�-g�$�|ڌe	9ۊ4�C	<�
��Ү*�͆�a'B:�M���*R�Ғ�l�_���E�%��G�I�`�H%�
{��/xX5Ƶ�d
B�"�1ˢ�c>��T���������JC��ZLrȶj�z��Nnw���Y�~��\��R�mKE�'�B*-�J��h��=���;~gL�
�	��%�z1�'�p�h,M�w�n��������&f,$���!��Q����c�+2؟25Z֦!�]�,�Wp�Ù"�-Tj�%���	c�y����'�"5`\-��AĖ��R�Hƛ?�!O�"�����o�"Ƃ&��?��I5D��X�[>�XhO�Pз7�YR��[
F��@T��T�����	���f*�A��m�Q��m��T�vi �z����]���<`�W5�Y�*(1Co�z,:���]����/�y�Iz�@$V'�eh��W�t�q��G��6k��c�$D�'����f0:�`��T�\Όh6��gߔ�5H�M
?��ͦ\����d
�YhEC�Ñ�v9?AAZ;�o��B�8<I�����˵M�*��Z�k(ڇ��#��G���8U>��K���"�"��\.[(��e��:��T1~���8s2@�.����ukJQk^}8p]��AR\�R4���(�C�M��E�T=hhl���`(_�6�q��D��U>��0<�u���0˜D���Z��1��0H߁�7J�	�@5A�b�aZ�`M	�T�b*�10 ��%Y8�pdVW� ��WH_�M��Vb�#YR,��
��d�)MR-��B��k�&P�-�T�.XU�?�V�����ߞ���l�;G�C6Xd�|l������p@3>�����r_�S�B@���y\Ӻ �F�&z�Ó�{ޢ�p
$L�;�ז�{��ch<NZ��
�����c�"�9�SnM�fw`=b�H��z��Z�=��]c��s�L�8%�:3��iϋ��[v���0��37��8�r2%�L
`,a�#��eO���I����h�i%|�֍���p������(�, 8�.��S�����E�b��פ4�Œ!��:�E!)�q����
�v`�D8��Ŕ�ɳy�Wd�lf�и��QØ�$�b�^
���F��ц2ݧ#��W+�d�J�>�t@���Eڛ����1~�
�!p�iZo­��i���j�H�4�4��r�J��Hhq^Mi��>u�4�a#=��3�t�8��2��8�I{��?�F
I+Ѻ�G�q���l\NS`	^���
Q�#l��ߍ�/PL�4�,�D��$N���M�R]��v�Q˟�t~���`��b����#:�8�������p=!~E
��`� �|��q�����
�k�2��w�?��|&xI�f��=�}?t։;e3Ô[��2�,�o��^��1擰wL���?�FJ������(̺K>X��lkg)t�5
����>���%�Ab�Ou#>g�9N�	O7c��쐖޾�槖��l���7lS&|2muD�;4�𫑆����b�Q[M�K��o��&�%%��#��,���ǹO`�g��Bwx�+�[��a��6.g��yi���L[��Y�7���ُC��f�iG!���(��Î�a��0�a����v!�6�N�{��튥w �U�Y+�y�⵿[�)G�|���}r����9֌�Im5j�\ǭl�=&
��<��xR���$�F��^��QM�
&��;Ͱ3n`N�4�� ��)�A�K~�;�3lT��u߹���u�P-!>�c�D��>]���E-:�ָy����L�6���m��8�W,�ބ1���JZ+�n���
.�ِ�>$O�B�
Ʀ�Th����������e��5Y2�;
�ܱt�ϐ��r�=;���T�{C(����Ǧbq�-�?�=;�I���Y�uK7S.8�V�fe��K� �X�ز�����󏳛b�:N��fM�.�"A9O
�(��~��&ӥg��<�Oe{RʿPKEePQ�	�ԋ�6pip/_vendor/urllib3/util/url.py�;{_�H���S�e-
F&�.����$��50�p�l��6��у�<��_Uu��z���o˭zuuu=�:�$�3ם�Y�p�e�|'��i�w��Nxg��8�$�(U�7�~�/B�0���'|Q:�'���$N�›|�ny���N'OB�˲$e��H'3>�F�^���{�~#
}{b�Ϝ'K|�&��G�1�t��?9��p�>yQƲ�Eq2���3g�(e��lƼ����xg�[L�^��x�є�0��S�*	�̳8��s6˲��9{;|stz���=�z�fpS1
|M��E<
�0'�!��,��3�U���'�p��$��>#� u��d痧�]6��<��O�~����$��K�7ڜ-<�K�λ������@��#�"���W���h����/�/���#�o�`:��h�H~����g�k����I���#p�d�-�:4$����Շ������\}�
�kP�Κi��_�����ɋ�����8:=�u`N���;�@�����ڶ��|+�׃IP�Ac�7|�/O�w��[��e�￉�_����o�aO�3$��wJ
������pF��lÀ����yI�M{�f����l�d���,���]G��Ա��[7�Jݭ�h8@f����Th�5i^ը!��������a��n����t4�;+��DW1�ie����w1�������v+Ý�.
z|���P�h㴻�S�y��n�S���p��U�Z����o���ܾN�@<�<���Dž�8z��x���듿������w��_\������O|>����Σx�g�f�ݧ���'�;�{������z�?��}�kl�_
��q�W�l�	���CHbڞY��۳�{r��Y���n�7C�5�i���
)�����}1�k�/d�.�t�8l^���p��=;���;��Wףu}y���F��h�j��>�}��n�;xwp��}�q�R�]5a��i��o�
U<�P�J�=�����$p��ln����٪��i������Ó�?���\�\��3��z���C}B �5��C��[�Z_D���&�_��D+��R��ꭈ�Ve��x}4��)噐��p��������M����_��5��7z�}�9qr��m��+��
�1�u`��K�*!�y��`�q9�Q@��z�ٙ�� �!`t:��K!%MB�L�M~�"�,Gh���� o͒|�y?���/�6�,�nU����.SH7�2݄x��0'$��L�h��,0�w��͞ǐICn�Rc/�ٌ�Z`Vd�D��8L�ƈ7�R�D Jd��2o2�ł�z�����.�C���q�B&n�10��'����I���B�̾�A,.jC({mK����@�B�6�jmX�~�)�!�EqF?�4�,Ŋ�;Ѡ[��}��C�% H�r�"���	c(2@��\�4�����-��V�ZI�GZ��z�����J(�5{�Hb`�-�Dh�f�é6uX��`�c(?y��n�s�(8� [�b���҆ү��L8�����l��Y�'�0�4CZ$:�u�X� ���0\�4s�t0Pa
���gB�Y�bv*ˈ/��K�d6��J�N}��jr��x�2�3�}���,��65���Z�צ����Rc�K� S��W�4�𱵁�n��x~Gw�&��C�RA3P.z3�b
�}�CI
�Krp�I�G�&,�B��}��.f�&9x:x��ޒ�n���&Y�>�CI����h�C�+�4���8�X�)1��y�v��,Mn��
҂�8�`�Ћ>Һ�H��������-����ޛ/�`�q:������%Xo!��ų<z��ېB~�a�k5mT�>����Xu{���<A�, ���8�����V�B��m���fC@�&���R�Z)X��3��y�E��ZA���KJ��y��rCst��1Cs���i��j�t�-<&��L����`�[����#��0*����
�S�
�,�' �~V�%��.9
�L�1�ܠ�fo6�,�#�Q�,ْ��Y�.�qkH���M���u�-���;�. t��reB���`��2G�9>f���8쉽�'ؽ�\-b�4'
	�FO�q��8���	ȋ��E?E,!��*%��6
I!�H��BD1�^v�kB��))�H�Rg�$P�4�����,(���;t;����8�p�}F�q�?М��a
Bw��Q�2�NM�-���~
�MĽ$��O���<)�ڀ�R�z�-oBU�{Dn�߃�An���H���AD�g	9��A�~e��_�V��'1V 9��?J
X3��X �U����F�����PE<�i�X�G���>~�H����"���0F
�r��<��>w�bv໓�P�X A$�BL��#p��#Ϧ�O�r_���06A��.�'��Tt*�?\
Œ)���2~I�j����TYCG��P�p��J;l7e�>+g,My
(���R�G벍�����.���TR�Q8����)�W�CyWLW�Jc�PK��<��t׻�26l���S`�$0E��&R m	%W��3���b��8*K�Л�}Ox4G|ٷ�p.�-�GX�Y=M��#u)�K*��	�Li/`���$�Ǎɋ!�b��)A�mr�L �ɣ�뒆Dt�eFH/I�����C�!/���V2��,�ZZt�\�+m	"
��X��"�@�S�w��b��l� �pL��*��6�-9������5�g�K�-��#h�DQ
�3��pA�W�d�i�a���BMTvxY	W�YS�B��ns%�
���FyAx�m*!��mg��Ų?OA��vau�UqtM�rR�\,��D%�b��q榜R���9�5v�E���,���x6���?���U���㼹goۻdN���~�����"��	�W:1!7AyĬ�ͩ���`�S��3���j��'Q��!!:��cF0�FדQ�Hh��K��Ҋ�n�]����	lL��H��������Hr�t
3
�8OuU|�
�XNK�Gђ���$$YlH(�R�j�jPPN�0�Pc������cJPK���愧}��$@^��~K��	=-�_ax�$���[e2fkN��I�S6�;A�V��@XQ/ʼn�K
7$�Q�m�
�mxD��U����jk��)1�&�L����|���D�f7t�QJ���u��,��G���V���S�9�td
�n5ŕ�^Ȫ�{���%�
'Q��Xƙ���II[���C��L;�p�y�8��d�f��yQ*#+��}8jU�d����U����>���vl
ݒv~�P�t�C8@����)��V:��Ho�C��)#F5�I�/2�4	��3��L�W����
�%FŮ׷��e+z�p�]�*g�t��Z�y����d�R��4\B�]�vJ'�9���:I��Ŷȶz~���D�+����5)�b��Z�!�Ȯ3�yRUf�yh�q��t2ނS5�d�@����ƣ�r�G��y�Ҽ����b�Q>U4�Fw�Y��N��I-���ށ�1	7̐m3�;�Wt1��&u�[L����j^l3��He	t8����C��E	ԕ-��5�V�F�[�)�4mM��bz��'�E�s���	�Mi��+�Ȝ����"7�p)��iWoy��C&Œ�@��+���s��U9^:	ê�qd��z�b�m& 1���DKѵd�EhŠ���C[p,���%wQ̥r�JF+��X6|��Ў#��&��v�G�R��sTLJu�����
��ۄE�F>s�O��ؗIx����s�&�Nř��'�����S� �r#䙸�i��}1�E���R�W��(Ʃ�C���S�nH8���6���5A��#��!�=�Ό{wA�`D���1�
D�qs#˖���%#�xs܍8���6I*JV�J������f����JG�F5?o>���
v]d�\5_�7�-q�=�7.z�]I���k����t�������ӭ�փ�WLJc/y���EcB�lW���W��vR�։ˬ�+�"��2��h��\��m(I������r�G�}�	P�*�Bo<�I�-Ww�ĭ]�ÐQՁ�L�e�h���굂UyuK
�}�t�bJU�z�
���&�)�-�Xț�ěI��r�B��5�'!),fK�,gQ	���e�‚˿�=�3��A՚e��-�끀������S��$L��HlV����H��[��<r.Պ�Qz�@�Ǫ��"�Jj��S�bS��Q�ڝ3�a����/Z�;� ����Z�f�-�]::���Zc/�	K�}��a�X��lH�[3膚�"+N��Z*��F��!%�/cy�#��/�I����o6$��W������}\%��;�Y�%g�8o�{_�N@”��8��{��膊lB��H�
(���Ĵ�J�p���S?��5'�T�^P�9��� _��V4���
[�G	�r�	J�
�q-`������!p��]��Sm^�KH�?�!�F�<S�b�@#V�5CH
J8U.A~/�k3�?.��t�yۓ��sϯv	�;A��5
/l���P[���g�Wg�PKEePQsc�� pip/_vendor/urllib3/util/wait.py�X[o�~ׯ`�˩��
�Q)�E���A�E�@͜�Xq��$�c��^F#YΦo��X�|<��qT��YۘIeM-��)�1�	�Zi��z��:�T����M&��_O^����lm�M��	=�z�>���Zc�	���NV+��j%����,�������~2Ŏ"�t.�=~]UƮ,����*O�/�ɤ��9�,��]PT��**�b;�.�?M/��t�=	F�.��&�r�%���F�}KN�J���މ��D!�9�(�f3�x-�k�)���MIk^z�:A�ڑ��h�r�[Gͅl� g4���`�X1f/Yn�J���µ��*U(j������	m<��XQY����[Y�4k*$[�-u�Y�Zt-�,(�}�+�K�!�n!��y��i�^����
����k��B�_㗦��ԑ���9$��N\�N���j�c,�'�qـ��ٕ@0ٳ��EH�[����R�bkv��D�A���b?����,����F=�����-*�cW�&���)L�� ��Z�qp�Ӭ�����͆`����۪����5���?Kr�U�7��i���p[�R��J=�O���I[���Tѱ7`�gՔ���8�ɠ3(�5I�Ň���4�8��5����l[��c啿B�u>hq���O��3���e���~�{�YW�M�Z�Q�zcw�7M�d^��a���+�sw�{Ic5mJ��a�v�
�b�	
�G�B��e���I��f�4�j�����/p���+�TF�})f�����.Ŀb?�>��|��B�@����z�<�d�}��g��M�U��vV�,��t>A�{:�W�,��e���;tM�KR?j���)��?�GnMC��$K�0(*m��M��հ���a����L������v'���θc�w|
�&��+�f)�=7�7��⻜���ե���#�4Ug	�X��(=��B\�Bڍ����%R
����H�t��6~;hɁ?AD`D�e��w�o�?>=>8H*GOV��g�r
����q��
��卸9|~�G8���LNӳ��q@:B�pD���ی����G���@e�tΒOI�@]�%���� 3*Wv���5,iϴ�Ё]K�����X�|N�|<N�e�-�}��}	���*��N�қ2x�7���?��B|fQ��6�k����8r��p��z���Ԇ'�늂'�z�pji�T �Q�r�i1\��l�	ō`�	
�%7�L!���^�JL/a����RU�Ĕ�ƬCp@B�Lk�G�9&�,�8��:�7�Ǝg9^4I�
s�"��j���g����<Eg�|��S�9�{΁��ށ���cC\�^1� <���S�J��S�j�vCy��a�?��H?����g��޻_��u�}c��j�G�K�ķ�k�w5I���N`��c*�H��q�
��#�:7�Ҭ�ӹi�?3��x���94ה
��	p�$UN�*�}ȭ�0Mw&a^�@��/v=J�ƈ?��6��]�o�z���C�<���4�b2�⁉��.����1�a��sJw�Q�"
c��s8�7�xW��r�}C�8I1�eG�.fk�Jm:�8w�Ȳ0 w�o�/��Z�p�kX�_�Q2���_n,�(�����j���$XGѝ���1����oIT�)��E��AZ��K���_p?.I�}��q��+���ASM�%�sk��b��K�'z����2q�2��"<��O�{��F�� (�	Ը}��Z�f�N���$�k�s��Ά�y����գl�j>!��/���f�)x�܄�Oi~��9ӦS����D�gy�L��W!ϓ�C�ٰZz��ױG��55�pA{�\�w�?ʟ�4����3�N��8�yo�7�C7�46��C�h�Ǡ���끝��2K�~���'7ozl��A�&_3s4W�\�ƌnrGv�Y�����i�S���PKEePQx�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/\�PKEePQǭ�#"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�����PKEePQP1D$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�-��ޜ�)��yPKEePQg8p���!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�PKEePQ��֥�*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�L�ԂB pip-20.2.4.dist-info/LICENSE.txt]SOo�0��S<qj��u=m���k!�S�1$�x
q��~����MBB�����
��=���{x|x������7Э��Иӹ���1�6z%U9�lg0��zo]�CkF���X��41FD��m5M�Aտ1"��Ce{��
j�B��E��R����w���W�O�U =r��Bk�YyC��'��T���=�ņ֝�Ƈ����Pݝ���ٓ�)|����c���5�@�f�5����m5���瀗�.k�
s|v#x�u�`�����4�*�@��[E��u��`E��أ�i��+��:�\׹FCɾ����"Zn�w/f�r]�Z�Z��[�=��B�{]C]���g$yp���8�s��+�\�-SD	���"�)�X��Y[�?���P,�;�K`�~�<�#��P�,A*�"<�A�I�IE���RC&�B#��@�7*����\%+<��Ȅ�Ű:'�%�2(��"�dLA�Q�,9ʧQ.s�/��5�UQ
�3�\�,��n��b���J�Jf)���2��Ja�$cbC���O(�,
h��n����1�$Z�<�N�k��S*��%��)QR!K%���D��H��+U
�lG�)������J�GPK�mW��{i<}%pip-20.2.4.dist-info/entry_points.txt�N��+��I�/N.�,()��*�,P�U�z�y%�Ey�9z�9�z���yV �˜%z�qPK�mW���"pip-20.2.4.dist-info/top_level.txt+�,�PK�mW��_npip-20.2.4.dist-info/WHEEL�HM��
K-*��ϳR0�3�rO�K-J,�/�RHJ�,.�/�Q�0�36�3��
��/�,�
(-J��L�R()*M�
IL�R(�4����K�M̫��#D�PK�mW���]�pip-20.2.4.dist-info/METADATA�W�o�6~�_q{
����6Ⱥ�iW�i��=%�t��H�JRv��#)N�~�Mݏ�;~�?��p"���Z%p�.D�	Բ���8z,��f����r{y
S]U�2�i]�J��:Q�R�d�
�����F�;]aX�
�j��1e��m-"���!�f���K]��U���e���q�����_��i��2Ee)������诘����yg:m����<�l�ЍI�7̥+�eD�lώc�Y!TNp��Ǩb"fYb�pc��=n7�dvP����@�<����Z����4�%�upY
G�W	|�x���E0+��r%�(<k��aAE7�^A:kRf!^x@#��rmCO�L�J���>m;����b�um�\O���哮e��rap��nd���<r$ԹU�suND74El������P��=���G����`�����8�c^�%�m3^��T����l�+��H�6l-��z3��dE��E�<���2z�S��,I"��7�7���&�̓�lU�6�ߎh��'?AE +�^�d�G��Xf�u��@�k/
v��8artM$V��n����c�+0ө:X�Y���u��'$h��	�:�YzN�J7�����͵������
�BAc[�vzgz���2�j��q��w
(T���>2H�H��EPj}��3dCE�`
�&�p�$��M�K�ps�+�-姯���M��@����N`C�O�I���H���Pi�
�[�L?H�2:XYͥڇ���2)MyZ �%�`�����������3
K��-o�-+���r��i��/+�6���z��b6<��6f�[���,k≀�t`d^8�}��-�t�e-��N�z�v6�q�$؜[��;�y=��#Ӷ	��f�%v��ӂ�h��l�kj��� ���3iSr�d����ф̯f���
�5����c4O�'~�t��Ά�Z�C�3:�G�58��C���^D����j�Ȩ�{Ų�j;4u;}\�r�F���2��xfZ�i��O��Պw�Cb�qH�V����g���^RSe�$�d.+�eM|���I;�{MA���vhY�m��0�\G^��f�T����K_�72C�=)���z�����}���C���@v����*������H���;c��X<!��`��N��ε�2����/�pR��=�M��t��hIwk[k�!�2�GS&&�t�w˛ބN��-ԍ]!m��4=uc�y���O�m���D�']�����@����Q6�"}^F�ߕP���x�gh��\��}�
.ykF,S�vY��ů;����)���'b���n����A��恉`e	�*L[s���PK�mWS�N�B��pip-20.2.4.dist-info/RECORD��ɒ�J�58/�z�/�fPz�!$0����o��P��<
)⻷����fk��w�v�:���M˴w�S/�.� �qa�ek>�Wi����5��NDy��5̔�P�jv���W�������0��0v�o�����D[i!�qz�
5��;�e������)Ҡd;_���M��6A�d�c"rR�ik�C���<t�r|�$]�;C����H=R��F��>�#k�c⏪�#�x�� �^��+��������Fy�B%�|\U�'�(?�G�@B>T�=����Ӫ|��
I��0�is%��[�m:h~L�7OXU��@8e" ��Gs�O���1k����%/��R��g��a��.)|cJ����-q[.��yx�X�b����DEy��9� }{ �H�޳YH�0��1���'�ti�����G�tu�R��TG�ŵ�F����y�|��^�zDA�iJǮ�N��
��G������zJ�T�MYW�����;f�w������4 �^��-����K�	�3�&DJ�sV�DDD��Ϗ���DQ��֨}��&�Ԭ�6F��rDpR=�QW$�x�Ʀd���nG��Ǿy��U�ف��y��nb-�?J5�+��2�Ū���y~����?O��
}TE�GoZe����x˛��+y���b;CHK�\�w�|�������_��@�Yy��;p�?\2PGǘ�.3��l?Q	A�H�v�AV6��t?4Ѣ�el[�\����	Cf֬�e�V�"p�{�ֻ�{��U��X1��=j5͏�=��X�_εG��Q�}�O��⺜�#�3~���a��Yn𜲝�X{W�����M��ҵ񊬌"�s��@�'H����ƍ�?*�fj�
8�x��ˣa�!��a��y�
����Ӎ�ia�L�`tI��&�-f6���b�bnx�#��~��U�F]����K�C���>YU{���6Q>����p�͜����>�����oԍKW�j�Q�
{��Ff�������KY�ɂ��D���N�2��b�Bv(,Ө�jQ.������0��;@��M�4fw�7A�l�C�-:�^�yl`Lx�z<K[�~>6"�ݾ����.rV�[�-�S-�ك�;��T2U���α}g��n��+�Ut�|�K�Z�;�!����?
��yP�r"��L,sk�N���}L_���n�P�y��N����

G�!�������~�o�<��jT����yn^�g���isi
�7���.fɓAo�������au�w0@|�ݿ�߇Q��4��p������õ.̍��R��9�S�Su��N��C���?�/�UO;e]V]oAYa/��1&b�"�p��vL�[����\Me^y_l���7����°�a�
bb��+ԔϪ[�&�Or���F��&�L�S�Ym�'���;�g���0���jPt������9��*m&�:N$K�+��P ����Gnm3��|,"{~���Fy���.��P�i���<����[ZΦ3F	U��m<��^�r3�<����c��in�>���k�������`	v��s�g��~��<�^T��=�8ǴI����\��)��8I��9�Q��@��.���u���F�ƾ/�c{HZdV���J�.+�V�Ȳ��;�r;���K��u/0r/1��c�\�%:<n5r�Ҥ�Mc�
L-,{c^$�3�P~n����w1����˂-��/��q4�$�䌅�y�t�lß	�_�_���.�C)"E��fBذ�V��v��)�}	������G�skS�Ed���C7T����ǴاXf(�9����"�u2��F��'{��nkŕ�+tPS�(��?��v7s��g@��~e�-."���
�{ףW/b7yF[�jj�B��"�c!p2O��8�C���T.��>L竀.���,b]���b-?bd�A�lg�ż�I�u4���8_�����dIt`�׻gW
|L�t�f�����7D�ju�^�#��Q��=��\�2���Nt�r)�:�=!�=�@���7������rrv$O��[��6����ꕛU\�Pp߂�õダs�j�$gft^�T{�VH?z#|��?еd^��篯�����>D�L;,x��4*,�nV���l~l%��e�Rv0� ����q�o�f7��n�\��Z
U�1�w ��h���s�F�fE��7n�h���^�cj���U�n��T$�T�<�﵋������iˏ@�C�C�i��;��
����)�p�&X�L54�Xp��HW������Q���U[x��d��^�,k6��f��z�
���7[�����H)&V5�*[p�~ږ_��x�8��/��Ⲻ�8�`8��Q���m'���&�$�-�>\�o�<-_)�����z��|���E	ނ�E�-8z`�s�mY�g����mԯx=@.Ѳ��	��t�/fU�]��#F�]�A�I9;�`!`1���\
���u�e�;��|DE��� F�k�#p�zc�8��Vt��7'��mte�u�>��8Ҵ�u�];���t7Hup[s7./@6� ���{m�n���b��=e� J�A<�|\6h ��A��p��@JJ���O����|����>r��%s�92i�*g`C�jQQ,�0������2ꧪ;3����hi���Q:���h�}=�*�M�<~By�X;�CI�{C��H�Vǫ. ]`�m�s�
H��xX�^ߟ���K����OF��=����-�m0���F�=�X'�'.V�no&�c.�B� ��p����U`O��U��k���O�B��at4R�T;�T�?й�.��Vp�+:��	��x�1�R��e���'�n�w�{dG����,�k*�t��.�|��u|��H&Ǎ�x]q�sz���t
�TR�--������)fj�0�b�EY5�)GM�!�f�,"�,�ؒҟun.�^st�I-�,'{f�/�qi��p��{�ESM�LS��� �y��o��ܹ~���ݫX���D�9ҳU�Z�9�\��}���{ƛ?T��4����`�N��R`b�srM���M�Sq�B���ȿ�Q�8ӁVW��Z7.VbH+L�WȻ��ʈ�@�?����j�}E�{�N�	��~a�)�!�4��M#<���	"�@����2��#��zo�@�5�D9�1�+zbr�q�^���� �A�+ğ������Y���Q�˫'�W���'��=��靳yܡ�&ur3E���o�-���ɇ�wo�c����>V����H�����f-*v�*r�"��}�>8�>?�
z��,���@?�I+h�G��F͐�����r����E��T⻣/,<YXHP�T��g�0к�5ⶫ�a?�"H��v�n�Q����G���ܹ���5�
�K,�ss٘Ru�O�c9����ɛ���7�>d�,L(Ƈ>�Z�9�%Hó%�
M�}���FA����72�Ͽ����d�pe����	u���8
����â臃l����Q��It{5�i��绍�6FV�*�n��~i�lu+��ƭ7�C�n�w��g&�
�r�ÀB�;(`#��@iBB%��"T�=�a��L|�E���Z�=Ϳt�����Q.�c/g{̯ؕal��h�_ғ�9'�8�?������bAv�V���-��O����^�����S������^s�p�~�컝]%�p�����tr;��EU�p�3��ڷ[Z�%�kn^=�#VaA-ד(Ed����������ۿ�'j�l��O�ߕ[�ZX���O�Z�=����ѯ9ĨNA�q)�����	�YvW��q���V�S��Ϲ�raMu�&�>��E���5��\-��>���?f�����~���\����Jp��t�!�Q7f����T�Ɲ5���x@y:?	��>�o�<��7?ˋ��遼4�'g�M�D�����ʗ�� k��\���Y*�]��[(xu9��`���uK�<��5D��c�Ќ48H���ϼ�{Yw���^=~6��~ i�ԭݠ N��	��?MG۹���J�A��6�3�� ��-��>���a�ﱸsb=���vR"��H�}h�=Gn�q/-����s�ӯ�{�k366Fx�!�# ��U;c#׮Et�q���ݖ�~���mNfHۨ���S��X�$:��H��6]��f�`�h8�G�h�!��s��7�$�à@[ۃ�ɮW况��-��J��*M
�-J<�6����W��?n@��zu�_b�����Ej�ŁG�ݽ�#��o�L��w �9���S�"��7��Lj$?xy�q
B�gКPmϳO�L�����M�4O���u�\OK�}��.W�!�G.�6{}�c,�`��B`�H�P�A�S���K�(o�H(�$���vVL�-;�*Ƒ��B頋�y��,�ƍ�d'x���t�VqE!�p�=WbK͢uݮ����Tb��DMY~��gc�Øc��/�����.��0�:i�zֶ�\s�����x����r��R>;�l�����z�]�P��su�HZH�~�qW��n���?�LBv��Nܖ�ßE��2�´|�NNV�Ѕ��Wd�t#���Zn�,S�}L�"r���-�����v������Đ�}��Fb)�B.j��j��C�Y؍��g���';얮��׎�݀�>b(Q��.ɏ�c�c�Lc���
��	�xmb���m������u���*�p�:�|�f4N��iJb��2§.a1�Q;�pX�Ǜ�z�oȧHbob��=�E�=Mq�>Y,����0� }�S��ܡ��ӳ��e�\��
�����/�����iT�*L�;D��%��a���`��9��Q�`h����]]��^Eq'�Mè:����8壺2u����ИR�;�33�GJ^��Wճ��\V�%�������,��4��;��0�}�E��X���V[�,�r\��`s5%lf�F��a�TR#��,�o�ꯪ��P��f�o�������m��HJ����������m��٧S@Q2.�)�2�p9�!>�G� 0����Z�����W{��J�qo�=�0ٓ��~mۧ1��%m�T5˪��ߑ��?�v���3�m�E�k��&ڸ�z[�."�RūV=���Λ�:��:�Ʒ՗зDj����\ޯ�ūv��n�鮖ˡ:&��©���M<lӘ3;�P�A����Hж�׵�d<fZ�qx�*�����)�e�>��=�м�;��~X��jw�
�a /�\ξm�	�~\EIlgg2��ə�d�܎����'}U�9��St����,�e=�L�9�-^ۼ�^�6v ��
�S�ތ���,i����8z%:��f�K^�{S�2��/+rO�'c�a�[L|��j'0S�4�]�	�E�t7E:7���&�h��rE
��>G�>&�Ӷ���8�]Z���B���jy:ܯ��O�n-���Pɽ�v��@�W_&~-�{���9�����Ê����դ��cY��?ˡc�-uSi��F��¼CAl�p-*�*�Z�$̚�7��*;�؆'��[^�����@�\eo>_�:z�C�wؓ�_���}=�I�(L|]��q��޳��!rj�6p�)��tk#_�ꜚ�6��ӹ�y�F�a��p@O�"j��z_ZT+#�j:#�����A4�PTK(���^q��P��q����nD�����aP�ۣ��P��/]���H޳G>��tH��նb&?���7�gK�V��Ug�hh����7H���ƻlM�����gj�$�G�ƨ��;=`���m�O]ȋ[V����2�9r�`�D`��pA})�-�kd�?�m]�C'..c1��i�������e��9���s������Q�W�:<�{n�Ӎ2�('����f���qV~5�"���46�)/�w��7�9���g͊�@|,Һ�n�a]�kx����Q�j_WR7I?)#Ơ�O��^�_�Ћ�aЊ)O����w�ד@�R8�b��ϐf�p��ߖX/�Qٯ�O}d�/�qZ����R��u#�XWQ���d��Ej������ߘOƴ|���=���RV JvB����
�h��f�?��x�x�ۂ���o�.}�0�]FFn(�.�L	<Y6tyP�B,�����$�d��7��
�Ϗ����u3RO(R2]�;N�胋�K�9��n
D�ˬ��y�^�wz^K=��S�r�E��%e�ͶDֆ���;�O4��<(^���pl)?G#�A�]7:W��z{Dz�
�c>�@�B����]쐄E���ҟ��Ra>$3�oY��xY/�������{��=@&I#v.A)Y7�5SG�1�<c1�e����Ӳ?R�젎��X�ZSӸd#-Y
�d+'�PfM&u�J�e@����˦07n��(�Ànؘ����+�f\�U�G������0�<Ӭ������w�9�9_׹-��T(�*��*,\Z�):oN�og�;I����O�WgA��A��s0�N��+�e@���Z���ok��nK����.��w�3��_dEy�
2���I91
��� ϲ��!����yd�j�$��?��-`��L=�}�&�
a o61	i`!���������ߒ�}|P���E,��2T����v�X<=���p��!���v�_�x���n�m;��,��1,���<fS}n���X)�:�Sv�v���O��[Lm��C�a�r�V�j�-tO%vR�$I�b6�F{�������#�O�}z����r.�^��[�\vD�8�F#X8�q"�7�ܺA@j��{���7��fZ�yt���
���vBV�;0��>���c�M�ߍ�7nP}��3�aGՉ�]����X3��ۈ�*p�&�O�a*�~��+d�a��v���9��
<�;�}�O.-C�N��.�*�����{��1zo��u4�]�������Q2YZӼ���������xr7*��B~���x����o�J�Z��m��#�Ҫǐ؍���PN�n����{��
�����k�~�n:�BU�fE��|�T{���zT�_� �Z����sK���π��@�b���B�c00�JA�`Yl�q����8�>�&��x)&�kK�<_w
��H��>Dz->k�ˎ����w'��WA�y?&*6�L�W�4��łe�R�;�{qJ�4`��Z�W�����cE��>�x]����\Hm�o��GJ���ٝGѧ��j�$B~���A`�l�Jw�1�.1u6��d
ǝe7W'�NV6�a����r(^c�S�^����x�8@��&��bN&I��v�M�V9���D]���Ҙ1hO0+�(E��0_α����@݈���Z��K��I�-ސ���>Xy��W���2�\e2���b2�Ȃ��a6ف��rDC�T�%��ċ�����w "f!:K��@U�!E��%2����d���7��Dž��[�"��\���N�u�L�Ɛ�Vӻܫg�y����V^������U�2?�T�!Kz��kq'bwK7��?b��۲�
�-�b5ūAᚼ0h%��/�O��QsS��b?��_������ܔ���p�0Z�C��\�ǖ��h�\�N$�����[������\��Td�q�Νg��jn�c:2H���<�A��1~�Xx,��-%o	����:�����<r�B��b\=�%���+O"��>w%�/��'�
6&�3K�$��q!3�fg�b�M�SS���|��۞�u!�=���k���W}����v�Ә`�)>=Ss�a�uP����f�j��+!+ppE�� h@�v�_oKB
%��P�ۂIygR�qs���!���Ж�jܯ�rhΛ;�����xN{I'�²c��� S�v��햸��`�O�Ҧy��"��=�-|�Y�|� Ɛ-c��!��#!��9x��?Y�SD�FQ��O��
�
ž.�W�(]|M�@�kV�q[�����8R���^jy�Gs�H��)8�à����u��s��I9!����ĩ1��+����l���9�W���;�M��n�M�M2�
.3����!P�w���/�أqX�&�\�OW�G��C���>g��,�}觰�~h��K�%� (�U�kDl�Q�ɺ�ۭd��nZ���p �l�~T�J�����$V'=�3��9��_�[������t.��r53�
$v���'bD�$�r��}�ώ����m���h������9��g��K���i]�]����4�-dQ��Ah�%
@�i���h�'�s���y����&S���<l����^�"�}�r�E��V�7σ?D���}��K��!��=��M,T�k7�f]��.��6��P�'J��/�X�C��܋rL�����c��]p�.��h��0�c��6��-��>w�Mj�H[�zt4D�r�8\���`�X�e�ۑ��d(�g��˷_��u5�fTH~q8�"�2믤k�x��7#2�G�?���_�;�%Fx��:�8�颥�Ž7SZ�l�jFGZ�"7� ��������0
E�Z��G��H���#3�ޖ�yay�v�-V!?��o^P~}�X����IB9�\�g���Ή	�MG�6�GS�v?�F�W�����E�ͅ�&��,�.pwƉu��1�Qˆ޳���>���4��j��n�l����,JS��x�
����R�4��B��Mbˡ���`����6H
�,7z���-��YB�jZ:�l�
)��	��i�OԾ��~����k�����f�F�$VLRnZz����ge@>jП[�q}��Ӟ�c�:+�v��Ȑ�<�d�l@��,�)�ލ��GG�/���}�s�1y����*�W���A9�Ѓ����W�1������Q���Ņ|��F�GT�ax!��`O�
�-T(�u�?�m�;�{&�?Q�cDeP��剆���O��Y)�(���j0U�v�g�����R,�bsJ�^�DEN'�ߵ�Vu���D_;_Қgq~X�����H�1�Q;��f�gh���*�|:iβ`žs07W�%p���/�q����l�J��(��D �$BȈ��w�� x�D`=i�u�< 9$`9/����J7�Yխ��n��k��칁�炡߻xC.�2�G_��g.���j#�vօ_'��f���^!\6����)���^���;N|aT̝�9=���rOV�ZԈ�:�^,��,{b���ՙ����ZV�-p�[����%՜��
���F|q��Q��0��n����ـxa�"G�!���$	��,�t� ��G˽d�Oo�J�@wA��_F�\�z��2�(�
�w�F	�
��Ph�w�]�?�%�!��ί�D4G�<ӌI�!�J&��<��_�!S��1#�D����;ñ�ǐWԊjQ��q3�ԛ��c���*���4�?�V�$�|�%x�L�������˞Z�-�h#
ϐ���s\e���D��n���c��8Fr����SpG9=�̥�\�铰�;~o5����m.��F�|un��r7�u��=�m7�#t���ĈV�#�E�������
�'R��N]�AG��;�y�$��O�9XC ?�|ƈ��tm�0��ɷ�kG�u�_�{����-��E�C��)A�s}/Ȟ�m�x��t�R2��{�=*lt���<[����d�������-
D5�y�4_Nxx�����i=�zϾN@�H��#��K޴O�\R�f�)�3�}D�70ׇ�~9C�'���(賣���|#a�y*���/c���ܐ��Fdk���YS���7��dn�FB�d��!/}���}�|&w��
��~�dɫ��vռ1��gc�)�x/�|
�톑��xk�����
r�D�IR�`����RJ�?;�MH�"G`
��G���4E��m�o��,�"K���/|��L��~BN�����i���j�嚈V��- �Q�hm�V7k��X���ϫN�z�~�����*uQ�,�p�>)��f(����SD=�!1��Ya���ޫ�����L�/)�1u�L�>��3?���IuO�M�:$�5]d��_���J2;�Ա�N�Wp��.�T��S,zW`��A`��;���p]q�/�~Ye�}����׬qp�|���)dq�2�d�0�!?`����#m^��=��\����F���Gkf`��;Fvm@�W!i����ӯ�V���x0q�ܒ�1s��#�D�34k��]�M
Q���f�F��y���	0DҜ)�W�����?B(��:C{�@{��-���o���^��"N?���kt1�����[[*��Q��ӆ�^�y�_��LVq�[G�#�rS�(�R,Y�	�B�dOTMy������-��-���׉�G}x��ӄ�B�r3uHR� �R��a,µ��ZyRK�@�L�d�:�?��Na݋�P�c;خ)�φ��Vi1�l���ۖ������?����"+�Y��VA	$
 �
1Jfc;���6+�
3Rs�� �:}˷��ճeX�%Z6P=R�>֡�?9����M@�z�0�&�Q����(���󠥗�]�!��G%��O�B��Es=\�Z�)5^	D=�G�pOZ�^z��yϔ��YX%�dU�Pib,�p8qa�ƕG�=�
�|�#H���1%�Q��<�g�A֜nX���}
Õ�O̅�Xtz�}ި�����_���V�Z
�6[b���)���}�=���N�����Z�Mhȯ��R�/R����s����c1 ��QF;�>God��eMY���������ה�>^��:_�c�D������hd��ݝ|����g���'3yJ����ti�{�1��]�ћ�,fӈ�Y4��/�����C�1�^��ؓ��C"+�bZ]OGau����=���)A��{�?��/�hJ|����;/E���f�7��8z�P�{=�#H�%!z����Q����Ss�N,��-�r&���
Ȱ���en��%�_M��։���_�7�ۋs�%��A=��G'XH�n�r���YY�H��H��<���O����@aY@��*�[ln��7����ފ{;z��˿Jy;�jHO�pYG8�kx�-�E�v���?MK�\C���P����ܹ���K�Z.�A�+�ؔ�%
a���zȂ�0�O�U����(�i�ٽ�#P�E&��#il�L;�)���Z����?���L�790���~�Y����f���ps�z�\��7A�����8�AK�Q�f�JN.6N�<S5}�����^�'WiX~[�&���%�a�8��!TRSqp�lj�8O"�LH�;�}���|��5��G�Ǘ���=J��[0��M��"�"c�`P�P�Km�-�$���d�Xі��[�R�7ㆧ�1.{��'H(�"�s��[�/Sq��d�)����-h�0�W�qT�A�4������z[��]\����a���qw�V|/k�%����s�e;���n��-����/��j�y=;�chX�6'�)4�+�vz�'�(
�H�+�s�i����Ӏo+�g�Q�%`.��؛A��]�U�O��[�ჽ��F���-eD�7�\	'h
�����iܝ7.���tq��qA<����RZ����~��P,MAw=�g@PR�5���e�E�ѳ�A���2��g9-�|-��O��T���G�H�3b��܍#q�1c�ܶ��a�}�?d��(%�:k����s�#�5'�H������b?���]���T�M��W��#�"�y����A�@��Q�f�Nը�0�}������g9��!L8�
Ck���n�C�m����oc\*I��[�������1nG����4U�<�D��9,������=D4��K�:q�W;�=�Bh�~�Z�~ЏN$�~	���^����I7b���}��� 8�
;��p�mﴇ�!p�ED6!��� ����#y�A�^[yA�祜��b�՚1q&�PÁ\�vzF��5��
�v4�d��в��N~^���@3����ď4Z��VCxZ��L��=ku|�Ვځ�{s�_�����aunN��/�BVЦl8�%�RFí>��)ޑ�{�_�^��I8�J<%ԣ�h{��b���ft�#��H�;ڲ#Avȿ/�}�wu������&s�9��"*,}J�|!&�4�N
I��|
��|C�'�O=*w*����w,��Ί2
K�1 �S�8H��;��}/c�$��	bz��C��нU^��N���q���s��I�/cJ�؟N$�6!�\�y�����b�N�D^��J�������L�(�g�-:P ����]�%�,T���׼�:־p�Q�W�;�����A}~%���\�=���.����x
���\\R�.����u�0�qh�ۀ߻����/�*R
��C��ӱ��A�U`/E�T��s.6E��mi����?��ڕ�rp]IB������=��%'p�A7��q���^oԜ|���g�իQ_3���
d��W��\���v)���4�wӸ������ۣb�5�>�+�9�����"k���/w�G�j���
��e��@]dTF�@��n��C?Qv�̴>��Dz�rl4>g�A��7*��֣��'�@/9߭iE�4!�s��TdS�4�
٘6�|���z�ki�(4g�+�Z皾����=�x�V��Z}v�d�Bn~�ޝ�?�������\�W���<]�}m��"80�ƭ��\�jA%���W%ށ_��gkV-��cw
����ù×f�W-�Hՙ�=�	�}��z���`�g���r�h��� ����K"2Q��y!)2�����-仵��|�*��!�:/��Zu���$;�i:<�^����C����/����y`S
+��^���784oI�LўY̶@O�;��?zDA�j(�^T�r��Q���\�šr����Nl���jG�je?/C�_���{H^�	�go$r�7k���瓰R5��������#zD����Q���U����������,#Q�tj�˽�.Ow��s;y�ۼ �_5o��Wr%�$!
i$�A����!���,�t�+8������g���3�`�w�>�@�tL�F4L.-@<���px_A��G�~�:�ZS�ő�j�l�p��A��{�¼��krKD�[��(��"�t���k�A���vF�e�W�P��R��7Jc�?�8MZ&�Ð���q�RI�y\ty!��������|���bp���H��.@��ۿ�ϫa�{PZ�ِl/�R�?=�i�1���Θ�[��O�l�~֌�g�η�ё�ʰ	�7窶���#�XȀ�Xzw�(����q�,�“����x����9���՛�-�Ԑj:o�^ҫ���A~����3�.Ia�4M��@6�8��i�\v�l�G�F
q��/�H�TVT���fIE#�<3�H�
��_�nK�P�'-K��x]�Y��e|=h�6����^��]�sYz��I@�C���y�q}�/��+6n��|a�fҽ�.4�4iq��%l��^��@�SK����C*��n#�e�n����3��=a�{�(<�:��B�_�߯Y���~:w��hp�
>L�]ڌ,���L�ivm�.� ����)���o~�q�����`XB�C>�@�b�(���m�M�WtTߒEJ�!�K����=��ڗ�q�
n���gn���b�;M��H2Mț`E7�9���R��W��Y7M����~0�k�ӂ0�)�SO }F{U�e.{�jw�cH���s��G�?O~)o9,S�{1�먤��M/�LC0�{��7Av3��2җ��_��"��H�F��[ă�6*��{�ɥ@��1�� l�x>����~i���B�{|�0��He��,�u���1�5����-AC��z��?��=�a�K��� -4!ȭڸI�y"�rf����d���~��f�/G�?ܖ����&O3u�/��5�[X��'a4@�%�al%=1���M��˔�*�����UP_߾*�J`=�0|��~�"5�Jчt���;��%አ�����/��}I�͔*4,rT��A����D�(ve;5�I�[����/�0z��/}mϬ��6I��r��i�����m�L1�`{��P=���N��>�(�q��p�
]�����~`����1(��ޑ�}�_�U�A~���֣\摀x3i;��F5����ã��+��
�^���~a��kn�R�O��B ��CD�����|��"{����y��[���j��|�;�	�� 0����43y)og�<I(I�&���
����/�B5���N�_mW����EHn#2>2O
"���2�<|���s��S��;�F�$��ڹW�����=;�hQf���}~(?F^1-uI��uI��+f���si�;�������~����j9�g���XV��R��_��śCь�\Ƶ���2C����/�O�d:��A�`��v	3�XR?�˒H�;`���U�QY	�ۧS��2;3�P3���l�N�>��{����IU0������6yV���;U;��U:�{���
���e�`�����`�VOcKrS�Y���I�{��a#xz`.~~�����²O�e�3'�)��Me�%E�2�P3m�\O�< ���E
xH�F�"�/�f�������� �B�X�iF�0r�u��Y�ʁ�Ȝ(��$q�����­���{-w�V�`�k�qW�=S��p��ȁ�GL�|����W�_f�"7��w�/��9J��`�}��֐˸���D�{��JR&NJ�I�z8�D;�qu�l�5^G����}��XG�X`\&7A������T,-���V�!�&�V�ԁA��y�ާ;���&u�\���;7i~-���T=E��,�Z�u��X�Q���I�4�{.C[��U��R����8K�/5�Z$��ڻh�{Ўb���Pd9��dӹ����,enr��Iy�{����@�]��{�v�9D��I�ٺ�Pvb�L��6�%1?�	t�O���/�j���i������ĨMS��9QL�'+uP�z*�N�qO����=��H���O�}´��4��D�&���cȭ[)P}�MD�}B�ƬH�l7Q}�`���.}�3��(�0����;԰u|�i�K�>먼�����v��G35��u�������g�?�l4��Ҝ8���v R1&���hfNr �I��S�O�6�(s�`%=������~Zznp��4��dҍv>kpv����{ �Ha��թ�9���-�N�[���G�	��`�K:�)O�~�JO�x
��?�-m�܉��bޗ��K�om�]u�u�R�7G�B!�TNq�]~	�&��h�Ԗv�kR�{I�{g�R��U�Y"PBx����R7vm8/���dK��KEo�%rJ=�IY#p^���)B0�7��A���lJ�Τ�y��d�
���D�F㲓!o�T�*ܹ��Ԃ�`!D7�v�|27�Z����^�
�V7ܑ��/fJіuӦ��g4z&x��7�"k��
�ǰ-��*|8i��^��o��K���h���ȶ���_��|C�>Л�����0ݟ��:=�>3X�u
W��hg�s��˽��!�XM���o��4}}�XT6н�d����C��@V�cuG������&4��r:�@�^��u�w�ӟ���p��Y��(��+<�RU��˅|_�GxN��I��{�J��do���q,Mc)a>	V.O�B�@�q��o
'��~��@�w��y��J����|J�j�خs%=�����&2�Eu(�h���Z�}�~����Z��$��ц��*���*���U����rʹ�x��K�ȡ��7��qߏ1aR���o�=��XB.H{
:Դ8���D�c78�G�,���_�`��Ϗ ��=|�Y���N�ӭ�ׂp�dË19��f9�{=�l������6�k�w{��L�V�4A����]2��Y ߠ�����&��G��t?{�
��ؾ��5b�����1�-�U0�,ƫ������Z�O�<,��iV��W�PöO��pMx:C�fm��7�=n�䔨���'f���|E>�ɐ�3���ҠM��a��1����D˼U��Dq�N��uġ��%�AĿžXZ=1��7[������&�q��k���%�4����.Bn�P\�i�kZ�=ȏ��G߃�q����S|/᜴ӋAw��*r%6)�G�Ä6��b��
zS<?8��Զm'y1J��?/���tu���<bS��}�i�f��PKEePQX��#���pip/__init__.pyPKEePQh<����Ppip/__main__.pyPK�mWv�OV5���Upip/_internal/__init__.pyPKEePQb;sXr	����pip/_internal/build_env.pyPKEePQJ4	�>�/��kpip/_internal/cache.pyPKEePQ��
\#7���pip/_internal/configuration.pyPKEePQ4V<`p]1��u+pip/_internal/exceptions.pyPKEePQ"�&�
L��;pip/_internal/locations.pyPKEePQqM-���kEpip/_internal/main.pyPKEePQ�^�z�	����Fpip/_internal/pyproject.pyPKEePQ���?	{$���Ppip/_internal/self_outdated_check.pyPKEePQ�H}m
2%��#Zpip/_internal/wheel_builder.pyPKEePQ�w�4h���vdpip/_internal/cli/__init__.pyPKEePQ%�����#��epip/_internal/cli/autocompletion.pyPKEePQ��7�V$!��Mmpip/_internal/cli/base_command.pyPKEePQvu�q�np��3ypip/_internal/cli/cmdoptions.pyPKEePQ��zv�$��C�pip/_internal/cli/command_context.pyPKEePQҦ	x�8
����pip/_internal/cli/main.pyPKEePQ��!�[ ���pip/_internal/cli/main_parser.pyPKEePQI��%����pip/_internal/cli/parser.pyPKEePQd-�,0�#"����pip/_internal/cli/progress_bars.pyPKEePQ�ַ; ���pip/_internal/cli/req_command.pyPKEePQ��e�������pip/_internal/cli/spinners.pyPKEePQ۬w�}�!�� �pip/_internal/cli/status_codes.pyPKEePQG5�"����pip/_internal/commands/__init__.pyPKEePQ��t#�,����pip/_internal/commands/cache.pyPKEePQ>|nU�����pip/_internal/commands/check.pyPKEePQQ���	$��i�pip/_internal/commands/completion.pyPKEePQ��
?
�$'����pip/_internal/commands/configuration.pyPKEePQ±�tT	����pip/_internal/commands/debug.pyPKEePQ�S�6"����pip/_internal/commands/download.pyPKEePQi��"|
 ���pip/_internal/commands/freeze.pyPKEePQ�_�#3��bpip/_internal/commands/hash.pyPKEePQ�+*����pip/_internal/commands/help.pyPK�mW���zX7p!��'pip/_internal/commands/install.pyPKEePQcӟ�w0,���'pip/_internal/commands/list.pyPKEePQ�_ٽ�| ��q3pip/_internal/commands/search.pyPKEePQo�GT��P;pip/_internal/commands/show.pyPKEePQ?.�v�#���Cpip/_internal/commands/uninstall.pyPKEePQZ�|���Hpip/_internal/commands/wheel.pyPKEePQ��g�'��CPpip/_internal/distributions/__init__.pyPKEePQI~�Z�#���Qpip/_internal/distributions/base.pyPKEePQm
mm�(���Tpip/_internal/distributions/installed.pyPKEePQ��C$�$��=Vpip/_internal/distributions/sdist.pyPKEePQ��F1$���[pip/_internal/distributions/wheel.pyPKEePQC?K� ���]pip/_internal/index/__init__.pyPKEePQޥ`��@W ��U^pip/_internal/index/collector.pyPKEePQB�P�"B�%��Cypip/_internal/index/package_finder.pyPKEePQ{�(�;? ��{�pip/_internal/models/__init__.pyPKEePQ�,�b��!���pip/_internal/models/candidate.pyPKEePQ�׿�-�"���pip/_internal/models/direct_url.pyPKEePQm��?�&��Z�pip/_internal/models/format_control.pyPKEePQR�
����P�pip/_internal/models/index.pyPKEePQ���U.��z�pip/_internal/models/link.pyPKEePQK��q
��	�pip/_internal/models/scheme.pyPKEePQ@J����$����pip/_internal/models/search_scope.pyPKEePQ
�0��'����pip/_internal/models/selection_prefs.pyPKEePQu��	�%���pip/_internal/models/target_python.pyPKEePQ%sٞ9�
��*�pip/_internal/models/wheel.pyPKEePQ�J22!����pip/_internal/network/__init__.pyPKEePQ��k��-���pip/_internal/network/auth.pyPKEePQH�@�s	���pip/_internal/network/cache.pyPKEePQ�
{Jj!����pip/_internal/network/download.pyPKEePQ��A�
�#��f�pip/_internal/network/lazy_wheel.pyPKEePQ���h; ����pip/_internal/network/session.pyPKEePQK���L��pip/_internal/network/utils.pyPKEePQ����Z��$pip/_internal/network/xmlrpc.pyPKEePQ$��X
pip/_internal/operations/__init__.pyPKEePQKw�kx!���
pip/_internal/operations/check.pyPKEePQ��
)`�("��Fpip/_internal/operations/freeze.pyPKEePQ�Y6���M#���pip/_internal/operations/prepare.pyPKEePQ*���2pip/_internal/operations/build/__init__.pyPKEePQl�KT/�*��83pip/_internal/operations/build/metadata.pyPKEePQ��v��1���5pip/_internal/operations/build/metadata_legacy.pyPKEePQ����e�'���8pip/_internal/operations/build/wheel.pyPKEePQ�R�C
.���;pip/_internal/operations/build/wheel_legacy.pyPKEePQ��{53,��5@pip/_internal/operations/install/__init__.pyPKEePQX��*:�3���@pip/_internal/operations/install/editable_legacy.pyPKEePQI�MU��*��?Cpip/_internal/operations/install/legacy.pyPKEePQ=�s$Nz)��Ipip/_internal/operations/install/wheel.pyPKEePQ�=���=���mpip/_internal/req/__init__.pyPKEePQ3��@!��rpip/_internal/req/constructors.pyPKEePQ�$�~L�K��1�pip/_internal/req/req_file.pyPK�mWڭ(;�"�� ����pip/_internal/req/req_install.pyPKEePQ�n?�����}�pip/_internal/req/req_set.pyPKEePQ{@��R ����pip/_internal/req/req_tracker.pyPKEePQ$@����\"����pip/_internal/req/req_uninstall.pyPKEePQ$����pip/_internal/resolution/__init__.pyPKEePQ�h�'� ��?�pip/_internal/resolution/base.pyPKEePQ+����pip/_internal/resolution/legacy/__init__.pyPK�mWFR�30�I+����pip/_internal/resolution/legacy/resolver.pyPKEePQ/��h�pip/_internal/resolution/resolvelib/__init__.pyPKEePQ�Yf�m
+����pip/_internal/resolution/resolvelib/base.pyPKEePQ��|�y%O1��mpip/_internal/resolution/resolvelib/candidates.pyPKEePQ"���A.��5pip/_internal/resolution/resolvelib/factory.pyPKEePQ�gr��
7��%pip/_internal/resolution/resolvelib/found_candidates.pyPKEePQ��Q��/��&*pip/_internal/resolution/resolvelib/provider.pyPKEePQ��V���3���/pip/_internal/resolution/resolvelib/requirements.pyPKEePQm.��q'/���4pip/_internal/resolution/resolvelib/resolver.pyPKEePQ���Apip/_internal/utils/__init__.pyPKEePQ�b��qE��Bpip/_internal/utils/appdirs.pyPKEePQ��(�%���Dpip/_internal/utils/compat.pyPKEePQ'J��l?)��Spip/_internal/utils/compatibility_tags.pyPKEePQ�0��'���Ypip/_internal/utils/datetime.pyPKEePQ�]$�6�"���Zpip/_internal/utils/deprecation.pyPKEePQd0a6�)��&`pip/_internal/utils/direct_url_helpers.pyPKEePQ���>F%��fpip/_internal/utils/distutils_args.pyPKEePQp,�H���hpip/_internal/utils/encoding.pyPK�mWy����"��kpip/_internal/utils/entrypoints.pyPKEePQ6z�y�	!���mpip/_internal/utils/filesystem.pyPKEePQ�y; ��
xpip/_internal/utils/filetypes.pyPKEePQ���r���Kypip/_internal/utils/glibc.pyPKEePQ<��p�F���~pip/_internal/utils/hashes.pyPKEePQ��z3�*-��ąpip/_internal/utils/inject_securetransport.pyPKEePQ`+sg%3����pip/_internal/utils/logging.pyPK�mW"V%��"�n��[�pip/_internal/utils/misc.pyPKEePQ�0-����u�pip/_internal/utils/models.pyPKEePQ���Q� ��:�pip/_internal/utils/packaging.pyPKEePQ�{���L
���pip/_internal/utils/parallel.pyPKEePQ�@��$����pip/_internal/utils/pkg_resources.pyPKEePQK"+�5�'����pip/_internal/utils/setuptools_build.pyPKEePQZ��w�&!��y�pip/_internal/utils/subprocess.pyPKEePQ]�zy
� ��/�pip/_internal/utils/temp_dir.pyPKEePQGʥ��y����pip/_internal/utils/typing.pyPKEePQ���͋
% ����pip/_internal/utils/unpacking.pyPKEePQƔ������pip/_internal/utils/urls.pyPKEePQ���%vz!����pip/_internal/utils/virtualenv.pyPKEePQ�%	���U�pip/_internal/utils/wheel.pyPKEePQ_�QMi���pip/_internal/vcs/__init__.pyPKEePQB�ĶF/��<pip/_internal/vcs/bazaar.pyPKEePQ,�r���6���pip/_internal/vcs/git.pyPKEePQD�M�K*���pip/_internal/vcs/mercurial.pyPKEePQ����
o0��t#pip/_internal/vcs/subversion.pyPKEePQ�&��)ne#���2pip/_internal/vcs/versioncontrol.pyPKEePQ�6R�����(Npip/_vendor/__init__.pyPKEePQ�_�b3e��OTpip/_vendor/appdirs.pyPKEePQ�|�B���hpip/_vendor/contextlib2.pyPKEePQt��'l����|pip/_vendor/distro.pyPKEePQ^-a�;8����pip/_vendor/ipaddress.pyPKEePQ#���+��@�pip/_vendor/pyparsing.pyPKEePQ!{�
�	�&��i�pip/_vendor/retrying.pyPKEePQr�(� o���m�pip/_vendor/six.pyPKEePQf8����Gpip/_vendor/vendor.txtPKEePQZ���.$���pip/_vendor/cachecontrol/__init__.pyPKEePQJ�y� ��}	pip/_vendor/cachecontrol/_cmd.pyPKEePQGi�#���pip/_vendor/cachecontrol/adapter.pyPKEePQ�b�M2%!���pip/_vendor/cachecontrol/cache.pyPKEePQ��d�"��pip/_vendor/cachecontrol/compat.pyPKEePQ��omE7&��Rpip/_vendor/cachecontrol/controller.pyPKEePQ����	'���$pip/_vendor/cachecontrol/filewrapper.pyPKEePQ�%m^��&���(pip/_vendor/cachecontrol/heuristics.pyPKEePQ�ȽZ	�%���.pip/_vendor/cachecontrol/serialize.pyPKEePQ�=����#��38pip/_vendor/cachecontrol/wrapper.pyPKEePQ��07V+��b9pip/_vendor/cachecontrol/caches/__init__.pyPKEePQ��/�	9-���9pip/_vendor/cachecontrol/caches/file_cache.pyPKEePQ��A�gX.��6@pip/_vendor/cachecontrol/caches/redis_cache.pyPKEePQ7��@>���Apip/_vendor/certifi/__init__.pyPKEePQ/ �����fBpip/_vendor/certifi/__main__.pyPK�mW�h��	��ACpip/_vendor/certifi/core.pyPKEePQ��S���gGpip/_vendor/chardet/__init__.pyPKEePQ9���9z���Jpip/_vendor/chardet/big5freq.pyPKEePQ��gf<�!����pip/_vendor/chardet/big5prober.pyPKEePQ�Y(==	�$'��/�pip/_vendor/chardet/chardistribution.pyPKEePQ�Y$�r�)����pip/_vendor/chardet/charsetgroupprober.pyPKEePQ�aZ��$��j�pip/_vendor/chardet/charsetprober.pyPKEePQ\�7H�)��k�pip/_vendor/chardet/codingstatemachine.pyPKEePQ|��eIn��V�pip/_vendor/chardet/compat.pyPKEePQ�B�1h?"��ڦpip/_vendor/chardet/cp949prober.pyPKEePQD��}����pip/_vendor/chardet/enums.pyPKEePQ�=5n ��|�pip/_vendor/chardet/escprober.pyPKEePQ�
`�)���pip/_vendor/chardet/escsm.pyPKEePQ 7��*�"��=�pip/_vendor/chardet/eucjpprober.pyPKEePQ�Aya�4 ����pip/_vendor/chardet/euckrfreq.pyPKEePQ&��8�"��F�pip/_vendor/chardet/euckrprober.pyPKEePQ��I�3:�{ ����pip/_vendor/chardet/euctwfreq.pyPKEePQ�A�8�"��/pip/_vendor/chardet/euctwprober.pyPKEePQE��c'�P!���pip/_vendor/chardet/gb2312freq.pyPKEePQ~���6�#��I@pip/_vendor/chardet/gb2312prober.pyPKEePQ
)Ӳ�6#���Cpip/_vendor/chardet/hebrewprober.pyPKEePQ�9a0�d���Vpip/_vendor/chardet/jisfreq.pyPKEePQy%jN�L���pip/_vendor/chardet/jpcntx.pyPKEePQ�h�� '2)��t�pip/_vendor/chardet/langbulgarianmodel.pyPKEePQ��V�F(��ۥpip/_vendor/chardet/langcyrillicmodel.pyPKEePQ���)j	�1%��#�pip/_vendor/chardet/langgreekmodel.pyPKEePQ�f��	Q,&��лpip/_vendor/chardet/langhebrewmodel.pyPKEePQ�U��
01)����pip/_vendor/chardet/langhungarianmodel.pyPKEePQ"�?�
,$����pip/_vendor/chardet/langthaimodel.pyPKEePQ�2�d�
^+'��!�pip/_vendor/chardet/langturkishmodel.pyPKEePQ����#��.�pip/_vendor/chardet/latin1prober.pyPKEePQ6uM�U
&���pip/_vendor/chardet/mbcharsetprober.pyPKEePQ���r�&��'�pip/_vendor/chardet/mbcsgroupprober.pyPKEePQi����c���pip/_vendor/chardet/mbcssm.pyPKEePQu��&���pip/_vendor/chardet/sbcharsetprober.pyPKEePQ��O���
&���pip/_vendor/chardet/sbcsgroupprober.pyPKEePQ֑g2 �!���pip/_vendor/chardet/sjisprober.pyPKEePQu�G=p
�0(��pip/_vendor/chardet/universaldetector.pyPKEePQ���=E�
!���#pip/_vendor/chardet/utf8prober.pyPKEePQGǐ׹���B(pip/_vendor/chardet/version.pyPKEePQ��2#��7)pip/_vendor/chardet/cli/__init__.pyPKEePQ�&����
%��{)pip/_vendor/chardet/cli/chardetect.pyPKEePQ�$г� ��^.pip/_vendor/colorama/__init__.pyPKEePQ>�_��	��O/pip/_vendor/colorama/ansi.pyPKEePQ#�lsi�(#��3pip/_vendor/colorama/ansitowin32.pyPKEePQoEr�{"���>pip/_vendor/colorama/initialise.pyPKEePQP���Apip/_vendor/colorama/win32.pyPKEePQ�(���&��Gpip/_vendor/colorama/winterm.pyPKEePQz�S7]E��7Mpip/_vendor/distlib/__init__.pyPKEePQ���+6+�����Npip/_vendor/distlib/compat.pyPKEePQ�@c��/s���Bzpip/_vendor/distlib/database.pyPKEePQ��.�3JR��w�pip/_vendor/distlib/index.pyPKEePQUQ*-s3�����pip/_vendor/distlib/locators.pyPKEePQx�5gl�9����pip/_vendor/distlib/manifest.pyPKEePQ���f#��=	pip/_vendor/distlib/markers.pyPKEePQA`ߥ$2���|
	pip/_vendor/distlib/metadata.pyPKEePQ�݄�* ��^/	pip/_vendor/distlib/resources.pyPKEePQ��8�C��D;	pip/_vendor/distlib/scripts.pyPKEePQ�����z��P	pip/_vendor/distlib/t32.exePKEePQy!s������	
pip/_vendor/distlib/t64.exePKEePQR�(g?������
pip/_vendor/distlib/util.pyPKEePQ�h(,N_[��Vpip/_vendor/distlib/version.pyPKEePQ�7�`���,pip/_vendor/distlib/w32.exePKEePQ���g����P�pip/_vendor/distlib/w64.exePKEePQ��h'�����pip/_vendor/distlib/wheel.pyPKEePQ#�g��)����pip/_vendor/distlib/_backport/__init__.pyPKEePQ��/e��%����pip/_vendor/distlib/_backport/misc.pyPKEePQ�9�Qkd'����pip/_vendor/distlib/_backport/shutil.pyPKEePQo��9
+��C�pip/_vendor/distlib/_backport/sysconfig.cfgPKEePQ�y룩�h*����pip/_vendor/distlib/_backport/sysconfig.pyPKEePQDBCbY�i(��s
pip/_vendor/distlib/_backport/tarfile.pyPKEePQ��o�D� ��`
pip/_vendor/html5lib/__init__.pyPKEePQʧ-�-XA!���b
pip/_vendor/html5lib/_ihatexml.pyPKEePQ�6=a~$��	w
pip/_vendor/html5lib/_inputstream.pyPKEePQ5�mO�,"��Y�
pip/_vendor/html5lib/_tokenizer.pyPKEePQ�ӉI�C���
pip/_vendor/html5lib/_utils.pyPKEePQ[2&@HF!���
pip/_vendor/html5lib/constants.pyPKEePQ�����D��#���pip/_vendor/html5lib/html5parser.pyPKEePQ�s���="���Hpip/_vendor/html5lib/serializer.pyPKEePQ��]TZm&���Ypip/_vendor/html5lib/_trie/__init__.pyPKEePQ灦�#��8Zpip/_vendor/html5lib/_trie/_base.pyPKEePQKOn�� ��\pip/_vendor/html5lib/_trie/py.pyPKEePQ(��z^pip/_vendor/html5lib/filters/__init__.pyPKEePQ����6���^pip/_vendor/html5lib/filters/alphabeticalattributes.pyPKEePQ"��ĕ$���`pip/_vendor/html5lib/filters/base.pyPKEePQ�?�3���apip/_vendor/html5lib/filters/inject_meta_charset.pyPKEePQ��d�l;$��epip/_vendor/html5lib/filters/lint.pyPKEePQu�*�\),���hpip/_vendor/html5lib/filters/optionaltags.pyPKEePQQ�aM	i)���opip/_vendor/html5lib/filters/sanitizer.pyPKEePQ`r���*��C�pip/_vendor/html5lib/filters/whitespace.pyPKEePQ�9qZg�-����pip/_vendor/html5lib/treeadapters/__init__.pyPKEePQR�)T�+��2�pip/_vendor/html5lib/treeadapters/genshi.pyPKEePQ�i��D�(��ώpip/_vendor/html5lib/treeadapters/sax.pyPKEePQe�kLS-��Y�pip/_vendor/html5lib/treebuilders/__init__.pyPKEePQ>>h���8)����pip/_vendor/html5lib/treebuilders/base.pyPKEePQP����"(��0�pip/_vendor/html5lib/treebuilders/dom.pyPKEePQM�ЇR
$2*��u�pip/_vendor/html5lib/treebuilders/etree.pyPKEePQ����9/���pip/_vendor/html5lib/treebuilders/etree_lxml.pyPKEePQ�vj��W,��u�pip/_vendor/html5lib/treewalkers/__init__.pyPKEePQ!-�B4(��]�pip/_vendor/html5lib/treewalkers/base.pyPKEePQe�o���'����pip/_vendor/html5lib/treewalkers/dom.pyPKEePQ���C��)����pip/_vendor/html5lib/treewalkers/etree.pyPKEePQ0Dty�.��(�pip/_vendor/html5lib/treewalkers/etree_lxml.pyPKEePQ_m�	*����pip/_vendor/html5lib/treewalkers/genshi.pyPKEePQG\�3:����pip/_vendor/idna/__init__.pyPKEePQ�H�����j�pip/_vendor/idna/codec.pyPKEePQ|��p������pip/_vendor/idna/compat.pyPKEePQ�4,,�.����pip/_vendor/idna/core.pyPKEePQ׬J4o#n����pip/_vendor/idna/idnadata.pyPKEePQ�c������pip/_vendor/idna/intranges.pyPKEePQ�k� ���pip/_vendor/idna/package_data.pyPKEePQ>3IV�d��pip/_vendor/idna/uts46data.pyPKEePQ�'WX�^��(�pip/_vendor/msgpack/__init__.pyPKEePQ_,+���E�pip/_vendor/msgpack/_version.pyPKEePQ;;�ӭ9!����pip/_vendor/msgpack/exceptions.pyPKEePQn�k������pip/_vendor/msgpack/ext.pyPKEePQO�S
�
�����pip/_vendor/msgpack/fallback.pyPKEePQZ�k���"����pip/_vendor/packaging/__about__.pyPKEePQeD2!����pip/_vendor/packaging/__init__.pyPKEePQJzBh ����pip/_vendor/packaging/_compat.pyPKEePQ�]�מ�$��r�pip/_vendor/packaging/_structures.pyPKEePQ �qg  ��R�pip/_vendor/packaging/_typing.pyPKEePQhD�~% ����pip/_vendor/packaging/markers.pyPKEePQ1�~2'%����pip/_vendor/packaging/requirements.pyPKEePQ��)��|#��(�pip/_vendor/packaging/specifiers.pyPKEePQ��'^���pip/_vendor/packaging/tags.pyPKEePQJ�f`����2pip/_vendor/packaging/utils.pyPKEePQPz��n< ���5pip/_vendor/packaging/version.pyPKEePQ�[UT��'Fpip/_vendor/pep517/__init__.pyPKEePQ�
� !���Fpip/_vendor/pep517/_in_process.pyPKEePQ s2��
���Ppip/_vendor/pep517/build.pyPKEePQv��Q�I��Vpip/_vendor/pep517/check.pyPKEePQ
�VЊ���[pip/_vendor/pep517/colorlog.pyPKEePQ�]-���bpip/_vendor/pep517/compat.pyPKEePQ;ϸF�i��dpip/_vendor/pep517/dirtools.pyPKEePQ�
Eh���fpip/_vendor/pep517/envbuild.pyPKEePQ������	��enpip/_vendor/pep517/meta.pyPKEePQ�sÄ*��nrpip/_vendor/pep517/wrappers.pyPKEePQ=�s�s��%���~pip/_vendor/pkg_resources/__init__.pyPKEePQa$�K2'����pip/_vendor/pkg_resources/py31compat.pyPKEePQBiKl� ��]�pip/_vendor/progress/__init__.pyPKEePQ�̵��&���pip/_vendor/progress/bar.pyPKEePQxแ�\���pip/_vendor/progress/counter.pyPKEePQ/�ݺ
d��pip/_vendor/progress/spinner.pyPKEePQ�?��q ��[pip/_vendor/requests/__init__.pyPKEePQ���#��{
pip/_vendor/requests/__version__.pyPKEePQ��9�H'���pip/_vendor/requests/_internal_utils.pyPKEePQ�9.D�,T ��pip/_vendor/requests/adapters.pyPKEePQ��ip`���%pip/_vendor/requests/api.pyPKEePQ���+s�'���,pip/_vendor/requests/auth.pyPKEePQ����.���;8pip/_vendor/requests/certs.pyPKEePQ�f�t�����9pip/_vendor/requests/compat.pyPKEePQ�':��G���<pip/_vendor/requests/cookies.pyPKEePQ�_�17e"���Ppip/_vendor/requests/exceptions.pyPKEePQ�=G�J�
��8Upip/_vendor/requests/help.pyPKEePQJs�y����Ypip/_vendor/requests/hooks.pyPKEePQ�u�s=&���p[pip/_vendor/requests/models.pyPKEePQ<ށk� ���pip/_vendor/requests/packages.pyPKEePQ����L �r ����pip/_vendor/requests/sessions.pyPKEePQ=��z�\$���pip/_vendor/requests/status_codes.pyPKEePQ���|�"���pip/_vendor/requests/structures.pyPKEePQ��[%�u����pip/_vendor/requests/utils.pyPKEePQa)|�"��=�pip/_vendor/resolvelib/__init__.pyPKEePQ0��W7�#��T�pip/_vendor/resolvelib/providers.pyPKEePQ9B���}#����pip/_vendor/resolvelib/reporters.pyPKEePQ�&�D��:#����pip/_vendor/resolvelib/resolvers.pyPKEePQU�P�!����pip/_vendor/resolvelib/structs.pyPKEePQ)����pip/_vendor/resolvelib/compat/__init__.pyPKEePQaT��S0����pip/_vendor/resolvelib/compat/collections_abc.pyPKEePQ!�����q�pip/_vendor/toml/__init__.pyPKEePQ���C������pip/_vendor/toml/common.pyPKEePQa#��� (�����pip/_vendor/toml/decoder.pyPKEePQ�v*g�
�&��Xpip/_vendor/toml/encoder.pyPKEePQ�W�Օz��4 pip/_vendor/toml/ordered.pyPKEePQ��j��!pip/_vendor/toml/tz.pyPKEePQ}o��2{
��."pip/_vendor/urllib3/__init__.pyPKEePQĸ;;�(*#���&pip/_vendor/urllib3/_collections.pyPKEePQt�!�'}8!���3pip/_vendor/urllib3/connection.pyPKEePQ��@a&��%��@Fpip/_vendor/urllib3/connectionpool.pyPKEePQ�b�,	!���lpip/_vendor/urllib3/exceptions.pyPKEePQ�7��	i!��Ovpip/_vendor/urllib3/fields.pyPKEePQ/�]&}�	����pip/_vendor/urllib3/filepost.pyPKEePQ�����E"��C�pip/_vendor/urllib3/poolmanager.pyPKEePQKC*�����pip/_vendor/urllib3/request.pyPKEePQ��~�=n���pip/_vendor/urllib3/response.pyPKEePQ'��žpip/_vendor/urllib3/contrib/__init__.pyPKEePQ*����1���pip/_vendor/urllib3/contrib/_appengine_environ.pyPKEePQ�V�;f+(���pip/_vendor/urllib3/contrib/appengine.pyPKEePQ��͡@'����pip/_vendor/urllib3/contrib/ntlmpool.pyPKEePQ��S�*�@(����pip/_vendor/urllib3/contrib/pyopenssl.pyPKEePQ�$���#�~.���pip/_vendor/urllib3/contrib/securetransport.pyPKEePQ]�V#F|$���pip/_vendor/urllib3/contrib/socks.pyPKEePQ8��tpip/_vendor/urllib3/contrib/_securetransport/__init__.pyPKEePQ]��A8���pip/_vendor/urllib3/contrib/_securetransport/bindings.pyPKEePQ�
]^�.9���$pip/_vendor/urllib3/contrib/_securetransport/low_level.pyPKEePQ�9��Pl(���4pip/_vendor/urllib3/packages/__init__.pyPKEePQ�U�#��.5pip/_vendor/urllib3/packages/six.pyPKEePQ2���Tpip/_vendor/urllib3/packages/backports/__init__.pyPKEePQò�I�2���Tpip/_vendor/urllib3/packages/backports/makefile.pyPKEePQ{I�\>�;��oWpip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyPKEePQ�|��@B��Ypip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyPKEePQ��?��$��!bpip/_vendor/urllib3/util/__init__.pyPKEePQS�:�+&��dpip/_vendor/urllib3/util/connection.pyPKEePQ�,{0��!���kpip/_vendor/urllib3/util/queue.pyPKEePQ�.�H�#���lpip/_vendor/urllib3/util/request.pyPKEePQ���/
$��Frpip/_vendor/urllib3/util/response.pyPKEePQ6c�K�<!���vpip/_vendor/urllib3/util/retry.pyPKEePQb�e��8 ��A�pip/_vendor/urllib3/util/ssl_.pyPKEePQ��G��&#��$�pip/_vendor/urllib3/util/timeout.pyPKEePQ�	�ԋ�6���pip/_vendor/urllib3/util/url.pyPKEePQsc�� ��ػpip/_vendor/urllib3/util/wait.pyPKEePQx�q2S)$����pip/_vendor/webencodings/__init__.pyPKEePQǭ�#"��K�pip/_vendor/webencodings/labels.pyPKEePQP1D$����pip/_vendor/webencodings/mklabels.pyPKEePQg8p���!���pip/_vendor/webencodings/tests.pyPKEePQ��֥�*���pip/_vendor/webencodings/x_user_defined.pyPK�mW�L�ԂB ����pip-20.2.4.dist-info/LICENSE.txtPK�mW��{i<}%����pip-20.2.4.dist-info/entry_points.txtPK�mW���"��:�pip-20.2.4.dist-info/top_level.txtPK�mW��_n����pip-20.2.4.dist-info/WHEELPK�mW���]����pip-20.2.4.dist-info/METADATAPK�mWS�N�B������pip-20.2.4.dist-info/RECORDPK||�v�/PK�(�\��MYS	S	0python-wheels/setuptools-58.3.0-py3-none-any.whlnuȯ��PKf�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��VS�#�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��VS!pkg_resources/_vendor/__init__.pyPK��VS��a�Q}` pkg_resources/_vendor/appdirs.py�\�v�8�������G��L��t:�83n_:>�����O��P$1�H-AZR�y�}�}��*$AQ;nww��PP(�C���ߚ���]/h��g�0*lks��a��,��[?���g�7Ƭ����ӭ��mv���
o�N�Y+��'��,p�1;{�כ�KG��OU*�e��=ߋ=.X?�X��<y0����\'��`K���=���HؕJ�s�b��fs��äk�ᨙc�	ñ�KM��|�������s�����1��z��u|�€M��L�!\-�sb��=_veL�.��8�b{�Q(@�H���ďmG�����;��[�������'Z��^��<���������w[r���>��z����G6
��iB7� &!5a�E�C�(\>��o�xy
�f"棦���#�&�p�C��|���t&����'�~�y���8�a4hv�A���ǖ"��^�tnx$�����N���N�=i��z��W�%����D5Xqp�^�T�
���З��T.�p�������=�g�e��bI�as�GԄ��7�dÚ�XL��j�/΍S��aj6ݏ8#$��!�w��q�0 �uW��{PD80�`���>\Z���3��cp#���6��*5p�`	��6���@�@R�����d���ࢅ�`
?���t6X��1�k<�z����]��� �����`�t�3��V��a�p\�[���{�{d���,��}�����O��b����W�&({�@�([��Z��W��<%��
85u0t��k�(���0�
�N�4R��Q�_Q�@`�:0�����['Q���ﳱQ��B�)�0���$u.<B@��K$~$C�
B3����Y�I�$ ^���l�h��"�lc&�\��H��q���p��\3��z*	�m�B�(])����L� ��z�pB����	f47B2}%X�q�Q�JN6�5L��1ɍ!)
�kN�ȋs�W�%9;�Ȟ�k�KUr�cxV�q��pN�S�A�r��	Ύ���Ϡ�� �x��<� Rψ�P�C!�p%��LG��Fţ�4�Af&>��%�t�#�K��_���iD���$�@��3Dž9s�S���
C�;A���)�^g.��<fWQ�3ypm^�� Ϊ=E�.����hp�f��%�T�Rj�'at��'c�鏣� �ё�9�}��b�,p��~8�v�4���;�9��B���͚�����e�l�	Y�4�Q�DcuA&��	�p��r��ZL� ���2�a����Z�s�9%kI�|7�A�_�oZ�!��~�4���b��/`��s|xu�yu�椁nF�AJɃ� q����:Nw��>V�Hb>��D�.
�e;��c�F�8���=�=W~��\�q�Y��~�J��-��*�H3�I�dI龕}P&ҧ(�i�M8X��r�q��n.hYƈ�e7���`-�����Q?`�%+3m��K<�Ø�����vBn�ӀK��Zgǯ;�����W�z}qt�5�D(7r�)�C<�E�3�q���z&i2��&�ȏ�pqIh'G�n%S�ƫzi�I��h~{zB��R4��_$�u Y��Zuy̩���<��
���V5��(�`���[��l8����#��J2�Qoh��Z	E��-!-J��h�7hS_��؉`T�+LI�z��%MF��;�u�yp�X�
`:�^�{r��G01���gj���46�P�m�?�p�Ҩv|���
r�dh�U*�&�j����d)'�6�(�[ ѯ��yǥQk�~�IB���!�:	�n	�~�:��ک��߾��X�6ņ^,�
���\8����]7�~������a��_��V3�@7d�2�gv�I_�]�����C�c!NB���o����g�!D� K�$"FK�B�`_��S�g���k
�]�ysq�b����m��^�m��zۀcf�#e����L�8*��� D��h�)��|��'�Y�~ʙ
����>�xjG�3�5h�	�uZ�7��U���Z�A��:9�/��΂�����`	���?���*yVS�,3�����12�j����g�dSV�������7x����?b�o�?���,*g!�veeAqU��k���f��, ]��������YB���;�7sL��p����	�TX��,�ɬOs)�����F2Y��[��j�\�_�v�D�X
{LÏiX
�KaYι�b�
kk��x�6��A��K_&�%ů�dL����}y�k�5�7�9�>z�r�%�"�q|�F^P��-�(ͣ��߂�z5�������嗱��
Ukf���\:*˫�1GtUr\��Rf__O�Q���2��c=���,�Y@��FJ����n_��)��#R�6���`�V(愎:��C��}cZ����>��egO�ko�g-ctno�尕-��k�[
R��5�+��\���/Dj�tch�>���G���t)T���V�bE�G��39)��H.�-X!ަwz�+�3ꥃ��65:��K5�l֪$$���I��P�0�R�~�f�L
{褯��*>����m���qk�A�"q�b�f�m���&�O�����U�
۶�o��<�wڧ��~8E�H���uU�Cx�x���y\����-�ryv~vq���c���m��\��&Ȭ+;@E���^��4��y�g0������k��Yf�S��ېR�p���0�����:YR���\��(	|���h�G8�G�
8�x~F�YQV��O̲'��X��9Y����d�c�[���N�y��M�C�%!��Ļ������ʏ�9֦�R����A
l�Oc�^
\|�K|�������o��V>��+�+�����/��>f��,�md�{+*�b��RC�nd�)�ƚ�[��d�����Ԟ��[W��8�̊T�P��^i���{Y
�s�U)"x�E)"E����R5���>;�b�9����Z���N7���rhNr�`�	=Xb+P�@�,pU=ǰ�R>��<�Y9i4��3�B�43�ߥ�p��dkF���G��(f����ֆ9sGa:�N�f��eH�K�S��Ճ����;B'�Ǥ�n�E�v���)Ft7<�x�Eh��F��9 ?��
Y�+�;���~?���`����4�E�K�Ncg����n�8��%ӝ�2���1}��l�N�2Vet�'nax�R	����s�Qz��c�&h.i�[9�<�/2+c��V_į�DA9��}��L����\|H~������Iz%�e���N��2a��*�2��3�U{�0gvz8��u	k�.wcl[��-���
�L�"�ߗ{��QO|�D|���Y�^ϧJe	D :�ϓ�<,�y�	�Y��EP��sK"�i.}K%,9A��$N�.��r��!$F1Q9
�c�mdL���#_�`}0#V�:�r�����!�}-���;�Z��y�g��V�ا� t=
G#�GG�'m��h^����1S�z�πI�
����|��?����_;G�޾=9��k����,��]�l+��>J@%A��4���t���-�;%I	�	L�����9��3�����'�0ܘ��j��Xj���;�A�yS�G8��
G6͡�L?\��t�Y����z���r.�<t���ȉc��thn��ے�
vv
{��s��
N��9B]�:�a)��).	����j��h����tn��m�Jq��R$0��h4��\�V�_�������I0�����ᐾu���C�
�Ά�`�b�����FZ/�&a;�F��T.�������;�����/�r����A�sH#�����Ιè�ߕ|�v�>�?�-���\�nĝ�<�7F�D
��C�h��댽�v){�l��[(bT>nå6��?��Έ�I���XA��:���-�N{��T.����)�B�,
G���Yw�_�����?,�~ݤ,H�l�		_Y:X]�[ݝ��'Rƪ���ɭ�v����&�2�E��6��W��u��^��cRo.��E{�J/�<d�w�t��kA�2�q
h��6��l�Ő�w�H�ːf�͕�ɧC����Yh�N��5eJ*X땭0r�͆��'#���kGx�qlȳǼo�9�й<�z�6�nΰ��7I�Vu��t|=�+)��2������I�e.�I{�	N�/�_
INv�w@Z����_/O4�Pn���x�B8wФ�8lQ#5ơLi�z]?�m�����G��A<j���O�Mj?k72l@�%��� "��o.�k��O>�ˈFn�{M��2@k:1��%1�&Ks�\V��L�)�I/�-�PYS�Z�ܗA�\���&7š�`�դ��c��m)�/B���9�CA?���tF��(�
~֛�y,}7��#y�hI�½��K[Fq�*l��BQhA��c�7����f���k4�h�9��z]�y�Y C:n÷ھlk�b��>��YܻF��iU
�֭4F��t�xI)��ڱ��(�(rzE�C�����>p�lְC�_p�
��M���!~&���̦L�`�ay���f0_ؗ����PK��VS��+\�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��VSZ�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��VSeD2+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��VSJzBh*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��VS�]�מ�.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��VS���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��VSb��.%*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��VS&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��VS��)��|-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��VS��'^'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��VSJ�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��VSPz��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��VS̛��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��VS��",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�PKe�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:���PKe�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~PKe�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#��PKe�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��/PKe�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����?PKe�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�;PKe�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�PKe�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��oPKe�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�PKe�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ۨ�PKe�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����$�"�>�!'ǔ�����ϑ�?PKe�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�/PKe�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�PKe�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|PKe�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���PKe�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�@���PKe�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�?�PKe�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���.�:�� ��PKe�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�PKe�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��*���PKe�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?PKe�mWH�Lbe�setuptools/version.pym�K
�0D�9EwՍ\z����MIR?�����<�L�����(��e$0�Zp%�;�����Z�L�SP�0d+J�,'c^���;:GJ���;�9.����PKe�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��PKe�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?PKe�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=PKe�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�PKe�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��PKe�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�+���PKe�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=�#��>�=����PKe�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��դ�ͿPKe�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���PKe�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/]�PKe�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�PKe�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�\�PKe�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��PKe�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��PKe�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��PKe�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���)��~�}���PKe�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�PKe�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�PKe�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���PKe�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�"�PKe�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����?PKe�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��PKe�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��PKe�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�Ɍ�PKe�mW��{�#setuptools/_distutils/py38compat.pyu��
�@D���`���{�+J�����R�^��j�i�/�0-�L�#k>�������&B���#��f�RV��l�z왒�ZYxԮUZ�$��tUe������v��Gk ���
PKe�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�OPKe�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���
PKe�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�PKe�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���PKe�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/���PKe�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ѯ��{��?PKe�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�)����PKe�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�{~�_PKe�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^)�đ��PKe�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�PKe�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�<�oPKe�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�?PKe�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�?PKe�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���_PKe�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@�����PKe�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��ʩ�����PKe�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_�\������PKe�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�7PKe�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��PKe�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���?.�PKe�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!�
PKe�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�������PKe�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�PKe�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�� �,�PKe�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`"��PKe�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��տPKe�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�oPKe�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*,�PKe�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�{��PKe�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�ŧ�?PKe�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<�PKe�mWsetuptools/_vendor/__init__.pyPKe�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���PKe�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��?PKe�mW!Q8�AR-setuptools/_vendor/more_itertools/__init__.pyK+��U���/JU��-�/*Q�RPPV��/L�J��&g�cJs�Ǘ�g����+�*�[�Y��sPKe�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�_PKe�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�PKe�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�=��[�PKe�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���PKe�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����?PKe�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��ҝ�+>PKe�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�PKe�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]���PKe�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�PKe�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��?PKe�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�?PKe�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�PKe�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��PKe�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�`]<����PKe�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��EPKe�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>�-��PKe�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��?PKe�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�VPKe�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Ǡ�PKe�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��PKe�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�����PKe�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���PKe�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�#[���PKe�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&�?PKe�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'��PKe�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�PKe�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(�%'�+�@��PKe�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��~�_����oPKe�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�PKe�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�/PKe�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�PKe�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�PKe�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�PKe�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ڷ�ܲμ�|PKe�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$)��PKe�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?PKe�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��PKe�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��PKf�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�PKf�mW;���*))setuptools-58.3.0.dist-info/top_level.txt�A
 ����0�PP\�3�z�9�.1J;\��A{�#�PKf�mW�7�[\\!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̫��PKf�mW*����I$setuptools-58.3.0.dist-info/METADATA�Xmo�6��_�����8m�zu��I��i���ѡ��̚U����;J~�g���{y��;�cn��h#T�a��ػ�)t�[�V)i���w�I��E�r]v�97B�,V�L*�a!$���X.�+�D���bVd�:�-�Xe,�ф'`�?T
~��6�67�0L�� Ri��9W�ȭ;s)�N��Vm[�$>�\������F$��-P:�D�A���_�o���n�����]uؙ��2�-�@�Dh�C�"z_��)��ݞ^#��˥rIb�6��g�C�[��H�t	�'�1b$�<�)H�%�#�°F����ED�B�JX��,d1��X@���0�k�����N�\�)���˻��*�Ц)���gIAFuA�����;��,��T."�髑�q
k����Z�Y��#��T)=��h,���X�it��z2�4Fc0����n�{���?
������=	�R�ME���(��,K6�)Ŷ��[khk��_��}u�;���ݩj�-DM�Xd��2 ��D�b��;�<RA�8�/?v��W����4���Ժ,B�bd+�ׇ��2��1~Ua|	�x��n���7�T��E���ǃg�D*�Z}��2Œ��F�V�DM�`�G[����u�v�Ԛa��hǏ�MH=�7�|�w$��=E��>�2�}uⴂ�F�RM��U�v��jB>�\B6up�ZOq��~i�>�Fz�t=���Ax�С�qD��	�>��؄~��s;&NЇ{B�3�%V5������2���A�QD�KX4�.{�@���~�$-���)5UˮJ�I`�d��D8]�h�4�c�u��0T��%���͓DK�$�Z�0�:��>p��mc���d$�̄�"y������̧�;����y��D㯓ɥ��j7�
�9<a�bx�n[J�r�o�O#�f:����cNZ�}v[
���cF�1s �H�v���7�`UF��X:.��i�P�$��<y`��D#���0�]��c����O�Fuk��饧����XX�	��%=�xk�مn��8;�7�`�\<�x7ٝ��$�bh���ݜ�Ow��a�MF:����ϴ�B,��KM���.�Y��F�Y�x�w�˙+�g@\
?>pTt�6g9�ހ~a����0�L9W��t)g>f�ǵA���I�yTIѡ{\+��X2fC�iMc���Ǫ�̵�ѣy��Z���ىf�⪅xu���p���
��E�4�
;�p�"�XKW)P3�\�m�KD�a�Rai��F�5�!�²aۼt��.a��`x�+j�"�)��<��x�2@O�)������Z
eua�XQ��sĜ�96s�Ecn�V*5U�V�h��|��XOI��pۿ`H�^S���`QRT��wsv>���n���{wA��_`F��]�8�n�~:E��V2N#���������cx+Y��#R`�KӅ�V��=���@/��`4��=B.��
K5�z�P0
, ��s��ѿXnH��R��I?c��f�*Xa�>\������[3F�5�n-�i�E�u� �q�CT�?6\˷�cq���8�]M>-$:�i�.��F�xd_�6�-�J�>�k2�j�<��H)���>�ґxtƣIe
M��PKf�mW�"T��5"setuptools-58.3.0.dist-info/RECORD�zɒ�ز�����D�f��V	&}߃h��U'�I��4;5�4�r�7˗��A��=�t�a�4C������C�NZ����|pػs!9c���
�&|D�A���?���9NZ����,?0�n�4~ګ5W���d4�ây�7���i�$�;'ɯ��#�4�@������Ge�<�Ʀ�/��V��?P��;��j���¾;?�JQeqJR;Kj����%'�1�i�fd�OB�I���>�*���Q��&#����뱼�Ȅ��y��R#�lI.�؁�pݦ	Ү����ap�)�R;^�r��͝���j���]��UF�;%@�t�4nקU�^�ɐ�~�ĝL�`:���Ǿzdk��Xl�"@�����[�xC�\�z����Իv�>#,��y�c0���ݥq�8/�����/����k�{�G�>��U (dB�]RYI9�⍜'`�a���>���q��X܃�o.�s�N��p��M�@O!��@(�[�'��`�7l�C7�ø���N��̝��n9�K}�J5�Y3�W8�‡E��/Hj�$���K����DÈ�t򫾜m��a�����S�(� M;��~�F�vy���֥�\�N�9�uY���|�=z���2���$�Q����vL����ِN�P��Nʢ�G�O����z�Lk�Y��Z" k�R0�kC}�i���g����x������ː��CyLNy)-EW�|��Q�p�;�?[�O�!�کn�=�=��޽��>UB8���s)��V�(����'�>���*S`f�.,9v)G�$�k��4�[������|򷅍�����l0�W�B�N���0�?���p�X�\B�VR�Ū�����>	�!���Q�ٽR�u��_/&Θ	��[ҍ���`�|���u>���+p�_�|��u���'���al������9�򌱚�\fI��N&q�jv�Ye	�ܺ��?��.�mB	����΂�2�r�ZL����B����p��;�p�3^~4uw��LnW�ufP@0D�?��&*w��T�,�X�',?qC��T���,>��:-�O-�
:z�G=��@�:S����rTdO�SF9��Jo~��,���:���nD֫W�cË:a�y}�9^�H7R�:9�I�fgpG���i8e8��,F�����Ӽ�_��^��V�K�����p�_&q��#60��M�����}I�ޚ�)�P��7����� ��<��9	��d������-6�O�ggh���V
z�����
3���C҃ �v��[G��g��ҞK7";83���(O�	���So�@Y���Ic-p�U�k*~�',�Tu��R���<�Æ�!2�ړƒ4
�O���;��`lZ�~�)��?䋛�1g�VECE|��f/]�>��|n��z���_�Q��'�%	���aqK�If1O4v�q�D���B×>ۛH��W����',��3/�h�r��`S`:n���j�:��{������w(I�5���-��{.3/���e��.�G�ٷ'�(t�����	۹w����p��O�Ю�z�>t���z�
�Ǒ�����.i<=��[�*(��l�O`e]��������pF!L!���6�wU�@<yG���a9t��ie��|(�qE'����6g�f_���>���tdf"���6m��Un���(UjyS���g��Ŕ��N�G��4\.{6v������P���7J
�	�!����ݏB;��p�5w��q���@��.�)Ь�B�$��� ��w��_<}�7RK�%�X�\��9�[�9������և��~�^����N")P��mqu��bB���y� �Ztx���̲[�E�{�K���O>��C�wrc�VF3�0�n�w�J��.ؾk[��0hg�+��w�֤���ތ��^�C�4�$'ĥ��A�+�X�~�E���v�P�"?�}��b��p!����6���-e6��; ���k}�u��y�v��d"��$��^U+�����)��m~|�)	�gfUr�������a����N�%ȚP+t��\�㎄���N[
�S��c���s�`|��3/���c<`N��ͳW�QK������X�{$�N7�F7��crc�ȻpM�n��ZS�����En@�m���ϲ�#�G���8ME	�!Q�l|������~��W��Cō�pf���m� !䝁7���c�OV8_',�KX8��0�խd����m�$F���=�i��|Ed͆1�;.��(LhM#�������Hp���I���w��ᡢ4d�@Ӑ�t����΃�+ɐc5�̃�XH�v(���[�2x�
�?Ӽ1��yT�hL�瓮���E�D�
YFh��ߔ8HPoa?�`b��)1���4C�H��<9ѓ���4���t��m"��[w�K���QN 5��?�dzTHd���XQ![�E���ڎ$	�-�o���麱�;M��2�눜�YO�q�ȁ��s�|�}�=�Bo|���KݕnOxA]�nS�C �J�R�\D�	T�N�r{��o$?��qr����%,EL���ޙt~Ώ{_Bm���&�A)�-t�}�6�d�W��1�:�!zQ��]'���g���ah}�=������o����"����2N��U���iև{��!���Q��'Q�V�'��}-���i���A�)�K���rs'�bmˆx�w�)B��!���?Y,�CE��=�ҧ�~Zت� �x�V����P7�^QԹ��YH!�q�%��aKE
a�\7J0���9�-�D[N�$�mtdg�Y3MtP=1��(
i��=4��Kl�i<�m$?���h�T�%�����Jm�x(��v̂Gz�מ�=Z�'77��d�=9�s�$�}|�`B���s�
$�/f�W�*�ϗѸk��(�m�|��J��0���|�4��$�m��p��$��5��i�۔ ���7o�Yۍ�9��l�8x8k�
ƵM|�V��C��l��6�a�ۆ��C�>�z쏽]{���N��e�xp0�(�R��K��C����a�_��G"���f1�2�:(.XF6YWђ��,���J{�.`�m�ܴ��\?��Q9bڷ4��s��/H���UE�s�@޻�i�bョަ`��_�M�
�R�ݺw2�:,a��Un����-�W�2lΆp䭳���$����[p���tp?6{U�DO��}Q:��:![k�Q�m�l"u�.UF���Y/[m��ʾ�$?�C}��0�'��SW�7� �v��7�OE��g����89P�	�V�﬍c��w�R��,��t�T�6M�*aR�c�UUk�3$ۿR��	��I��d��NHб�������n�0H}wx��=7
\�I���Ǔp0���4ܻD�d6�q��{�����n�<^n#�w���@W�l��G�{p?d<K����g)ZnJrE����A�D��e�����
�@/��(������6�Q�/I���S7ʤx���&��N0�Ϸ���Q�l�E%��}dQ�V��c-�cQU%�7*����W#e�>���͒�;��a��q����~4��,+�F���o}��R|6�5哑8S&���-�-��W�p�v+A57p�\D�1�'���Ȧ�>�P�����=f��R�����[u�1�(��{u�.���<�=[�m��j�‡>�,;r�pK��mj��&�Y��b�r/���`�6��y���sܽؼ
	L�g���|�I����ɈV��Q�z��>9"�#�|��#�=7�;���]g
��ǹ��#Oe����S.%-�'Ċw����W#��b#�Np�F��y11H��K{���)�I�:U��[4P�-K�����*|RgU�a��m�Cn�A�xh��kJ�5nPg��;��y?	��y�n��H`�o�HO��Ǒ\���@��vu)WT�z��N_��ꅬ�%�Ml[�Ȍ+�<�I��?���LX�
�������.
��l�uʤ=	ةDŽ�J쁖�	�+���2�+��A�<���.�oP\kY3�A�#���0�Dg��L�7J�ZUc�&z��qy?&��p>T���W�)AbQmDXbw��FG���		�5W��b<6;䯋㇙0��.���:��EjJ����}=���t+��'<^&����8�;xc��5�l���w
O��;�QٝQ�j4
�a_�	��T|�`o�	�{���+�Pt逤P=l�0�9�a��"w��l
�c�A�D��M�o
�a�F�M�����9᮪Ta�``�.��Æ����a��鶩Y⋚mW=I�4igG���-���(�af�kXX�4�p���F�ۿ��78s[���n��Q7�	���01*9���j� �6A�{��F�IF�� f��.���0P��2��2��*��x�=�CS��-
ɐcS��s�ڟh"��LƜ�C�0�yɦt+e��&/�F�֎�>��I���"7:�=x.�0,2Wҍ?`��;��5@%6&�D�~��7m�=�?���
tYo�3����3,C�(�w	Q��=�j�F%[�JTh�x�%"���|G¿c�|�,c�%��&�i�*��B3ˁu�kGc�͊q��=qi�%���B?m^�T�\λ�^�t��-��CJ��+_�J�Y��0��7��a���/,���;?7�l��?���s#����O
|]��3�l{9�K/��i�sZ��‘�E�-�=�h��(�~a�Ͷ�),��d���Y�R�N�e����ά$9�,G��11}�v����O���{:?��ϗt~
��l�,N��C���J�!r�h�=��F�c��\l,h�E�F���v�ߟ��E�>{���l�r��ְe���׺ �ʂ�Z�{����5��it���xc����0���]�:���p�P������DFb�����aZ���Tٝ`u�[9�Vezq�.�1��&~��|j0?�;��p9�y�&�ӯ9�'��l���f����X�J�C�O��?6/�	Da!���Z��w1u������(�g45&�}�5,����O&Lc	2����tjvW��f�X�p8�jhG,�
�[��48��
�GX��J�s�	N g�d�dA�3Lg��#�y�J�<Y��b�����?C�i��<W�.���P�:�{\=P9p����s$0�:�(����~q��_�6+A�Y���<)d�.���{�����uq�����NA}��������r."PrG�}�	��N1�>-�~��T�a��"t���ty��<�`��f��+EAĚ^�z�j��dz�8<�zz_5��y��2��l�2!Snz�b�v6	R����烔����`�Y����
ν{�ֹ� �H1�$Un���O=���T���U�XVN�0�X��A�O�A:�7�uր����y����Z
���J�p;���8{٭ۃ�pb@ )�|�A�E�V�,�PQ���ʹ�I�<�d�5D,�ۺ�AqՌ4"iB>�2kx�L@��{qR��b��A�f�s���룭�h��o�t�2�.w�q�u�W�|���pW��ЗG��n��:S��TEy�&�
�d`��}D֤���Q���կ�[]Bc�����S����dV3cE���'�u��QbnTt�co`?_8Ob�c�˰
k��"#�ݷmw����,{����x~�D|OI���:����d	��b�e���JXD��`��07bR�c��>\���3-o��*S���]�q���)&.g}�#*�sG��I�H����_���fd�tIcm��`8�A��0��
Pד���y6�ބ��@������X�,a�:#OaZus�V�f����0y|�
�#>/;��&���ȍN�����G�Yy�p�Cn������^�
�� �|��Ak���+��W�z��}u�U�O���ɣ����#<c�Y��X/��
���1���v?��M���2u=Ч�LĀ��su�z,DJ��O�r
�����B-�}�d�ρ7�-NS�b~��6��JΝ7,9��P�0J��e�5u5�R�E��{��7�_�ïV��w��V�l"��3B=�і'��xE=̜�D�pH��/�x��D��PKf�mWb�/q���distutils-precedence.pthPK��VS�@=�h���_distutils_hack/__init__.pyPK��VS� ��.,���_distutils_hack/override.pyPK��VS�#�8ps�����pkg_resources/__init__.pyPK��VS!���zpkg_resources/_vendor/__init__.pyPK��VS��a�Q}` ���zpkg_resources/_vendor/appdirs.pyPK��VS��+\�x�"��t�pkg_resources/_vendor/pyparsing.pyPK��VSZ�k���,��bpkg_resources/_vendor/packaging/__about__.pyPK��VSeD2+���cpkg_resources/_vendor/packaging/__init__.pyPK��VSJzBh*��Eepkg_resources/_vendor/packaging/_compat.pyPK��VS�]�מ�.���gpkg_resources/_vendor/packaging/_structures.pyPK��VS���n_*���ipkg_resources/_vendor/packaging/_typing.pyPK��VSb��.%*��`mpkg_resources/_vendor/packaging/markers.pyPK��VS&y�I3A/��,ypkg_resources/_vendor/packaging/requirements.pyPK��VS��)��|-����pkg_resources/_vendor/packaging/specifiers.pyPK��VS��'^'���pkg_resources/_vendor/packaging/tags.pyPK��VSJ�f`�(��\�pkg_resources/_vendor/packaging/utils.pyPK��VSPz��n<*����pkg_resources/_vendor/packaging/version.pyPK��VS̛��g:	 ����pkg_resources/extern/__init__.pyPK��VS��",Th8��x�pkg_resources/tests/data/my-test-package-source/setup.pyPKe�mW_��f
���"�setuptools/__init__.pyPKe�mW�J��"����setuptools/_deprecation_warning.pyPKe�mW��	�	X	����setuptools/_imp.pyPKe�mW��MjO�����setuptools/archive_util.pyPKe�mW�N7�`((��G�setuptools/build_meta.pyPKe�mW�l<
ESZ����setuptools/config.pyPKe�mW+J���T
setuptools/dep_util.pyPKe�mW��f;zb��'setuptools/depends.pyPKe�mW2�
˹,O����setuptools/dist.pyPKe�mW��Q�
���@setuptools/errors.pyPKe�mW���������Asetuptools/extension.pyPKe�mW޷Y��	���Dsetuptools/glob.pyPKe�mW_��
��Ksetuptools/installer.pyPKe�mW2S��,���Psetuptools/launch.pyPKe�mWE��4a���Rsetuptools/monkey.pyPKe�mWSB�(���� Zsetuptools/msvc.pyPKe�mWpm!N����setuptools/namespaces.pyPKe�mWT^�-Λ��~�setuptools/package_index.pyPKe�mW�V�D����r�setuptools/py34compat.pyPKe�mWQ�짟8��(�setuptools/sandbox.pyPK��VS��������setuptools/script (dev).tmplPK��VS�3��j�����setuptools/script.tmplPKe�mWT+�~���u�setuptools/unicode_utils.pyPKe�mWH�Lbe���,�setuptools/version.pyPKe�mW�
4�	` ����setuptools/wheel.pyPKe�mW���
t�����setuptools/windows_support.pyPKe�mW�B괯�!��u�setuptools/_distutils/__init__.pyPKe�mW��1MQ&��c�setuptools/_distutils/_msvccompiler.pyPKe�mW��5R
|!%����setuptools/_distutils/archive_util.pyPKe�mW�F9��.:%��m�setuptools/_distutils/bcppcompiler.pyPKe�mW��| �1��"���
setuptools/_distutils/ccompiler.pyPKe�mW����w�F��_<setuptools/_distutils/cmd.pyPKe�mW$�Fq����Rsetuptools/_distutils/config.pyPKe�mWIS^��"���Wsetuptools/_distutils/core.pyPKe�mW5��<�*B(�� dsetuptools/_distutils/cygwinccompiler.pyPKe�mW_�H%u���\ysetuptools/_distutils/debug.pyPKe�mWk"#��
!��
zsetuptools/_distutils/dep_util.pyPKe�mW�3��
b!��Osetuptools/_distutils/dir_util.pyPKe�mW�. A�3����.�setuptools/_distutils/dist.pyPKe�mW�n���
���setuptools/_distutils/errors.pyPKe�mW]�4:%
)"��\�setuptools/_distutils/extension.pyPKe�mW�1ƲxE%����setuptools/_distutils/fancy_getopt.pyPKe�mW�È
�"����setuptools/_distutils/file_util.pyPKe�mW��%4_4!��~�setuptools/_distutils/filelist.pyPKe�mWˆ�з����setuptools/_distutils/log.pyPKe�mW>����!�v&���setuptools/_distutils/msvc9compiler.pyPKe�mW:�kc�[%���%setuptools/_distutils/msvccompiler.pyPKe�mW��v��#���?setuptools/_distutils/py35compat.pyPKe�mW��{�#���@setuptools/_distutils/py38compat.pyPKe�mW���s�
��qAsetuptools/_distutils/spawn.pyPKe�mW��>~T"�� Gsetuptools/_distutils/sysconfig.pyPKe�mWQ8��Z�0"���`setuptools/_distutils/text_file.pyPKe�mW1���8&��8psetuptools/_distutils/unixccompiler.pyPKe�mW��	u�O��t�setuptools/_distutils/util.pyPKe�mW�87�l�0 ��$�setuptools/_distutils/version.pyPKe�mW2��
)��ίsetuptools/_distutils/versionpredicate.pyPKe�mW;��*)���setuptools/_distutils/command/__init__.pyPKe�mW��n1��&��X�setuptools/_distutils/command/bdist.pyPKe�mW�wq1+��g�setuptools/_distutils/command/bdist_dumb.pyPKe�mWo�Y��"��*��!�setuptools/_distutils/command/bdist_msi.pyPKe�mWd]�v!T*��K�setuptools/_distutils/command/bdist_rpm.pyPKe�mWd-�E�>.��	�setuptools/_distutils/command/bdist_wininst.pyPKe�mW������&���setuptools/_distutils/command/build.pyPKe�mWv3;��V+���setuptools/_distutils/command/build_clib.pyPKe�mW����#�{*���!setuptools/_distutils/command/build_ext.pyPKe�mW.�8o@)��Esetuptools/_distutils/command/build_py.pyPKe�mW8�4,K.���Wsetuptools/_distutils/command/build_scripts.pyPKe�mW�m�&���^setuptools/_distutils/command/check.pyPKe�mW,���V�
&��)fsetuptools/_distutils/command/clean.pyPKe�mW���7\=3'���isetuptools/_distutils/command/config.pyPKe�mW�i�TE�k(��dxsetuptools/_distutils/command/install.pyPKe�mW����-���setuptools/_distutils/command/install_data.pyPKe�mW9R)S+
1����setuptools/_distutils/command/install_egg_info.pyPKe�mW*Rj&�0���setuptools/_distutils/command/install_headers.pyPKe�mW����	� ,��5�setuptools/_distutils/command/install_lib.pyPKe�mW�:���0���setuptools/_distutils/command/install_scripts.pyPKe�mWCh�o�+��?�setuptools/_distutils/command/py37compat.pyPKe�mW����t
�-)����setuptools/_distutils/command/register.pyPKe�mW�t��v=J&����setuptools/_distutils/command/sdist.pyPKe�mWj��P�	�'��l�setuptools/_distutils/command/upload.pyPKe�mW����setuptools/_vendor/__init__.pyPKe�mWD�*�;!����setuptools/_vendor/ordered_set.pyPKe�mW��+\�x�����setuptools/_vendor/pyparsing.pyPKe�mW!Q8�AR-��B�setuptools/_vendor/more_itertools/__init__.pyPKe�mW�a�h�y��)��ξsetuptools/_vendor/more_itertools/more.pyPKe�mW�ʀ�8�?,���8setuptools/_vendor/more_itertools/recipes.pyPKe�mWZ�k���)��rMsetuptools/_vendor/packaging/__about__.pyPKe�mWeD2(��GOsetuptools/_vendor/packaging/__init__.pyPKe�mWJzBh'���Psetuptools/_vendor/packaging/_compat.pyPKe�mW�]�מ�+��(Ssetuptools/_vendor/packaging/_structures.pyPKe�mW���n_'��Usetuptools/_vendor/packaging/_typing.pyPKe�mW�d��{%%'���Xsetuptools/_vendor/packaging/markers.pyPKe�mWiS�05,��sdsetuptools/_vendor/packaging/requirements.pyPKe�mW��)��|*���ksetuptools/_vendor/packaging/specifiers.pyPKe�mW��'^$��P�setuptools/_vendor/packaging/tags.pyPKe�mWJ�f`�%����setuptools/_vendor/packaging/utils.pyPKe�mWPz��n<'��ӥsetuptools/_vendor/packaging/version.pyPKe�mWR/�����setuptools/command/__init__.pyPKe�mW=��/M	��Ƕsetuptools/command/alias.pyPKe�mW�ut��@��/�setuptools/command/bdist_egg.pyPKe�mW��ȹ������setuptools/command/bdist_rpm.pyPKe�mW!�1? ��0�setuptools/command/build_clib.pyPKe�mW�I�V�3��n�setuptools/command/build_ext.pyPKe�mW�2-�y	T ���setuptools/command/build_py.pyPKe�mW&��dd����setuptools/command/develop.pyPKe�mW������U�setuptools/command/dist_info.pyPKe�mWE��wg[�N"�� �setuptools/command/easy_install.pyPKe�mW��v�}�b���Ssetuptools/command/egg_info.pyPKe�mW�vQ1�*���psetuptools/command/install.pyPKe�mW\Ҩ�+�&���wsetuptools/command/install_egg_info.pyPKe�mW,��,#!��{setuptools/command/install_lib.pyPKe�mW�}���!
%����setuptools/command/install_scripts.pyPK��VS]�)B7t(��z�setuptools/command/launcher manifest.xmlPKe�mW���3|R ����setuptools/command/py36compat.pyPKe�mWv�������setuptools/command/register.pyPKe�mW�!��P���setuptools/command/rotate.pyPKe�mW��4F���4�setuptools/command/saveopts.pyPKe�mW�HnY����setuptools/command/sdist.pyPKe�mW.
n�����H�setuptools/command/setopt.pyPKe�mW$����	���k�setuptools/command/test.pyPKe�mW"]K������setuptools/command/upload.pyPKe�mWm�� 	2!��Ыsetuptools/command/upload_docs.pyPKe�mWe��g	����setuptools/extern/__init__.pyPKf�mW�$�|L
,��i�setuptools-58.3.0.dist-info/entry_points.txtPKf�mW;���*))��/�setuptools-58.3.0.dist-info/top_level.txtPKf�mW�7�[\\!����setuptools-58.3.0.dist-info/WHEELPKf�mW*����I$��;�setuptools-58.3.0.dist-info/METADATAPKf�mW�"T��5"���setuptools-58.3.0.dist-info/RECORDPK��>.��PK�(�\�;��$$ bash-completion/completions/pip3nu�[���
# 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.7}}
# pip bash completion end

PK0�\�	����licenses/alt-libraqm/COPYINGnu�[���The MIT License (MIT)

Copyright © 2015 Information Technology Authority (ITA) <foss@ita.gov.om>
Copyright © 2016 Khaled Hosny <khaledhosny@eglug.org>

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.
PK�\9'r�

man/man1/erb.1nu�[���.\"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.
PK�\���"JJman/man1/ruby.1nu�[���.\"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.
PK�\Сy
y
man/man1/irb.1nu�[���.\"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.
PK�\3�8:��
man/man1/ri.1nu�[���.\"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 .
PK�\n,�	�	doc/alt-ruby25/COPYINGnu�[���Ruby 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.
PK�\�C,@
@
doc/alt-ruby25/COPYING.janu�[���本プログラムはフリーソフトウェアです.2-clause BSDL
または以下に示す条件で本プログラムを再配布できます
2-clause BSDLについてはBSDLファイルを参照して下さい.

  1. 複製は制限なく自由です.

  2. 以下の条件のいずれかを満たす時に本プログラムのソースを
     自由に変更できます.

     (a) ネットニューズにポストしたり,作者に変更を送付する
         などの方法で,変更を公開する.

     (b) 変更した本プログラムを自分の所属する組織内部だけで
         使う.

     (c) 変更点を明示したうえ,ソフトウェアの名前を変更する.
         そのソフトウェアを配布する時には変更前の本プログラ
         ムも同時に配布する.または変更前の本プログラムのソー
         スの入手法を明示する.

     (d) その他の変更条件を作者と合意する.

  3. 以下の条件のいずれかを満たす時に本プログラムをコンパイ
     ルしたオブジェクトコードや実行形式でも配布できます.

     (a) バイナリを受け取った人がソースを入手できるように,
         ソースの入手法を明示する.

     (b) 機械可読なソースコードを添付する.

     (c) 変更を行ったバイナリは名前を変更したうえ,オリジナ
         ルのソースコードの入手法を明示する.

     (d) その他の配布条件を作者と合意する.

  4. 他のプログラムへの引用はいかなる目的であれ自由です.た
     だし,本プログラムに含まれる他の作者によるコードは,そ
     れぞれの作者の意向による制限が加えられる場合があります.

     それらファイルの一覧とそれぞれの配布条件などに付いては
     LEGALファイルを参照してください.

  5. 本プログラムへの入力となるスクリプトおよび,本プログラ
     ムからの出力の権利は本プログラムの作者ではなく,それぞ
     れの入出力を生成した人に属します.また,本プログラムに
     組み込まれるための拡張ライブラリについても同様です.

  6. 本プログラムは無保証です.作者は本プログラムをサポート
     する意志はありますが,プログラム自身のバグあるいは本プ
     ログラムの実行などから発生するいかなる損害に対しても責
     任を持ちません.
PK�\�qodoc/alt-ruby25/BSDLnu�[���Copyright (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.
PK�\�$�zD�D�doc/alt-ruby25/LEGALnu�[���LEGAL 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.
PK�\D�.�doc/alt-ruby25/README.EXTnu�[���Moved to doc/extension.rdoc
PK�\�\��++doc/alt-ruby25/README.EXT.janu�[���doc/extension.ja.rdocに移動しました
PK�\�O����doc/alt-ruby25/ChangeLognu�[���------------------------------------------------------------------------
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.

------------------------------------------------------------------------
PK�\e��$$doc/alt-ruby25/README.ja.mdnu�[���# 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
PK�\�Np�MBMBdoc/alt-ruby25/NEWSnu�[���# -*- 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]
PK�\�*��doc/alt-ruby25/README.mdnu�[���[![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>
PK�\��FN�F�Fdoc/alt-ruby25/GPLnu�[���                    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.
PKd�\օAq��man/man8/php-fpm.8nu�[���.TH PHP-FPM 8 "2021" "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/php80/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/php80)
.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/php80/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 8.0.30.
.SH COPYRIGHT
Copyright \(co 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.
PKd�\���6#*#*man/man1/phar.1nu�[���.TH PHAR 1 "2021" "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 8.0.30.
.SH COPYRIGHT
Copyright \(co 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.
PKd�\��-��man/man1/php-config.1nu�[���.TH php\-config 1 "2021" "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 8.0.30.
.SH COPYRIGHT
Copyright \(co 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.
PKd�\G���man/man1/php-cgi.1nu�[���.so man1/php.1
PKd�\=�ɳ$�$man/man1/php.1nu�[���.TH php 1 "2021" "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 8.0.30.
.SH COPYRIGHT
Copyright \(co 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.
PKd�\z\u-man/man1/phar.phar.1nu�[���.so man1/phar.1
PKd�\~� Fman/man1/phpdbg.1nu�[���.TH phpdbg 1 "2021" "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 8.0.30.
.SH COPYRIGHT
Copyright \(co 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.
PKd�\\6���man/man1/phpize.1nu�[���.TH phpize 1 "2021" "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 8.0.30.
.SH COPYRIGHT
Copyright \(co 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.
PKd�\Z�\��,�,+doc/alt-php56-ioncube-loader/USER-GUIDE.txtnu�[���ionCube 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
PKd�\�z)�)�.doc/alt-php56-ioncube-loader/loader-wizard.phpnu�[���<?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);
}
PKd�\h������+doc/alt-php56-ioncube-loader/USER-GUIDE.pdfnu�[���%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
PKd�\&�**(doc/alt-php56-ioncube-loader/LICENSE.txtnu�[���LICENCE 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
PKd�\a����'doc/alt-php56-ioncube-loader/README.txtnu�[���                            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
PKd�\����doc/pear/Mail/LICENSEnu�[���Copyright (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.
PKd�\���DgDgdoc/pear/File_MARC/LICENSEnu�[���		  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!


PKd�\���!!doc/pear/File_MARC/CHANGELOGnu�[���1.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
PKd�\��~���$doc/pear/File_MARC/examples/read.phpnu�[���<?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";

?>
PKd�\cV����(doc/pear/File_MARC/examples/marc_yaz.phpnu�[���<?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";
}
?>
PKd�\���)doc/pear/File_MARC/examples/subfields.phpnu�[���<?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";

?>
PKe�\~N0�::'doc/pear/File_MARC/examples/example.mrcnu�[���01850     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.0PKe�\W]H���doc/pear/Net_Socket/LICENSEnu�[���Copyright 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.
PKe�\y˿���doc/pear/Net_Socket/README.mdnu�[���# 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
PKe�\5k��#�#&doc/pear/XML_Util/examples/example.phpnu�[���<?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";
?>
PKe�\�f��'doc/pear/XML_Util/examples/example2.phpnu�[���<?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";


?>
PKe�\���^,^,&doc/pear/Structures_LinkedList/LICENSEnu�[���
                                 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.
PKe�\g�R��(doc/pear/Structures_LinkedList/CHANGELOGnu�[���0.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
PKe�\p��||?doc/pear/Structures_LinkedList/examples/double_link_example.phpnu�[���<?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"

?>
PKe�\���
�
?doc/pear/Structures_LinkedList/examples/single_link_example.phpnu�[���<?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
?>
PKe�\����((doc/pear/Net_SMTP/LICENSEnu�[���Copyright 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.
PKe�\TkU�$doc/pear/Net_SMTP/examples/basic.phpnu�[���<?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();
PKe�\�SOܪ%�%doc/pear/Net_SMTP/README.rstnu�[���======================
 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:
PKe�\�u����doc/pear/PEAR/LICENSEnu�[���Copyright (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.
PKe�\�E���doc/pear/PEAR/README.rstnu�[���*************************
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.
PKe�\���xxdoc/pear/PEAR/INSTALLnu�[���PEAR - 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!
PKe�\DG�e��!doc/pear/Structures_Graph/LICENSEnu�[���		   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.
PKe�\x� ���Ndoc/pear/Structures_Graph/docs/tutorials/Structures_Graph/Structures_Graph.pkgnu�[���<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>
PKe�\�r¦J�J)doc/pear/Archive_Tar/docs/Archive_Tar.txtnu�[���Documentation 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. 

PKe�\(��$M$Mfpm/status.htmlnu�[���<!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>
PKe�\B��shhpear/Mail/mock.phpnu�[���<?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;
    }

}
PKe�\E@�%>>pear/Mail/sendmail.phpnu�[���<?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;
    }

}
PKe�\�{��pear/Mail/null.phpnu�[���<?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;
    }

}
PKe�\�+V����pear/Mail/mime.phpnu�[���<?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);
    }
}
PKe�\�؛�J�J�pear/Mail/mimePart.phpnu�[���<?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);
    }
}
PKe�\x�ع���pear/Mail/mimeDecode.phpnu�[���<?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
PKe�\@iE�\\pear/Mail/mail.phpnu�[���<?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;
    }

}
PKe�\wԐE;E;pear/Mail/smtpmx.phpnu�[���<?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);
    }

}
PKe�\B�_Ǭ=�=pear/Mail/smtp.phpnu�[���<?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)]";
    }

}
PKe�\��A~�{�{pear/Mail/RFC822.phpnu�[���<?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;
        }
    }

}
PKe�\L�}�IIpear/.registry/net_smtp.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/pear/Net/SMTP.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:51:"/opt/alt/php80/usr/share/doc/pear/Net_SMTP/examples";b:1;s:42:"/opt/alt/php80/usr/share/doc/pear/Net_SMTP";b:1;s:49:"/opt/alt/php80/usr/share/pear/test/Net_SMTP/tests";b:1;s:43:"/opt/alt/php80/usr/share/pear/test/Net_SMTP";b:1;s:33:"/opt/alt/php80/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:1711026613;}PKe�\�	HR(�(�pear/.registry/file_marc.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/doc/pear/File_MARC/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:7:{s:44:"/opt/alt/php80/usr/share/pear/File/MARC/Lint";b:1;s:39:"/opt/alt/php80/usr/share/pear/File/MARC";b:1;s:34:"/opt/alt/php80/usr/share/pear/File";b:1;s:52:"/opt/alt/php80/usr/share/doc/pear/File_MARC/examples";b:1;s:43:"/opt/alt/php80/usr/share/doc/pear/File_MARC";b:1;s:50:"/opt/alt/php80/usr/share/pear/test/File_MARC/tests";b:1;s:44:"/opt/alt/php80/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:1711026613;}PKe�\aX�,6,6(pear/.registry/structures_linkedlist.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/doc/pear/Structures_LinkedList/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:6:{s:51:"/opt/alt/php80/usr/share/pear/Structures/LinkedList";b:1;s:40:"/opt/alt/php80/usr/share/pear/Structures";b:1;s:64:"/opt/alt/php80/usr/share/doc/pear/Structures_LinkedList/examples";b:1;s:55:"/opt/alt/php80/usr/share/doc/pear/Structures_LinkedList";b:1;s:62:"/opt/alt/php80/usr/share/pear/test/Structures_LinkedList/tests";b:1;s:56:"/opt/alt/php80/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:1711026613;}PKe�\e��D�D�pear/.registry/pear.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/pear/PEAR/XMLParser.php";}s:15:"scripts/pear.sh";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"88b8c6b3ac0115f2d2ffaade03c2b33e";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/php80/usr/bin/pear";}s:18:"scripts/peardev.sh";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"95053b98bc0c2d1bdd99df805543386b";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/php80/usr/bin/peardev";}s:15:"scripts/pecl.sh";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"30de7adf0617716ccc77022c2b77f7c7";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/php80/usr/bin/pecl";}s:19:"scripts/pearcmd.php";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b07704e3a343cc4a3f711f79d1557e4c";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/php80/usr/share/pear/pearcmd.php";}s:19:"scripts/peclcmd.php";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"08430f20d910da6408ffd4e12bdcc59e";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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/pear/data/PEAR/template.spec";}}s:12:"_lastversion";N;s:7:"dirtree";a:23:{s:32:"/opt/alt/php80/usr/share/pear/OS";b:1;s:46:"/opt/alt/php80/usr/share/pear/PEAR/ChannelFile";b:1;s:34:"/opt/alt/php80/usr/share/pear/PEAR";b:1;s:42:"/opt/alt/php80/usr/share/pear/PEAR/Command";b:1;s:45:"/opt/alt/php80/usr/share/pear/PEAR/Downloader";b:1;s:43:"/opt/alt/php80/usr/share/pear/PEAR/Frontend";b:1;s:49:"/opt/alt/php80/usr/share/pear/PEAR/Installer/Role";b:1;s:44:"/opt/alt/php80/usr/share/pear/PEAR/Installer";b:1;s:56:"/opt/alt/php80/usr/share/pear/PEAR/PackageFile/Generator";b:1;s:46:"/opt/alt/php80/usr/share/pear/PEAR/PackageFile";b:1;s:53:"/opt/alt/php80/usr/share/pear/PEAR/PackageFile/Parser";b:1;s:49:"/opt/alt/php80/usr/share/pear/PEAR/PackageFile/v2";b:1;s:39:"/opt/alt/php80/usr/share/pear/PEAR/REST";b:1;s:57:"/opt/alt/php80/usr/share/pear/PEAR/Task/Postinstallscript";b:1;s:39:"/opt/alt/php80/usr/share/pear/PEAR/Task";b:1;s:47:"/opt/alt/php80/usr/share/pear/PEAR/Task/Replace";b:1;s:47:"/opt/alt/php80/usr/share/pear/PEAR/Task/Unixeol";b:1;s:50:"/opt/alt/php80/usr/share/pear/PEAR/Task/Windowseol";b:1;s:44:"/opt/alt/php80/usr/share/pear/PEAR/Validator";b:1;s:22:"/opt/alt/php80/usr/bin";b:1;s:29:"/opt/alt/php80/usr/share/pear";b:1;s:38:"/opt/alt/php80/usr/share/doc/pear/PEAR";b:1;s:39:"/opt/alt/php80/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:1747071770;}PKe�\
C�9pear/.registry/net_idna2.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/pear/Net";b:1;s:39:"/opt/alt/php80/usr/share/pear/Net/IDNA2";b:1;s:49:"/opt/alt/php80/usr/share/pear/Net/IDNA2/Exception";b:1;s:50:"/opt/alt/php80/usr/share/pear/test/Net_IDNA2/tests";b:1;s:44:"/opt/alt/php80/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:1711026613;}PKe�\,�����pear/.registry/net_socket.regnu�[���a: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/php80/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/php80/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/php80/usr/share/doc/pear/Net_Socket/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:2:{s:33:"/opt/alt/php80/usr/share/pear/Net";b:1;s:44:"/opt/alt/php80/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:1711026613;}PKe�\ʑ�|&|&pear/.registry/auth_sasl.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/pear/Auth/SASL.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:2:{s:39:"/opt/alt/php80/usr/share/pear/Auth/SASL";b:1;s:34:"/opt/alt/php80/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:1711026613;}PKe�\���)�)!pear/.registry/console_getopt.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/pear/test/Console_Getopt/tests/bug13140.phpt";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:37:"/opt/alt/php80/usr/share/pear/Console";b:1;s:55:"/opt/alt/php80/usr/share/pear/test/Console_Getopt/tests";b:1;s:49:"/opt/alt/php80/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:1747071770;}PKe�\Y.��.�.�pear/.registry/mail_mime.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/pear/Mail/mimePart.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:50:"/opt/alt/php80/usr/share/pear/test/Mail_Mime/tests";b:1;s:44:"/opt/alt/php80/usr/share/pear/test/Mail_Mime";b:1;s:34:"/opt/alt/php80/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:1711026613;}PKf�\�e�1{1{pear/.registry/xml_rpc.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/pear/XML/RPC/Server.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:4:{s:48:"/opt/alt/php80/usr/share/pear/test/XML_RPC/tests";b:1;s:42:"/opt/alt/php80/usr/share/pear/test/XML_RPC";b:1;s:33:"/opt/alt/php80/usr/share/pear/XML";b:1;s:37:"/opt/alt/php80/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:1747071770;}PKf�\M��dS)S)pear/.registry/mail.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/pear/test/Mail/tests/smtp_error.phpt";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:38:"/opt/alt/php80/usr/share/doc/pear/Mail";b:1;s:34:"/opt/alt/php80/usr/share/pear/Mail";b:1;s:29:"/opt/alt/php80/usr/share/pear";b:1;s:45:"/opt/alt/php80/usr/share/pear/test/Mail/tests";b:1;s:39:"/opt/alt/php80/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:1711026613;}PKf�\O�:+:+"pear/.registry/mail_mimedecode.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/pear/data/Mail_mimeDecode/xmail.xsl";}}s:12:"_lastversion";N;s:7:"dirtree";a:4:{s:34:"/opt/alt/php80/usr/share/pear/Mail";b:1;s:56:"/opt/alt/php80/usr/share/pear/test/Mail_mimeDecode/tests";b:1;s:50:"/opt/alt/php80/usr/share/pear/test/Mail_mimeDecode";b:1;s:50:"/opt/alt/php80/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:1711026613;}PKf�\i�ENENpear/.registry/net_sieve.regnu�[���a: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/php80/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/php80/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/php80/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/php80/usr/share/pear/Net/Sieve.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:50:"/opt/alt/php80/usr/share/pear/test/Net_Sieve/tests";b:1;s:44:"/opt/alt/php80/usr/share/pear/test/Net_Sieve";b:1;s:33:"/opt/alt/php80/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:1711026613;}PKf�\�@��++#pear/.registry/structures_graph.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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:"f762bed8b1ff4bc1a92de673c2ed7897";s:4:"name";s:16:"tests/helper.inc";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php80/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/php80/usr/share/doc/pear/Structures_Graph/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:9:{s:82:"/opt/alt/php80/usr/share/doc/pear/Structures_Graph/docs/tutorials/Structures_Graph";b:1;s:65:"/opt/alt/php80/usr/share/doc/pear/Structures_Graph/docs/tutorials";b:1;s:55:"/opt/alt/php80/usr/share/doc/pear/Structures_Graph/docs";b:1;s:50:"/opt/alt/php80/usr/share/doc/pear/Structures_Graph";b:1;s:58:"/opt/alt/php80/usr/share/pear/Structures/Graph/Manipulator";b:1;s:46:"/opt/alt/php80/usr/share/pear/Structures/Graph";b:1;s:40:"/opt/alt/php80/usr/share/pear/Structures";b:1;s:57:"/opt/alt/php80/usr/share/pear/test/Structures_Graph/tests";b:1;s:51:"/opt/alt/php80/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:1747071770;}PKf�\T��uvuvpear/.registry/xml_util.regnu�[���a: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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/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/php80/usr/share/pear/XML/Util.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:51:"/opt/alt/php80/usr/share/doc/pear/XML_Util/examples";b:1;s:42:"/opt/alt/php80/usr/share/doc/pear/XML_Util";b:1;s:49:"/opt/alt/php80/usr/share/pear/test/XML_Util/tests";b:1;s:43:"/opt/alt/php80/usr/share/pear/test/XML_Util";b:1;s:33:"/opt/alt/php80/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:1747071770;}PKf�\0���W�Wpear/.registry/archive_tar.regnu�[���a: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/php80/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/php80/usr/share/doc/pear/Archive_Tar/docs/Archive_Tar.txt";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:37:"/opt/alt/php80/usr/share/pear/Archive";b:1;s:50:"/opt/alt/php80/usr/share/doc/pear/Archive_Tar/docs";b:1;s:45:"/opt/alt/php80/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:1747071770;}PKf�\���=YYpear/Archive/Tar.phpnu�[���<?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;
    }
}
PKf�\�o�P�Ppear/System.phpnu�[���<?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;
    }
}
PKf�\5F	'�"�"pear/File/MARCXML.phpnu�[���<?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;
    }
    // }}}

}
// }}}

PKf�\Sbw�{7{7pear/File/MARC.phpnu�[���<?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;
    }
    // }}}

}
// }}}

PKf�\Ɍ5��9�9pear/File/MARC/Lint.phpnu�[���<?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
    }
    // }}}
}
// }}}

PKf�\7�*c��pear/File/MARC/Subfield.phpnu�[���<?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;
    }
    // }}}
}
// }}}

PKf�\�9g4xUxUpear/File/MARC/Record.phpnu�[���<?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();
    }
    // }}}

}
// }}}

PKf�\�+����pear/File/MARC/Field.phpnu�[���<?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);
        }
    }
    // }}}
}
// }}}

PKf�\(#�~��pear/File/MARC/Exception.phpnu�[���<?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;
    }
    // }}}
}
// }}}

PKf�\�S��hhpear/File/MARC/List.phpnu�[���<?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;
    }
    // }}}

}
// }}}

PKf�\R��A;A;pear/File/MARC/Data_Field.phpnu�[���<?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);
    }
    // }}}
}
// }}}

PKf�\lz�` pear/File/MARC/Control_Field.phpnu�[���<?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;
    }
    // }}}

}
// }}}

PKf�\�IC�(A(A pear/File/MARC/Lint/CodeData.phpnu�[���<?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
    }
    // }}}
}
// }}}
PKf�\�/f��pear/File/MARCBASE.phpnu�[���<?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();
    }
    // }}}

}
// }}}
PKf�\P'hB�&�&
pear/Mail.phpnu�[���<?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;
    }

}
PKf�\P(~�T
T
pear/Auth/SASL/CramMD5.phpnu�[���<?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);
    }
}
?>PKf�\vR�r,,pear/Auth/SASL/External.phpnu�[���<?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;
    }
}
?>
PKf�\�T�pear/Auth/SASL/Common.phpnu�[���<?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;
     }
}
?>
PKf�\�J�}
}
pear/Auth/SASL/Anonymous.phpnu�[���<?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;
    }
}
?>PKf�\�<� OOpear/Auth/SASL/Login.phpnu�[���<?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);
    }
}
?>PKf�\����==pear/Auth/SASL/Plain.phpnu�[���<?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;
    }
}
?>
PKf�\%ׅtg!g!pear/Auth/SASL/DigestMD5.phpnu�[���<?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);
        }
    }
}
?>
PKf�\ќ��0�0pear/Auth/SASL/SCRAM.phpnu�[���<?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);
        }
    }

}

?>
PKf�\2r����pear/Auth/SASL.phpnu�[���<?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;
    }
}

?>
PKf�\�ny
��pear/.depdbnu�[���a: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.4";}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.3";}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: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: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:"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:8:"net_smtp";}i:1;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:9:"net_sieve";}}s:9:"auth_sasl";a:2:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:8:"net_smtp";}i:1;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:9:"net_sieve";}}}}}PKf�\Z2�iHH pear/.pkgxml/Pear_Mail-1.4.1.xmlnu�[���<?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>
PKg�\�3�--1pear/.pkgxml/Pear_Structures_LinkedList-0.2.2.xmlnu�[���<?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>
PKg�\�/�h����'pear/.pkgxml/Pear_Mail_Mime-1.10.11.xmlnu�[���<?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>
PKg�\z�WzDD%pear/.pkgxml/Pear_Net_IDNA2-0.2.0.xmlnu�[���<?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>
PKg�\��c���%pear/.pkgxml/Pear_Auth_SASL-1.1.0.xmlnu�[���<?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>
PKg�\�7�p�K�Kpear/.pkgxml/XML_Util.xmlnu�[���<?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>
PKg�\����pear/.pkgxml/Pear.listnu�[���pear.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
PKg�\�0$�--%pear/.pkgxml/Pear_File_MARC-1.4.1.xmlnu�[���<?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>
PKg�\ȗ��&pear/.pkgxml/Pear_Net_Socket-1.2.2.xmlnu�[���<?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>
PKg�\�Q���?�?%pear/.pkgxml/Pear_Net_Sieve-1.4.5.xmlnu�[���<?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>
PKg�\#�r�

%pear/.pkgxml/Pear_Net_SMTP-1.10.0.xmlnu�[���<?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>
PKg�\%ONO��+pear/.pkgxml/Pear_Mail_mimeDecode-1.5.6.xmlnu�[���<?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>
PKg�\�T�,�,pear/OS/Guess.phpnu�[���<?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:
 */
PKg�\ioK��pear/XML/RPC/Dump.phpnu�[���<?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:
 */

?>
PKg�\G�J�W�Wpear/XML/RPC/Server.phpnu�[���<?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:
 */

?>
PKg�\c���}�}pear/XML/Util.phpnu�[���<?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);
    }
}
?>
PKg�\�/=�����pear/XML/RPC.phpnu�[���<?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:
 */

?>
PKg�\�'7,����
pear/PEAR.phpnu�[���<?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:
 */
PKg�\����Z�Z�pear/Net/Sieve.phpnu�[���<?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";
            }
        }
    }
}
PKg�\z��|����pear/Net/SMTP.phpnu�[���<?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;
    }
}
PKg�\���NFUFUpear/Net/Socket.phpnu�[���<?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);
        }
    }

}
PKg�\���S66pear/Net/IDNA2/Exception.phpnu�[���<?php
class Net_IDNA2_Exception extends Exception
{
}
PKg�\&��#rr%pear/Net/IDNA2/Exception/Nameprep.phpnu�[���<?php
require_once 'Net/IDNA2/Exception.php';

class Net_IDNA2_Exception_Nameprep extends Net_IDNA2_Exception
{
}
PKg�\��
����pear/Net/IDNA2.phpnu�[���<?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];
    }
    // }}}
}

?>
PKg�\��0AC5C5pear/Console/Getopt.phpnu�[���<?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;
    }

}
PKg�\�8�:�:pear/pearcmd.phpnu�[���<?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/php80/usr/share/pear ' != '@'.'include_path'.'@ ') {
    ini_set('include_path', trim('/opt/alt/php80/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
PKg�\��ƪccpear/peclcmd.phpnu�[���<?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/php80/usr/share/pear ' != '@'.'include_path'.'@ ') {
    ini_set('include_path', trim('/opt/alt/php80/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

?>
PKg�\����p:p:%pear/Structures/LinkedList/Single.phpnu�[���<?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;
    }
    // }}}
}

// }}}

?>
PKg�\�*�z%-%-%pear/Structures/LinkedList/Double.phpnu�[���<?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;
    }
    // }}}

}
// }}}

?>
PKg�\~(�htt7pear/Structures/Graph/Manipulator/TopologicalSorter.phpnu�[���<?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;
    }
}
?>
PKg�\9����1pear/Structures/Graph/Manipulator/AcyclicTest.phpnu�[���<?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);
    }
    /* }}} */
}
/* }}} */
?>
PKg�\�C� + +pear/Structures/Graph/Node.phpnu�[���<?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);
    }
    /* }}} */
}
?>
PKg�\Uyv�pear/Structures/Graph.phpnu�[���<?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;
    }
}
?>
PKg�\Y�\�((pear/.channels/pear.php.net.regnu�[���a: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:1747071770;}PKg�\%�++pear/.channels/pecl.php.net.regnu�[���a: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:1747071770;}PKg�\`>pear/.channels/doc.php.net.regnu�[���a: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:1747071770;}PKg�\ui<�pear/.channels/.alias/pecl.txtnu�[���pecl.php.netPKg�\� ��pear/.channels/.alias/pear.txtnu�[���pear.php.netPKg�\�o/�!pear/.channels/.alias/phpdocs.txtnu�[���doc.php.netPKg�\Xm�pear/.channels/__uri.regnu�[���a: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:1747071770;}PKg�\��_�0�0pear/PEAR/Command.phpnu�[���<?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;
    }
    // }}}
}PKg�\�`�eEAEApear/PEAR/REST.phpnu�[���<?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;
    }
}
PKg�\(Pz���pear/PEAR/Proxy.phpnu�[���<?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;
    }
}
PKg�\�{�	�)�) pear/PEAR/Downloader/Package.phpnu�[���<?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;
    }
}
PKg�\��gk�U�Upear/PEAR/Validate.phpnu�[���<?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;
    }
}PKg�\B] ��!pear/PEAR/Installer/Role/Test.xmlnu�[���<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>PKg�\��K

 pear/PEAR/Installer/Role/Ext.phpnu�[���<?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 {}
?>PKg�\�Ƥ pear/PEAR/Installer/Role/Cfg.phpnu�[���<?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;
    }
}PKg�\�^D{		 pear/PEAR/Installer/Role/Www.phpnu�[���<?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 {}
?>PKg�\���BB pear/PEAR/Installer/Role/Ext.xmlnu�[���<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>PKg�\Y���!pear/PEAR/Installer/Role/Test.phpnu�[���<?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 {}
?>PKg�\�?m

 pear/PEAR/Installer/Role/Php.phpnu�[���<?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 {}
?>PKg�\h&P*�� pear/PEAR/Installer/Role/Doc.xmlnu�[���<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>PKh�\*Y|	%% pear/PEAR/Installer/Role/Man.phpnu�[���<?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 {}
?>
PKh�\	��
!pear/PEAR/Installer/Role/Data.phpnu�[���<?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 {}
?>PKh�\f�sz��!pear/PEAR/Installer/Role/Data.xmlnu�[���<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>PKh�\?���GG#pear/PEAR/Installer/Role/Common.phpnu�[���<?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'];
    }
}
?>
PKh�\��

 pear/PEAR/Installer/Role/Doc.phpnu�[���<?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 {}
?>PKh�\z�q��� pear/PEAR/Installer/Role/Php.xmlnu�[���<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>PKh�\p��"" pear/PEAR/Installer/Role/Src.xmlnu�[���<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>PKh�\��srr pear/PEAR/Installer/Role/Src.phpnu�[���<?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++;
    }
}
?>PKh�\��[�#pear/PEAR/Installer/Role/Script.phpnu�[���<?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 {}
?>PKh�\>1H��� pear/PEAR/Installer/Role/Www.xmlnu�[���<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>PKh�\��/�� pear/PEAR/Installer/Role/Cfg.xmlnu�[���<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>PKh�\�0�c�� pear/PEAR/Installer/Role/Man.xmlnu�[���<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>
PKh�\@v�а�#pear/PEAR/Installer/Role/Script.xmlnu�[���<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>PKh�\V�Z���pear/PEAR/Installer/Role.phpnu�[���<?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;
    }
}PKh�\l(e���pear/PEAR/Downloader.phpnu�[���<?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;
    }
}
PKh�\.�4���pear/PEAR/Frontend.phpnu�[���<?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())
    {
    }
}
PKh�\��	MdMdpear/PEAR/Frontend/CLI.phpnu�[���<?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;
    }
}
PKh�\Z�E�x9x9$pear/PEAR/Task/Postinstallscript.phpnu�[���<?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)
    {
    }
}
PKh�\�3}pear/PEAR/Task/Replace/rw.phpnu�[���<?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;
    }
}
PKh�\&
i.'pear/PEAR/Task/Postinstallscript/rw.phpnu�[���<?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,
            );
    }
}
PKh�\�-!pear/PEAR/Task/Common.phpnu�[���<?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);
    }
}
PKh�\�����pear/PEAR/Task/Unixeol.phpnu�[���<?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);
    }
}
PKh�\\k��pear/PEAR/Task/Unixeol/rw.phpnu�[���<?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 '';
    }
}
?>
PKh�\D$���pear/PEAR/Task/Windowseol.phpnu�[���<?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);
    }
}
PKh�\�JD��pear/PEAR/Task/Replace.phpnu�[���<?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;
    }
}
PKh�\&%75)) pear/PEAR/Task/Windowseol/rw.phpnu�[���<?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 '';
    }
}
?>
PKh�\��ym6m6pear/PEAR/Exception.phpnu�[���<?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();
    }
}PKh�\�b����pear/PEAR/ErrorStack.phpnu�[���<?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'));
?>
PKh�\p�����pear/PEAR/Dependency2.phpnu�[���<?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)));
    }
}
PKh�\r"����pear/PEAR/ChannelFile.phpnu�[���<?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();
    }
}
PKi�\�@P�� pear/PEAR/ChannelFile/Parser.phpnu�[���<?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;
    }
}PKi�\Z�bgbgpear/PEAR/Common.phpnu�[���<?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';
PKi�\��'����pear/PEAR/RunTest.phpnu�[���<?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);
        }
    }
}
PKi�\��U  pear/PEAR/Packager.phpnu�[���<?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;
    }
}PKi�\[
�W��pear/PEAR/XMLParser.phpnu�[���<?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;
    }
}PKi�\c��__pear/PEAR/DependencyDB.phpnu�[���<?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
            );
        }
    }
}
PKi�\���=_�_�pear/PEAR/PackageFile/v2/rw.phpnu�[���<?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']);
    }
}PKi�\C�8�L�L&pear/PEAR/PackageFile/v2/Validator.phpnu�[���<?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;
    }
}
PKi�\�5������pear/PEAR/PackageFile/v1.phpnu�[���<?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);
        }
    }

    // }}}
}
?>
PKi�\�_=�@�@#pear/PEAR/PackageFile/Parser/v1.phpnu�[���<?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;
        }
    }

    // }}}
}
?>PKi�\��OWHH#pear/PEAR/PackageFile/Parser/v2.phpnu�[���<?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;
    }
}PKi�\`�=����&pear/PEAR/PackageFile/Generator/v1.phpnu�[���<?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;
    }
}
?>
PKi�\�ɁɁ&pear/PEAR/PackageFile/Generator/v2.phpnu�[���<?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;
    }
}
PKi�\��wv@@pear/PEAR/PackageFile/v2.phpnu�[���<?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;
    }
}
?>
PKi�\،�w��pear/PEAR/Installer.phpnu�[���<?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');
        }
    }

    // }}}
}
PKi�\�ٲ�=�=pear/PEAR/PackageFile.phpnu�[���<?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;
    }
}
PKi�\$���(�(pear/PEAR/Registry.phpnu�[���<?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;
    }
}
PKi�\Z h66pear/PEAR/Command/Package.xmlnu�[���<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>PKi�\�%Fiipear/PEAR/Command/Test.xmlnu�[���<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>PKi�\,��t"u"upear/PEAR/Command/Remote.phpnu�[���<?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;
    }
}
PKi�\݄<iipear/PEAR/Command/Mirror.xmlnu�[���<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>PKi�\�%q����pear/PEAR/Command/Channels.phpnu�[���<?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;
    }
}
PKi�\
�\���pear/PEAR/Command/Remote.xmlnu�[���<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>PKi�\���u��pear/PEAR/Command/Registry.xmlnu�[���<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>PKi�\nmi?;�;�pear/PEAR/Command/Install.phpnu�[���<?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;
    }
}
PKi�\,_�h/h/pear/PEAR/Command/Test.phpnu�[���<?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');
    }
}
PKi�\d֣S��pear/PEAR/Command/Pickle.xmlnu�[���<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>PKi�\+9ҜҜpear/PEAR/Command/Package.phpnu�[���<?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;
    }
}
PKi�\�X�

pear/PEAR/Command/Auth.phpnu�[���<?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);
    }
}
PKi�\�%sp  pear/PEAR/Command/Common.phpnu�[���<?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);
    }
}
PKj�\��#S
S
pear/PEAR/Command/Build.phpnu�[���<?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');
        }
    }
}
PKj�\�P>>pear/PEAR/Command/Pickle.phpnu�[���<?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('.');
    }
}
PKj�\���s6
6
pear/PEAR/Command/Config.xmlnu�[���<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>PKj�\
u���pear/PEAR/Command/Build.xmlnu�[���<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>PKj�\�w��zzpear/PEAR/Command/Channels.xmlnu�[���<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>PKj�\0(;rʹʹpear/PEAR/Command/Registry.phpnu�[���<?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');
    }
}
PKj�\�z��k<k<pear/PEAR/Command/Config.phpnu�[���<?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;
    }
}
PKj�\j���!�!pear/PEAR/Command/Install.xmlnu�[���<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>PKj�\�4�{��pear/PEAR/Command/Auth.xmlnu�[���<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>PKj�\�����pear/PEAR/Command/Mirror.phpnu�[���<?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;
    }
}
PKj�\����pear/PEAR/Config.phpnu�[���<?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;
            }
        }
    }
}
PKj�\��Y�;;pear/PEAR/REST/13.phpnu�[���<?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;
    }
}PKj�\,#y��+�+pear/PEAR/REST/11.phpnu�[���<?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);
    }
}
?>
PKj�\�W�f��pear/PEAR/REST/10.phpnu�[���<?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;
        }
    }
}
PKj�\��T�I�Ipear/PEAR/Builder.phpnu�[���<?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);
    }
}
PKj�\j�y99pear/PEAR/Validator/PECL.phpnu�[���<?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;
    }
}
?>PKj�\�Z��aa
pear/.filemapnu�[���a: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";}}PKj�\������pear/data/PEAR/template.specnu�[���Summary: 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@
    /
PKj�\ũ�

pear/data/PEAR/package.dtdnu�[���<!--
     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>


PKj�\6E�WW#pear/data/Mail_mimeDecode/xmail.xslnu�[���<?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>PKj�\�
$v66#pear/data/Mail_mimeDecode/xmail.dtdnu�[���<?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)>

PKj�\
pear/.locknu�[���PKj�\�� pear/test/Mail/tests/9137_2.phptnu�[���--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
PKj�\�x`(��"pear/test/Mail/tests/bug17317.phptnu�[���--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
PKj�\*����pear/test/Mail/tests/9137.phptnu�[���--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
PKj�\)f$�!! pear/test/Mail/tests/rfc822.phptnu�[���--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>
PKj�\8x����"pear/test/Mail/tests/bug17178.phptnu�[���--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) {
} 
PKj�\��q/��pear/test/Mail/tests/13659.phptnu�[���--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
PKj�\w�����$pear/test/Mail/tests/smtp_error.phptnu�[���--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--
OKPKj�\(Y����'pear/test/File_MARC/tests/xmlescape.mrcnu�[���00727nam  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
PKj�\�s}���8pear/test/File_MARC/tests/marc_xml_namespace_prefix.phptnu�[���--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
PKk�\�2�.ii'pear/test/File_MARC/tests/marc_018.phptnu�[���--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"]]}
PKk�\f��~-pear/test/File_MARC/tests/marc_field_001.phptnu�[���--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
PKk�\��`��'pear/test/File_MARC/tests/marc_012.phptnu�[���--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!
PKk�\�_X���-pear/test/File_MARC/tests/marc_field_004.phptnu�[���--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
PKk�\�p̎u1u1'pear/test/File_MARC/tests/marc_016.phptnu�[���--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>
PKk�\.%�``'pear/test/File_MARC/tests/marc_010.phptnu�[���--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
PKk�\���
��-pear/test/File_MARC/tests/marc_field_005.phptnu�[���--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
PKk�\\.i�vv&pear/test/File_MARC/tests/sandburg.mrcnu�[���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.PKk�\�>���+pear/test/File_MARC/tests/marc_xml_003.phptnu�[���--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.
PKk�\�����'pear/test/File_MARC/tests/marc_008.phptnu�[���--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"
PKk�\y���
�
,pear/test/File_MARC/tests/marc_lint_003.phptnu�[���--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.
PKk�\	V�U,,/pear/test/File_MARC/tests/marc_field_21246.phptnu�[���--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
PKk�\�S3'pear/test/File_MARC/tests/marc_021.phptnu�[���--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"}]}}]}
PKk�\�&��cc'pear/test/File_MARC/tests/marc_002.phptnu�[���--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
PKk�\#c����'pear/test/File_MARC/tests/onerecord.xmlnu�[���<?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>
PKk�\�����1pear/test/File_MARC/tests/marc_xml_namespace.phptnu�[���--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
PKk�\�c����-pear/test/File_MARC/tests/marc_xml_16642.phptnu�[���--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.
PKk�\7�'pear/test/File_MARC/tests/marc_009.phptnu�[���--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"
PKk�\�����+pear/test/File_MARC/tests/marc_xml_005.phptnu�[���--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.
PKk�\2���$pear/test/File_MARC/tests/skipif.incnu�[���<?php

// Stash the current error_reporting value
$error_reporting = error_reporting();

// Restore the error reporting to previous value
error_reporting($error_reporting);

?>
PKk�\}۶\pp)pear/test/File_MARC/tests/bad_example.xmlnu�[���<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>
PKl�\<��--0pear/test/File_MARC/tests/marc_subfield_002.phptnu�[���--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...
PKl�\�kP�'pear/test/File_MARC/tests/marc_023.phptnu�[���--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
PKl�\)�]�
�
'pear/test/File_MARC/tests/marc_005.phptnu�[���--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
PKl�\��%Hhh'pear/test/File_MARC/tests/marc_003.phptnu�[���--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
PKl�\�0�S��0pear/test/File_MARC/tests/marc_subfield_001.phptnu�[���--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
PKl�\F;�Re%e%'pear/test/File_MARC/tests/marc_004.phptnu�[���--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
PKl�\x;��##'pear/test/File_MARC/tests/marc_006.phptnu�[���--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
PKl�\B�1��
�
,pear/test/File_MARC/tests/marc_lint_005.phptnu�[���--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).
PKl�\O~iK!K!'pear/test/File_MARC/tests/marc_013.phptnu�[���--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
PKl�\�=O	
	
&pear/test/File_MARC/tests/sandburg.xmlnu�[���<?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>
PKl�\���YY+pear/test/File_MARC/tests/marc_xml_009.phptnu�[���--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
PKl�\��	\��,pear/test/File_MARC/tests/marc_lint_001.phptnu�[���--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"
PKl�\�泮�#pear/test/File_MARC/tests/music.mrcnu�[���01145ncm  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
PKl�\����1�1+pear/test/File_MARC/tests/marc_xml_008.phptnu�[���--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>
PKl�\�jS�'pear/test/File_MARC/tests/marc_015.phptnu�[���--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
PKl�\ye@��+pear/test/File_MARC/tests/marc_xml_007.phptnu�[���--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!
PKl�\e����
�
'pear/test/File_MARC/tests/marc_011.phptnu�[���--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
PKl�\�#"�
)
)'pear/test/File_MARC/tests/marc_022.phptnu�[���--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
PKl�\��ԛ�
�
'pear/test/File_MARC/tests/marc_014.phptnu�[���--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
PKl�\Ҕ��	�	)pear/test/File_MARC/tests/marc_16783.phptnu�[���--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
PKl�\8��11.pear/test/File_MARC/tests/marc_record_001.phptnu�[���--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
PKl�\�è{{'pear/test/File_MARC/tests/marc_020.phptnu�[���--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`
`
PKl�\�_|6	6	,pear/test/File_MARC/tests/marc_lint_002.phptnu�[���--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.
PKl�\a!���'pear/test/File_MARC/tests/namespace.xmlnu�[���<?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>PKm�\rP��+pear/test/File_MARC/tests/marc_xml_004.phptnu�[���--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>
PKm�\�f==)pear/test/File_MARC/tests/bad_example.mrcnu�[���01853    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.0PKm�\F�-//-pear/test/File_MARC/tests/marc_field_002.phptnu�[���--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
PKm�\W��))'pear/test/File_MARC/tests/marc_019.phptnu�[���--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>
PKm�\~N0�::%pear/test/File_MARC/tests/example.mrcnu�[���01850     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.0PKm�\�p�޸�'pear/test/File_MARC/tests/marc_007.phptnu�[���--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
PKm�\�cܯ�+pear/test/File_MARC/tests/marc_xml_006.phptnu�[���--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.
PKm�\!Ņ\��+pear/test/File_MARC/tests/marc_xml_001.phptnu�[���--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>
PKm�\�{�	�	/pear/test/File_MARC/tests/marc_xml_rsinger.phptnu�[���--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
PKm�\�5;�-�-#pear/test/File_MARC/tests/music.xmlnu�[���<?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>
PKm�\E4kL�	�	'pear/test/File_MARC/tests/marc_001.phptnu�[���--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
PKm�\}&�
GG,pear/test/File_MARC/tests/marc_lint_004.phptnu�[���--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).
PKm�\44�-��-pear/test/File_MARC/tests/marc_field_003.phptnu�[���--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
PKm�\N���&&+pear/test/File_MARC/tests/marc_xml_002.phptnu�[���--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>
PKm�\9�DD'pear/test/File_MARC/tests/marc_017.phptnu�[���--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"}]}
PKm�\+W��
�
(pear/test/File_MARC/tests/bigarchive.xmlnu�[���<?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>
PKm�\(���NN#pear/test/File_MARC/tests/camel.mrcnu�[���00755cam  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.PKm�\)#��pp-pear/test/Mail_Mime/tests/test_Bug_18772.phptnu�[���--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
--*--
PKm�\M�-\��-pear/test/Mail_Mime/tests/test_Bug_17175.phptnu�[���--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?=
PKm�\%��BB,pear/test/Mail_Mime/tests/test_Bug_GH16.phptnu�[���--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
PKm�\ܶg�hh.pear/test/Mail_Mime/tests/test_Bug_9722_1.phptnu�[���--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 :(
PKm�\�zŬ�-pear/test/Mail_Mime/tests/test_Bug_11731.phptnu�[���--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
PKm�\�a�[��-pear/test/Mail_Mime/tests/class-filename.phptnu�[���--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
PKm�\�-7c77.pear/test/Mail_Mime/tests/test_Bug_3513_2.phptnu�[���--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;
PKm�\�E�oo-pear/test/Mail_Mime/tests/test_Bug_13962.phptnu�[���--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
PKm�\g��+��-pear/test/Mail_Mime/tests/test_Bug_13444.phptnu�[���--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
PKm�\Ya�k!!=pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part1.phptnu�[���--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
PKm�\ّB�
�
/pear/test/Mail_Mime/tests/qp_encoding_test.phptnu�[���--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: 
---
PKm�\������-pear/test/Mail_Mime/tests/test_Bug_15320.phptnu�[���--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;

PKm�\�X�##-pear/test/Mail_Mime/tests/test_Bug_19497.phptnu�[���--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";
PKm�\���v��.pear/test/Mail_Mime/tests/test_Bug_8541_1.phptnu�[���--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
PKm�\i;���.pear/test/Mail_Mime/tests/test_Bug_7561_1.phptnu�[���--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
PKm�\Y�����,pear/test/Mail_Mime/tests/test_Bug_GH26.phptnu�[���--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.comPKm�\Ui�E!E!7pear/test/Mail_Mime/tests/headers_without_mbstring.phptnu�[���--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>
PKm�\�8��.pear/test/Mail_Mime/tests/test_Bug_3513_1.phptnu�[���--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;
PKn�\2!�B��1pear/test/Mail_Mime/tests/test_linebreak_dot.phptnu�[���--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
---
PKn�\e;�I-pear/test/Mail_Mime/tests/test_Bug_21205.phptnu�[���--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>
PKn�\�(V,��-pear/test/Mail_Mime/tests/test_Bug_12411.phptnu�[���--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==?=";
PKn�\��RoUU-pear/test/Mail_Mime/tests/test_Bug_20226.phptnu�[���--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=?=
PKn�\�YcLYY-pear/test/Mail_Mime/tests/test_Bug_16539.phptnu�[���--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
PKn�\@�/�NN-pear/test/Mail_Mime/tests/test_Bug_21206.phptnu�[���--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>
PKn�\`�~@/pear/test/Mail_Mime/tests/test_Bug_12385_1.phptnu�[���--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
PKn�\��᠗"�"4pear/test/Mail_Mime/tests/headers_with_mbstring.phptnu�[���--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?=
PKn�\�'�''.pear/test/Mail_Mime/tests/test_Bug_8386_1.phptnu�[���--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
PKn�\���|JJ=pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part2.phptnu�[���--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
PKn�\ZX�Hww.pear/test/Mail_Mime/tests/test_Bug_3513_3.phptnu�[���--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;

PKn�\9��::/pear/test/Mail_Mime/tests/test_Bug_10816_1.phptnu�[���--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

PKn�\�M�U..-pear/test/Mail_Mime/tests/test_Bug_20273.phptnu�[���--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>
PKn�\��((/pear/test/Mail_Mime/tests/test_Bug_10596_1.phptnu�[���--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
PKn�\5����-pear/test/Mail_Mime/tests/test_Bug_21098.phptnu�[���--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
PKn�\29r���,pear/test/Mail_Mime/tests/encoding_case.phptnu�[���--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
PKn�\��qS��/pear/test/Mail_Mime/tests/test_Bug_10999_1.phptnu�[���--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
PKn�\e�@Q__-pear/test/Mail_Mime/tests/test_Bug_14780.phptnu�[���--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
PKn�\��-pear/test/Mail_Mime/tests/test_Bug_21027.phptnu�[���--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
PKn�\��1d��-pear/test/Mail_Mime/tests/test_Bug_17025.phptnu�[���--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
PKn�\%+2PP-pear/test/Mail_Mime/tests/test_Bug_18083.phptnu�[���--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==?=";
PKn�\Cz2�}}-pear/test/Mail_Mime/tests/test_Bug_12165.phptnu�[���--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
PKn�\X��b��-pear/test/Mail_Mime/tests/test_Bug_14779.phptnu�[���--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
PKn�\�I�zz-pear/test/Mail_Mime/tests/test_Bug_20563.phptnu�[���--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
PKo�\B&���-pear/test/Mail_Mime/tests/test_Bug_12466.phptnu�[���--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
PKo�\Ԣ��``-pear/test/Mail_Mime/tests/test_Bug_21255.phptnu�[���--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
PKo�\;�{��,pear/test/Mail_Mime/tests/test_Bug_GH19.phptnu�[���--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
PKo�\�-b2-pear/test/Mail_Mime/tests/test_Bug_13032.phptnu�[���--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
PKo�\[��b��8pear/test/Mail_Mime/tests/content_transfer_encoding.phptnu�[���--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"
PKo�\Qi�"---pear/test/Mail_Mime/tests/test_Bug_11381.phptnu�[���--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
PKo�\���o		-pear/test/Mail_Mime/tests/test_Bug_14529.phptnu�[���--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;
PKo�\�k�0-pear/test/Mail_Mime/tests/test_Bug_20564.phptnu�[���--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--
0PKo�\�
Ǟ		7pear/test/Mail_Mime/tests/test_linebreak_larger_76.phptnu�[���--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
---
PKo�\�Gs���)pear/test/XML_Util/tests/Bug5392Tests.phpnu�[���<?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.");
    }
}
PKo�\��GG4pear/test/XML_Util/tests/SplitQualifiedNameTests.phpnu�[���<?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));
    }
}
PKo�\�rv��,pear/test/XML_Util/tests/RaiseErrorTests.phpnu�[���<?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());
    }
}
PKo�\z��t��1pear/test/XML_Util/tests/ReverseEntitiesTests.phpnu�[���<?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));
    }
}
PKo�\���TT/pear/test/XML_Util/tests/CreateCommentTests.phpnu�[���<?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));
    }
}
PKo�\ݑh���-pear/test/XML_Util/tests/IsValidNameTests.phpnu�[���<?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());
    }
}
PKo�\~�$[ee2pear/test/XML_Util/tests/CreateEndElementTests.phpnu�[���<?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));
    }
}
PKo�\e�>��4�44pear/test/XML_Util/tests/CreateTagFromArrayTests.phpnu�[���<?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));
    }
}
PKo�\�C���1pear/test/XML_Util/tests/ReplaceEntitiesTests.phpnu�[���<?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));
    }
}
PKo�\ܬ$���7pear/test/XML_Util/tests/GetDocTypeDeclarationTests.phpnu�[���<?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));
    }
}
PKo�\Z�t�4pear/test/XML_Util/tests/AttributesToStringTests.phpnu�[���<?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));
    }
}
PKo�\�m4�**+pear/test/XML_Util/tests/CreateTagTests.phpnu�[���<?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));
    }
}
PKo�\Yq���*pear/test/XML_Util/tests/Bug21184Tests.phpnu�[���<?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));
    }
}
PKo�\�YR�""4pear/test/XML_Util/tests/CreateStartElementTests.phpnu�[���<?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));
    }
}
PKo�\|�\53pear/test/XML_Util/tests/CollapseEmptyTagsTests.phpnu�[���<?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));
    }
}
PKo�\یu���,pear/test/XML_Util/tests/ApiVersionTests.phpnu�[���<?php

class ApiVersionTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::apiVersion()
     */
    public function testApiVersion()
    {
        $this->assertEquals('1.4', XML_Util::apiVersion());
    }
}PKo�\��۩��*pear/test/XML_Util/tests/Bug18343Tests.phpnu�[���<?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.");
    }
}
PKo�\���!��.pear/test/XML_Util/tests/AbstractUnitTests.phpnu�[���<?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();
    }
}
PKo�\��G*pear/test/XML_Util/tests/Bug21177Tests.phpnu�[���<?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.");
    }
}
PKo�\>�M���)pear/test/XML_Util/tests/Bug4950Tests.phpnu�[���<?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.");
    }
}
PKo�\Df:��3pear/test/XML_Util/tests/GetXmlDeclarationTests.phpnu�[���<?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));
    }
}
PKo�\4e��jj4pear/test/XML_Util/tests/CreateCDataSectionTests.phpnu�[���<?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));
    }
}
PKp�\�3l�**%pear/test/XML_RPC/tests/protoport.phpnu�[���<?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";
PKp�\b��)))*pear/test/XML_RPC/tests/actual-request.phpnu�[���<?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);
PKp�\�B�"pear/test/XML_RPC/tests/allgot.incnu�[���<?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";
}
PKp�\J����"pear/test/XML_RPC/tests/encode.phpnu�[���<?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;
}
PKp�\$]���'pear/test/XML_RPC/tests/empty-value.phpnu�[���<?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';
PKp�\|�E.pear/test/XML_RPC/tests/empty-value-struct.phpnu�[���<?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';
PKp�\.��
��'pear/test/XML_RPC/tests/extra-lines.phpnu�[���<?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";
}
PKp�\��̢�	�	!pear/test/XML_RPC/tests/types.phpnu�[���<?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';
PKp�\���XX%pear/test/XML_RPC/tests/test_Dump.phpnu�[���<?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";
PKp�\����4pear/test/Structures_LinkedList/tests/LinkTester.phpnu�[���<?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);

?>
PKp�\骗���3pear/test/Structures_LinkedList/tests/link_006.phptnu�[���--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
PKp�\� ���3pear/test/Structures_LinkedList/tests/link_001.phptnu�[���--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
PKp�\)�y--:pear/test/Structures_LinkedList/tests/single_link_004.phptnu�[���--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
PKp�\(��  3pear/test/Structures_LinkedList/tests/link_004.phptnu�[���--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
PKp�\�4����:pear/test/Structures_LinkedList/tests/single_link_001.phptnu�[���--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
PKp�\��)��3pear/test/Structures_LinkedList/tests/link_002.phptnu�[���--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
PKp�\���|��:pear/test/Structures_LinkedList/tests/SingleLinkTester.phpnu�[���<?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);

?>
PKp�\�#,E��:pear/test/Structures_LinkedList/tests/single_link_005.phptnu�[���--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
PKp�\�Z�x��:pear/test/Structures_LinkedList/tests/single_link_002.phptnu�[���--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
PKp�\s��DHH3pear/test/Structures_LinkedList/tests/link_007.phptnu�[���--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
PKp�\髂[��:pear/test/Structures_LinkedList/tests/single_link_006.phptnu�[���--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
PKp�\�1����:pear/test/Structures_LinkedList/tests/single_link_007.phptnu�[���--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
PKp�\�K��:pear/test/Structures_LinkedList/tests/single_link_003.phptnu�[���--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
PKp�\�����3pear/test/Structures_LinkedList/tests/link_005.phptnu�[���--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
PKp�\�o���3pear/test/Structures_LinkedList/tests/link_003.phptnu�[���--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
PKp�\?7��EE>pear/test/Net_IDNA2/tests/draft-josefsson-idn-test-vectors.phpnu�[���<?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);
    }

}

PKp�\E��mm+pear/test/Net_IDNA2/tests/Net_IDNA2Test.phpnu�[���<?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);
    }
}
PKp�\�߁Q��'pear/test/Net_SMTP/tests/quotedata.phptnu�[���--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
PKp�\<ȸB!!"pear/test/Net_SMTP/tests/auth.phptnu�[���--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!
PKp�\�6����(pear/test/Net_SMTP/tests/config.php.distnu�[���<?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');
PKp�\�*�W��#pear/test/Net_SMTP/tests/basic.phptnu�[���--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!
PKp�\���,pear/test/Console_Getopt/tests/bug10557.phptnu�[���--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
FATALPKp�\��,pear/test/Console_Getopt/tests/bug11068.phptnu�[���--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] => -
        )

)PKp�\����.pear/test/Console_Getopt/tests/001-getopt.phptnu�[���--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
PKp�\��|EE,pear/test/Console_Getopt/tests/bug13140.phptnu�[���--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
        )

)
PKp�\����)pear/test/Net_Sieve/tests/largescript.sivnu�[���require ["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";
}
PKp�\�g��-�-'pear/test/Net_Sieve/tests/SieveTest.phpnu�[���<?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();
    }
}
PKp�\�Y�npp)pear/test/Net_Sieve/tests/config.php.distnu�[���<?php
define('HOST', 'localhost');
define('PORT', 4190);
define('USERNAME', 'user');
define('PASSWORD', 'pass');PKp�\6��:UU:pear/test/Structures_Graph/tests/TopologicalSorterTest.phpnu�[���<?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());
    }
}
?>
PKq�\�V���-pear/test/Structures_Graph/tests/AllTests.phpnu�[���<?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;
    }
}
PKq�\��W8j#j#3pear/test/Structures_Graph/tests/BasicGraphTest.phpnu�[���<?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');
    }
}
?>
PKq�\|㲌ii+pear/test/Structures_Graph/tests/helper.incnu�[���<?php
if ('/opt/alt/php80/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';
PKq�\���4pear/test/Structures_Graph/tests/AcyclicTestTest.phpnu�[���<?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'
        );
    }
}
?>
PKq�\ҵ3��Cpear/test/Mail_mimeDecode/tests/semicolon_content_type_bug1724.phptnu�[���--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
PKq�\s��%��7pear/test/Mail_mimeDecode/tests/parse_header_value.phptnu�[���--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
)
PKq�\pear/.depdblocknu�[���PKq�\[��++)xcache_3/diagnosis/lang/zh-traditional.ponu�[���msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-08 14:41+0800\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: diagnosis.tpl.php:4
msgid "Diagnosis Result"
msgstr ""

#: diagnosis.tpl.php:8
msgid "Item"
msgstr ""

#: diagnosis.tpl.php:11
msgid "Level"
msgstr ""

#: diagnosis.tpl.php:14
msgid "Result"
msgstr ""

#: diagnosis.tpl.php:17
msgid "Explanation/Suggestion"
msgstr ""

#: index.php:77
msgid "XCache extension"
msgstr ""

#: index.php:81
#, php-format
msgid "Add extension=xcache.so (or xcache.dll) in %s"
msgstr ""

#: index.php:84
#, php-format
msgid ""
"Please put a php.ini in %s and add extension=xcache.so (or xcache.dll) in it"
msgstr ""

#: index.php:87
msgid "Cannot detect php.ini location"
msgstr ""

#: index.php:89
msgid "(See above)"
msgstr ""

#: index.php:90
msgid "Not loaded"
msgstr ""

#: index.php:90 index.php:129 index.php:135 index.php:290 index.php:308
#: index.php:373 index.php:405 index.php:408
msgid "error"
msgstr ""

#: index.php:93
msgid "Loaded"
msgstr ""

#: index.php:93 index.php:141 index.php:158 index.php:175 index.php:189
#: index.php:200 index.php:216 index.php:252 index.php:269 index.php:278
#: index.php:296 index.php:314 index.php:337 index.php:352 index.php:378
#: index.php:385 index.php:392 index.php:399 index.php:413
msgid "info"
msgstr ""

#: index.php:124
msgid "Enabling PHP Cacher"
msgstr ""

#: index.php:126 index.php:146 index.php:149 index.php:163 index.php:166
#: index.php:180 index.php:207 index.php:221 index.php:258 index.php:275
#: index.php:305 index.php:323 index.php:343
msgid "skipped"
msgstr ""

#: index.php:130 index.php:184 index.php:279
msgid "Not enabled"
msgstr ""

#: index.php:131
msgid ""
"Your PHP pages is not accelerated by XCache. Set xcache.size to non-zero, "
"set xcache.cacher = On"
msgstr ""

#: index.php:136
msgid "No php script cached"
msgstr ""

#: index.php:137
msgid "Your PHP pages is not accelerated by XCache. Set xcache.cacher = On"
msgstr ""

#: index.php:141 index.php:189 index.php:297 index.php:315 index.php:347
msgid "Enabled"
msgstr ""

#: index.php:144
msgid "PHP Compile Time Error"
msgstr ""

#: index.php:152 index.php:169 index.php:183 index.php:193 index.php:210
#: index.php:238 index.php:246 index.php:261 index.php:329 index.php:346
msgid "warning"
msgstr ""

#: index.php:153
msgid "Error happened when compiling one or some of your PHP code"
msgstr ""

#: index.php:154
msgid ""
"PHP code failed to be compiled cannot be cached. This usually means there "
"was syntax error in your PHP code. Enable PHP error_log to see what parser "
"error is it, fix your code. This warning won't go away until PHP is restarted"
msgstr ""

#: index.php:158
msgid "No error happened"
msgstr ""

#: index.php:161
msgid "Busy Compiling"
msgstr ""

#: index.php:170
msgid "Cache marked as busy for compiling"
msgstr ""

#: index.php:171
msgid ""
"It's ok if this status don't stay for long. Otherwise, it could be a sign of "
"PHP crash/coredump, report to XCache devs"
msgstr ""

#: index.php:175 index.php:269 index.php:337
msgid "Idle"
msgstr ""

#: index.php:178
msgid "Enabling VAR Cacher"
msgstr ""

#: index.php:185
msgid ""
"PHP code that use XCache caching backend have to use other caching backend "
"instead. Set xcache.var_size to non-zero if you have any PHP code that can "
"use XCache Data Caching API"
msgstr ""

#: index.php:191
msgid "Using VAR Cacher"
msgstr ""

#: index.php:194
msgid "No variable data cached"
msgstr ""

#: index.php:195
msgid ""
"Var Cacher won't work simply by enabling it. PHP code must call XCache APIs "
"like xcache_set() to use it as cache backend. 3rd party web apps may come "
"with XCache support, config it to use XCache as caching backend"
msgstr ""

#: index.php:200
msgid "Cache in use"
msgstr ""

#: index.php:205
msgid "Cache Size"
msgstr ""

#: index.php:211
msgid "Out of memory happened when trying to write to cache"
msgstr ""

#: index.php:212
msgid "Increase xcache.size and/or xcache.var_size"
msgstr ""

#: index.php:216
msgid "Enough"
msgstr ""

#: index.php:219
msgid "Hash Slots"
msgstr ""

#: index.php:239
msgid "Slots value too big"
msgstr ""

#: index.php:240
#, php-format
msgid ""
"A very small value is set to %s value and leave %s value is too big.\n"
"Decrease %s if small cache is really what you want"
msgstr ""

#: index.php:247
msgid "Slots value too small"
msgstr ""

#: index.php:248
#, php-format
msgid "So many item are cached. Increase %s to a more proper value"
msgstr ""

#: index.php:252 index.php:378 index.php:399 index.php:413
msgid "Looks good"
msgstr ""

#: index.php:256
msgid "Cache Status"
msgstr ""

#: index.php:262
msgid "At least one of the caches is disabled. "
msgstr ""

#: index.php:263
msgid "Enable the cache."
msgstr ""

#: index.php:264
msgid ""
"It was disabled by PHP crash/coredump handler or you disabled it manually."
msgstr ""

#: index.php:264
msgid "You disabled it manually."
msgstr ""

#: index.php:265
msgid "If it was caused by PHP crash/coredump, report to XCache devs"
msgstr ""

#: index.php:273
msgid "Coredump Directory"
msgstr ""

#: index.php:280
msgid ""
"Enable coredump to save debugging information in case when PHP crash. It can "
"also be enabled in other module like php-fpm beside XCache"
msgstr ""

#: index.php:291
msgid "Core files found:\n"
msgstr ""

#: index.php:292
msgid ""
"Disable XCache PHP Cacher (set xcache.size=0), remove the core file(s), then "
"restart PHP. If core file appears again, report call stack backtrace in the "
"core to XCache devs"
msgstr ""

#: index.php:298
#, php-format
msgid "You can see core files if PHP crash in %s if PHP crash"
msgstr ""

#: index.php:303
msgid "Readonly Protection"
msgstr ""

#: index.php:309
msgid "Set to enabled but not available"
msgstr ""

#: index.php:310
msgid "Use xcache.mmap_path other than /dev/zero"
msgstr ""

#: index.php:315 index.php:352
msgid "Disabled"
msgstr ""

#: index.php:316
msgid ""
"Enable readonly_protection == --performance & ++stability. Disable "
"readonly_protection == ++performance & --stability"
msgstr ""

#: index.php:321
msgid "XCache modules"
msgstr ""

#: index.php:331
msgid ""
"Acceptable. Module(s) listed are built into XCache but not for production "
"server.\n"
"Leave it as is if you're feeling good.\n"
"Re-configure XCache with the module(s) disabled if you're strict with server "
"security."
msgstr ""

#: index.php:341
msgid "XCache test setting"
msgstr ""

#: index.php:348
msgid "xcache.test is for testing only, not for server. set it to off"
msgstr ""

#: index.php:355
msgid "PHP Version"
msgstr ""

#: index.php:374
msgid "The version of PHP you're using is known to be unstable: "
msgstr ""

#: index.php:375
msgid "Upgrade to new version of PHP"
msgstr ""

#: index.php:381
msgid "Extension Compatibility"
msgstr ""

#: index.php:386
msgid "Zend Optimizer loaded"
msgstr ""

#: index.php:387
msgid ""
"Optimizer feature of 'Zend Optimizer' is disabled by XCache due to "
"compatibility reason; the Loader of it is still available, encoded files are "
"still supported"
msgstr ""

#: index.php:393
msgid "the ionCube PHP Loader loaded"
msgstr ""

#: index.php:394
msgid ""
"Compatibility with this the ionCube PHp Loader' is taken care of; But in "
"case if there's any problem, report to ionCube team and/or XCache devs"
msgstr ""

#: index.php:402
msgid "SAPI Compatibility"
msgstr ""

#: index.php:405
msgid "CGI is not supported"
msgstr ""

#: index.php:405
msgid "Use FastCGI or FPM instead"
msgstr ""

#: index.php:410
msgid ""
"PHP_FCGI_CHILDREN should be >= 1 and use 1 group of parent/childs model. See "
"http://xcache.lighttpd.net/wiki/Faq"
msgstr ""
PKq�\��_i@@*xcache_3/diagnosis/lang/zh-traditional.phpnu�[���<?php
// auto generated, do not modify
$strings += array(
		);

PKq�\�W\���)xcache_3/diagnosis/lang/zh-simplified.phpnu�[���<?php
// auto generated, do not modify
$strings += array(
		"Diagnosis Result"
		=> "诊断结果",
		"Item"
		=> "项目",
		"Level"
		=> "级别",
		"Result"
		=> "结果",
		"Explanation/Suggestion"
		=> "解释/建议",
		"XCache extension"
		=> "XCache extension",
		"Add extension=xcache.so (or xcache.dll) in %s"
		=> "在 %s 增加 extension=xcache.so (或 xcache.dll)",
		"Please put a php.ini in %s and add extension=xcache.so (or xcache.dll) in it"
		=> "请在 %s 里放个 php.ini 并且在文件内写入 extension=xcache.so (或 xcache.dll)",
		"Cannot detect php.ini location"
		=> "无法检测 php.ini 位置",
		"(See above)"
		=> "(参见上面)",
		"Not loaded"
		=> "未载入",
		"error"
		=> "错误",
		"Loaded"
		=> "已载入",
		"info"
		=> "信息",
		"Enabling PHP Cacher"
		=> "启用 PHP 缓存器",
		"skipped"
		=> "跳过",
		"Not enabled"
		=> "尚未启用",
		"Your PHP pages is not accelerated by XCache. Set xcache.size to non-zero, set xcache.cacher = On"
		=> "XCache 并未对您的 PHP 网页起到加速作用. 设置 xcache.size 为非 0, 设置 xcache.cacher = On",
		"No php script cached"
		=> "未缓存任何 PHP 脚本",
		"Your PHP pages is not accelerated by XCache. Set xcache.cacher = On"
		=> "XCache 并未对您的 PHP 网页起到加速作用. 设置 xcache.cacher = On",
		"Enabled"
		=> "已启用",
		"PHP Compile Time Error"
		=> "PHP 编译时错误",
		"warning"
		=> "警告",
		"Error happened when compiling one or some of your PHP code"
		=> "至少在编译一个或多个您的 PHP 代码时发生编译错误",
		"PHP code failed to be compiled cannot be cached. This usually means there was syntax error in your PHP code. Enable PHP error_log to see what parser error is it, fix your code. This warning won't go away until PHP is restarted"
		=> "编译失败的 PHP 代码是无法缓存的. 这通常意味着您的 PHP 代码有语法错误. 请启用 error_log 调查具体错误原因并修复您的代码. 重启 PHP 前这个警告不会消失",
		"No error happened"
		=> "未发生过错误",
		"Busy Compiling"
		=> "忙着编译",
		"Cache marked as busy for compiling"
		=> "编译中, 缓存标记为忙",
		"It's ok if this status don't stay for long. Otherwise, it could be a sign of PHP crash/coredump, report to XCache devs"
		=> "这个状态如果持续不就则无影响. 否则可能标志着 PHP 曾经发生异常退出, 如果是的话请报告给 XCache 开发组",
		"Idle"
		=> "空闲",
		"Enabling VAR Cacher"
		=> "启用 VAR 缓存器",
		"PHP code that use XCache caching backend have to use other caching backend instead. Set xcache.var_size to non-zero if you have any PHP code that can use XCache Data Caching API"
		=> "支持使用 XCache 作为数据缓存器的 PHP 代码将不得不采用其他缓存器代替. 如果您有代码支持 XCache 缓存 API 的话, 您可以设置 xcache.var_size 为非 0",
		"Using VAR Cacher"
		=> "使用 VAR 缓存器",
		"No variable data cached"
		=> "未缓存任何变量数据",
		"Var Cacher won't work simply by enabling it. PHP code must call XCache APIs like xcache_set() to use it as cache backend. 3rd party web apps may come with XCache support, config it to use XCache as caching backend"
		=> "只启用变量数据缓存器并无法将其利用起来. 必须通过 PHP 代码去调用 XCache API 接口(如 xcache_set() 函数) 将 XCache 作为缓存器. 第三方网页软件可能带有 XCache 支持, 留意其中的设置启用 XCache 作为缓存器",
		"Cache in use"
		=> "缓存使用中",
		"Cache Size"
		=> "缓存大小",
		"Out of memory happened when trying to write to cache"
		=> "存入缓存时发生内存不足",
		"Increase xcache.size and/or xcache.var_size"
		=> "加大 xcache.size 或 xcache.var_size",
		"Enough"
		=> "充足",
		"Hash Slots"
		=> "哈希槽",
		"Slots value too big"
		=> "哈希槽设定太大",
		"A very small value is set to %s value and leave %s value is too big.\nDecrease %s if small cache is really what you want"
		=> "设置给 %s 的值很小, 却采用过大的 %s. 如果您的确想要配置占用很少内存的缓存器, 可减少 %s",
		"Slots value too small"
		=> "哈希槽设定太小",
		"So many item are cached. Increase %s to a more proper value"
		=> "相当多的项目缓存了. 请适量加大 %s",
		"Looks good"
		=> "看起来还行",
		"Cache Status"
		=> "缓存状态",
		"At least one of the caches is disabled. "
		=> "至少一个缓存器是禁止状态",
		"Enable the cache."
		=> "启用已禁止的缓存器.",
		"It was disabled by PHP crash/coredump handler or you disabled it manually."
		=> "可能是在 PHP 异常退出时自动标记为禁止了, 或者您手工禁止了",
		"You disabled it manually."
		=> "您手工禁止了",
		"If it was caused by PHP crash/coredump, report to XCache devs"
		=> "如果是由于 PHP 异常退出造成, 请报告给 XCache 开发组",
		"Coredump Directory"
		=> "Coredump 目录",
		"Enable coredump to save debugging information in case when PHP crash. It can also be enabled in other module like php-fpm beside XCache"
		=> "启用 coredump 设置. 这样万一发生 PHP 异常退出时可保存调试信息. 这个功能也可以在其他地方启用, 如 php-fpm",
		"Core files found:\n"
		=> "发现 core 文件:\n",
		"Disable XCache PHP Cacher (set xcache.size=0), remove the core file(s), then restart PHP. If core file appears again, report call stack backtrace in the core to XCache devs"
		=> "禁止 XCache 缓存器 (设置 xcache.size=0), 删除 Core 文件, 再重启 PHP. 如果不用 XCache 时不出现 Core, 请从 Core 中取得 call stack back trace 信息报告回 XCache 开发组",
		"You can see core files if PHP crash in %s if PHP crash"
		=> "如果 PHP 异常退出, 您可以在 %s 目录看到 Core 文件",
		"Readonly Protection"
		=> "只读保护",
		"Set to enabled but not available"
		=> "设置为启用, 但目前不可用",
		"Use xcache.mmap_path other than /dev/zero"
		=> "设置 xcache.mmap_path 使用 /dev/zero 以外的值",
		"Disabled"
		=> "已禁止",
		"Enable readonly_protection == --performance & ++stability. Disable readonly_protection == ++performance & --stability"
		=> "启用 readonly_protection == --性能 & ++稳定性. 禁用 readonly_protection == ++性能 & --稳定性",
		"XCache modules"
		=> "XCache 模块",
		"Acceptable. Module(s) listed are built into XCache but not for production server.\nLeave it as is if you're feeling good.\nRe-configure XCache with the module(s) disabled if you're strict with server security."
		=> "可接受. 以上列出的模块已编译入 XCache, 但这些模块并非用于产业服务器.\n如果您觉得没大碍, 就保持现状.\n如果您对稳定性/安全性要求极其严格, 建议重新编译 XCache 不启用这些模块\n",
		"XCache test setting"
		=> "XCache 测试设置",
		"xcache.test is for testing only, not for server. set it to off"
		=> "xcache.test 仅用于开发测试用, 不用于服务器. 将它设置为 off",
		"PHP Version"
		=> "PHP 版本",
		"The version of PHP you're using is known to be unstable: "
		=> "您所使用的 PHP 版本, 是众所周知的不稳定版本: ",
		"Upgrade to new version of PHP"
		=> "升级到更新的 PHP 版本",
		"Extension Compatibility"
		=> "Extension 兼容性",
		"Zend Optimizer loaded"
		=> "Zend Optimizer 载入了",
		"Optimizer feature of 'Zend Optimizer' is disabled by XCache due to compatibility reason; the Loader of it is still available, encoded files are still supported"
		=> "由于兼容性问题, 'Zend Optimizer' 的优化器已被 XCache 禁止; 其加载器依然可用, 可继续使用 Zend 加密的文件",
		"SAPI Compatibility"
		=> "Extension 兼容性",
		"CGI is not supported"
		=> "不支持 CGI",
		"Use FastCGI or FPM instead"
		=> "请改用 FastCGI 或者 FPM",
		"PHP_FCGI_CHILDREN should be >= 1 and use 1 group of parent/childs model. See http://xcache.lighttpd.net/wiki/Faq"
		=> "PHP_FCGI_CHILDREN 应该设为 >= 1 并且使用 1 组单父多子模型. 参见 http://xcache.lighttpd.net/wiki/Faq",
		);

PKq�\+xcache_3/diagnosis/lang/zh-tranditional.phpnu�[���PKq�\��_i@@xcache_3/diagnosis/lang/en.phpnu�[���<?php
// auto generated, do not modify
$strings += array(
		);

PKq�\�w��,�,(xcache_3/diagnosis/lang/zh-simplified.ponu�[���msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-08 14:41+0800\n"
"Language: zh\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: diagnosis.tpl.php:4
msgid "Diagnosis Result"
msgstr "诊断结果"

#: diagnosis.tpl.php:8
msgid "Item"
msgstr "项目"

#: diagnosis.tpl.php:11
msgid "Level"
msgstr "级别"

#: diagnosis.tpl.php:14
msgid "Result"
msgstr "结果"

#: diagnosis.tpl.php:17
msgid "Explanation/Suggestion"
msgstr "解释/建议"

#: index.php:77
msgid "XCache extension"
msgstr "XCache extension"

#: index.php:81
#, php-format
msgid "Add extension=xcache.so (or xcache.dll) in %s"
msgstr "在 %s 增加 extension=xcache.so (或 xcache.dll)"

#: index.php:84
#, php-format
msgid ""
"Please put a php.ini in %s and add extension=xcache.so (or xcache.dll) in it"
msgstr ""
"请在 %s 里放个 php.ini 并且在文件内写入 extension=xcache.so (或 xcache.dll)"

#: index.php:87
msgid "Cannot detect php.ini location"
msgstr "无法检测 php.ini 位置"

#: index.php:89
msgid "(See above)"
msgstr "(参见上面)"

#: index.php:90
msgid "Not loaded"
msgstr "未载入"

#: index.php:90 index.php:129 index.php:135 index.php:290 index.php:308
#: index.php:373 index.php:405 index.php:408
msgid "error"
msgstr "错误"

#: index.php:93
msgid "Loaded"
msgstr "已载入"

#: index.php:93 index.php:141 index.php:158 index.php:175 index.php:189
#: index.php:200 index.php:216 index.php:252 index.php:269 index.php:278
#: index.php:296 index.php:314 index.php:337 index.php:352 index.php:378
#: index.php:385 index.php:392 index.php:399 index.php:413
msgid "info"
msgstr "信息"

#: index.php:124
msgid "Enabling PHP Cacher"
msgstr "启用 PHP 缓存器"

#: index.php:126 index.php:146 index.php:149 index.php:163 index.php:166
#: index.php:180 index.php:207 index.php:221 index.php:258 index.php:275
#: index.php:305 index.php:323 index.php:343
msgid "skipped"
msgstr "跳过"

#: index.php:130 index.php:184 index.php:279
msgid "Not enabled"
msgstr "尚未启用"

#: index.php:131
msgid ""
"Your PHP pages is not accelerated by XCache. Set xcache.size to non-zero, "
"set xcache.cacher = On"
msgstr ""
"XCache 并未对您的 PHP 网页起到加速作用. 设置 xcache.size 为非 0, 设置 xcache."
"cacher = On"

#: index.php:136
msgid "No php script cached"
msgstr "未缓存任何 PHP 脚本"

#: index.php:137
msgid "Your PHP pages is not accelerated by XCache. Set xcache.cacher = On"
msgstr "XCache 并未对您的 PHP 网页起到加速作用. 设置 xcache.cacher = On"

#: index.php:141 index.php:189 index.php:297 index.php:315 index.php:347
msgid "Enabled"
msgstr "已启用"

#: index.php:144
msgid "PHP Compile Time Error"
msgstr "PHP 编译时错误"

#: index.php:152 index.php:169 index.php:183 index.php:193 index.php:210
#: index.php:238 index.php:246 index.php:261 index.php:329 index.php:346
msgid "warning"
msgstr "警告"

#: index.php:153
msgid "Error happened when compiling one or some of your PHP code"
msgstr "至少在编译一个或多个您的 PHP 代码时发生编译错误"

#: index.php:154
msgid ""
"PHP code failed to be compiled cannot be cached. This usually means there "
"was syntax error in your PHP code. Enable PHP error_log to see what parser "
"error is it, fix your code. This warning won't go away until PHP is restarted"
msgstr ""
"编译失败的 PHP 代码是无法缓存的. 这通常意味着您的 PHP 代码有语法错误. 请启用 "
"error_log 调查具体错误原因并修复您的代码. 重启 PHP 前这个警告不会消失"

#: index.php:158
msgid "No error happened"
msgstr "未发生过错误"

#: index.php:161
msgid "Busy Compiling"
msgstr "忙着编译"

#: index.php:170
msgid "Cache marked as busy for compiling"
msgstr "编译中, 缓存标记为忙"

#: index.php:171
msgid ""
"It's ok if this status don't stay for long. Otherwise, it could be a sign of "
"PHP crash/coredump, report to XCache devs"
msgstr ""
"这个状态如果持续不就则无影响. 否则可能标志着 PHP 曾经发生异常退出, 如果是的话"
"请报告给 XCache 开发组"

#: index.php:175 index.php:269 index.php:337
msgid "Idle"
msgstr "空闲"

#: index.php:178
msgid "Enabling VAR Cacher"
msgstr "启用 VAR 缓存器"

#: index.php:185
#, fuzzy
msgid ""
"PHP code that use XCache caching backend have to use other caching backend "
"instead. Set xcache.var_size to non-zero if you have any PHP code that can "
"use XCache Data Caching API"
msgstr ""
"支持使用 XCache 作为数据缓存器的 PHP 代码将不得不采用其他缓存器代替. 如果您有"
"代码支持 XCache 缓存 API 的话, 您可以设置 xcache.var_size 为非 0"

#: index.php:191
msgid "Using VAR Cacher"
msgstr "使用 VAR 缓存器"

#: index.php:194
msgid "No variable data cached"
msgstr "未缓存任何变量数据"

#: index.php:195
msgid ""
"Var Cacher won't work simply by enabling it. PHP code must call XCache APIs "
"like xcache_set() to use it as cache backend. 3rd party web apps may come "
"with XCache support, config it to use XCache as caching backend"
msgstr ""
"只启用变量数据缓存器并无法将其利用起来. 必须通过 PHP 代码去调用 XCache API 接"
"口(如 xcache_set() 函数) 将 XCache 作为缓存器. 第三方网页软件可能带有 XCache "
"支持, 留意其中的设置启用 XCache 作为缓存器"

#: index.php:200
msgid "Cache in use"
msgstr "缓存使用中"

#: index.php:205
msgid "Cache Size"
msgstr "缓存大小"

#: index.php:211
msgid "Out of memory happened when trying to write to cache"
msgstr "存入缓存时发生内存不足"

#: index.php:212
msgid "Increase xcache.size and/or xcache.var_size"
msgstr "加大 xcache.size 或 xcache.var_size"

#: index.php:216
msgid "Enough"
msgstr "充足"

#: index.php:219
msgid "Hash Slots"
msgstr "哈希槽"

#: index.php:239
msgid "Slots value too big"
msgstr "哈希槽设定太大"

#: index.php:240
#, php-format
msgid ""
"A very small value is set to %s value and leave %s value is too big.\n"
"Decrease %s if small cache is really what you want"
msgstr ""
"设置给 %s 的值很小, 却采用过大的 %s. 如果您的确想要配置占用很少内存的缓存器, "
"可减少 %s"

#: index.php:247
msgid "Slots value too small"
msgstr "哈希槽设定太小"

#: index.php:248
#, php-format
msgid "So many item are cached. Increase %s to a more proper value"
msgstr "相当多的项目缓存了. 请适量加大 %s"

#: index.php:252 index.php:378 index.php:399 index.php:413
msgid "Looks good"
msgstr "看起来还行"

#: index.php:256
msgid "Cache Status"
msgstr "缓存状态"

#: index.php:262
msgid "At least one of the caches is disabled. "
msgstr "至少一个缓存器是禁止状态"

#: index.php:263
msgid "Enable the cache."
msgstr "启用已禁止的缓存器."

#: index.php:264
msgid ""
"It was disabled by PHP crash/coredump handler or you disabled it manually."
msgstr "可能是在 PHP 异常退出时自动标记为禁止了, 或者您手工禁止了"

#: index.php:264
msgid "You disabled it manually."
msgstr "您手工禁止了"

#: index.php:265
msgid "If it was caused by PHP crash/coredump, report to XCache devs"
msgstr "如果是由于 PHP 异常退出造成, 请报告给 XCache 开发组"

#: index.php:273
msgid "Coredump Directory"
msgstr "Coredump 目录"

#: index.php:280
msgid ""
"Enable coredump to save debugging information in case when PHP crash. It can "
"also be enabled in other module like php-fpm beside XCache"
msgstr ""
"启用 coredump 设置. 这样万一发生 PHP 异常退出时可保存调试信息. 这个功能也可以"
"在其他地方启用, 如 php-fpm"

#: index.php:291
msgid "Core files found:\n"
msgstr "发现 core 文件:\n"

#: index.php:292
msgid ""
"Disable XCache PHP Cacher (set xcache.size=0), remove the core file(s), then "
"restart PHP. If core file appears again, report call stack backtrace in the "
"core to XCache devs"
msgstr ""
"禁止 XCache 缓存器 (设置 xcache.size=0), 删除 Core 文件, 再重启 PHP. 如果不"
"用 XCache 时不出现 Core, 请从 Core 中取得 call stack back trace 信息报告回 "
"XCache 开发组"

#: index.php:298
#, php-format
msgid "You can see core files if PHP crash in %s if PHP crash"
msgstr "如果 PHP 异常退出, 您可以在 %s 目录看到 Core 文件"

#: index.php:303
msgid "Readonly Protection"
msgstr "只读保护"

#: index.php:309
msgid "Set to enabled but not available"
msgstr "设置为启用, 但目前不可用"

#: index.php:310
msgid "Use xcache.mmap_path other than /dev/zero"
msgstr "设置 xcache.mmap_path 使用 /dev/zero 以外的值"

#: index.php:315 index.php:352
msgid "Disabled"
msgstr "已禁止"

#: index.php:316
msgid ""
"Enable readonly_protection == --performance & ++stability. Disable "
"readonly_protection == ++performance & --stability"
msgstr ""
"启用 readonly_protection == --性能 & ++稳定性. 禁用 readonly_protection == +"
"+性能 & --稳定性"

#: index.php:321
msgid "XCache modules"
msgstr "XCache 模块"

#: index.php:331
msgid ""
"Acceptable. Module(s) listed are built into XCache but not for production "
"server.\n"
"Leave it as is if you're feeling good.\n"
"Re-configure XCache with the module(s) disabled if you're strict with server "
"security."
msgstr ""
"可接受. 以上列出的模块已编译入 XCache, 但这些模块并非用于产业服务器.\n"
"如果您觉得没大碍, 就保持现状.\n"
"如果您对稳定性/安全性要求极其严格, 建议重新编译 XCache 不启用这些模块\n"

#: index.php:341
msgid "XCache test setting"
msgstr "XCache 测试设置"

#: index.php:348
msgid "xcache.test is for testing only, not for server. set it to off"
msgstr "xcache.test 仅用于开发测试用, 不用于服务器. 将它设置为 off"

#: index.php:355
msgid "PHP Version"
msgstr "PHP 版本"

#: index.php:374
msgid "The version of PHP you're using is known to be unstable: "
msgstr "您所使用的 PHP 版本, 是众所周知的不稳定版本: "

#: index.php:375
msgid "Upgrade to new version of PHP"
msgstr "升级到更新的 PHP 版本"

#: index.php:381
msgid "Extension Compatibility"
msgstr "Extension 兼容性"

#: index.php:386
msgid "Zend Optimizer loaded"
msgstr "Zend Optimizer 载入了"

#: index.php:387
msgid ""
"Optimizer feature of 'Zend Optimizer' is disabled by XCache due to "
"compatibility reason; the Loader of it is still available, encoded files are "
"still supported"
msgstr ""
"由于兼容性问题, 'Zend Optimizer' 的优化器已被 XCache 禁止; 其加载器依然可用, "
"可继续使用 Zend 加密的文件"

#: index.php:393
msgid "the ionCube PHP Loader loaded"
msgstr ""

#: index.php:394
msgid ""
"Compatibility with this the ionCube PHp Loader' is taken care of; But in "
"case if there's any problem, report to ionCube team and/or XCache devs"
msgstr ""

#: index.php:402
msgid "SAPI Compatibility"
msgstr "Extension 兼容性"

#: index.php:405
msgid "CGI is not supported"
msgstr "不支持 CGI"

#: index.php:405
msgid "Use FastCGI or FPM instead"
msgstr "请改用 FastCGI 或者 FPM"

#: index.php:410
msgid ""
"PHP_FCGI_CHILDREN should be >= 1 and use 1 group of parent/childs model. See "
"http://xcache.lighttpd.net/wiki/Faq"
msgstr ""
"PHP_FCGI_CHILDREN 应该设为 >= 1 并且使用 1 组单父多子模型. 参见 http://"
"xcache.lighttpd.net/wiki/Faq"
PKq�\���((xcache_3/diagnosis/lang/en.ponu�[���msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-08 14:41+0800\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: diagnosis.tpl.php:4
msgid "Diagnosis Result"
msgstr ""

#: diagnosis.tpl.php:8
msgid "Item"
msgstr ""

#: diagnosis.tpl.php:11
msgid "Level"
msgstr ""

#: diagnosis.tpl.php:14
msgid "Result"
msgstr ""

#: diagnosis.tpl.php:17
msgid "Explanation/Suggestion"
msgstr ""

#: index.php:77
msgid "XCache extension"
msgstr ""

#: index.php:81
#, php-format
msgid "Add extension=xcache.so (or xcache.dll) in %s"
msgstr ""

#: index.php:84
#, php-format
msgid ""
"Please put a php.ini in %s and add extension=xcache.so (or xcache.dll) in it"
msgstr ""

#: index.php:87
msgid "Cannot detect php.ini location"
msgstr ""

#: index.php:89
msgid "(See above)"
msgstr ""

#: index.php:90
msgid "Not loaded"
msgstr ""

#: index.php:90 index.php:129 index.php:135 index.php:290 index.php:308
#: index.php:373 index.php:405 index.php:408
msgid "error"
msgstr ""

#: index.php:93
msgid "Loaded"
msgstr ""

#: index.php:93 index.php:141 index.php:158 index.php:175 index.php:189
#: index.php:200 index.php:216 index.php:252 index.php:269 index.php:278
#: index.php:296 index.php:314 index.php:337 index.php:352 index.php:378
#: index.php:385 index.php:392 index.php:399 index.php:413
msgid "info"
msgstr ""

#: index.php:124
msgid "Enabling PHP Cacher"
msgstr ""

#: index.php:126 index.php:146 index.php:149 index.php:163 index.php:166
#: index.php:180 index.php:207 index.php:221 index.php:258 index.php:275
#: index.php:305 index.php:323 index.php:343
msgid "skipped"
msgstr ""

#: index.php:130 index.php:184 index.php:279
msgid "Not enabled"
msgstr ""

#: index.php:131
msgid ""
"Your PHP pages is not accelerated by XCache. Set xcache.size to non-zero, "
"set xcache.cacher = On"
msgstr ""

#: index.php:136
msgid "No php script cached"
msgstr ""

#: index.php:137
msgid "Your PHP pages is not accelerated by XCache. Set xcache.cacher = On"
msgstr ""

#: index.php:141 index.php:189 index.php:297 index.php:315 index.php:347
msgid "Enabled"
msgstr ""

#: index.php:144
msgid "PHP Compile Time Error"
msgstr ""

#: index.php:152 index.php:169 index.php:183 index.php:193 index.php:210
#: index.php:238 index.php:246 index.php:261 index.php:329 index.php:346
msgid "warning"
msgstr ""

#: index.php:153
msgid "Error happened when compiling one or some of your PHP code"
msgstr ""

#: index.php:154
msgid ""
"PHP code failed to be compiled cannot be cached. This usually means there "
"was syntax error in your PHP code. Enable PHP error_log to see what parser "
"error is it, fix your code. This warning won't go away until PHP is restarted"
msgstr ""

#: index.php:158
msgid "No error happened"
msgstr ""

#: index.php:161
msgid "Busy Compiling"
msgstr ""

#: index.php:170
msgid "Cache marked as busy for compiling"
msgstr ""

#: index.php:171
msgid ""
"It's ok if this status don't stay for long. Otherwise, it could be a sign of "
"PHP crash/coredump, report to XCache devs"
msgstr ""

#: index.php:175 index.php:269 index.php:337
msgid "Idle"
msgstr ""

#: index.php:178
msgid "Enabling VAR Cacher"
msgstr ""

#: index.php:185
msgid ""
"PHP code that use XCache caching backend have to use other caching backend "
"instead. Set xcache.var_size to non-zero if you have any PHP code that can "
"use XCache Data Caching API"
msgstr ""

#: index.php:191
msgid "Using VAR Cacher"
msgstr ""

#: index.php:194
msgid "No variable data cached"
msgstr ""

#: index.php:195
msgid ""
"Var Cacher won't work simply by enabling it. PHP code must call XCache APIs "
"like xcache_set() to use it as cache backend. 3rd party web apps may come "
"with XCache support, config it to use XCache as caching backend"
msgstr ""

#: index.php:200
msgid "Cache in use"
msgstr ""

#: index.php:205
msgid "Cache Size"
msgstr ""

#: index.php:211
msgid "Out of memory happened when trying to write to cache"
msgstr ""

#: index.php:212
msgid "Increase xcache.size and/or xcache.var_size"
msgstr ""

#: index.php:216
msgid "Enough"
msgstr ""

#: index.php:219
msgid "Hash Slots"
msgstr ""

#: index.php:239
msgid "Slots value too big"
msgstr ""

#: index.php:240
#, php-format
msgid ""
"A very small value is set to %s value and leave %s value is too big.\n"
"Decrease %s if small cache is really what you want"
msgstr ""

#: index.php:247
msgid "Slots value too small"
msgstr ""

#: index.php:248
#, php-format
msgid "So many item are cached. Increase %s to a more proper value"
msgstr ""

#: index.php:252 index.php:378 index.php:399 index.php:413
msgid "Looks good"
msgstr ""

#: index.php:256
msgid "Cache Status"
msgstr ""

#: index.php:262
msgid "At least one of the caches is disabled. "
msgstr ""

#: index.php:263
msgid "Enable the cache."
msgstr ""

#: index.php:264
msgid ""
"It was disabled by PHP crash/coredump handler or you disabled it manually."
msgstr ""

#: index.php:264
msgid "You disabled it manually."
msgstr ""

#: index.php:265
msgid "If it was caused by PHP crash/coredump, report to XCache devs"
msgstr ""

#: index.php:273
msgid "Coredump Directory"
msgstr ""

#: index.php:280
msgid ""
"Enable coredump to save debugging information in case when PHP crash. It can "
"also be enabled in other module like php-fpm beside XCache"
msgstr ""

#: index.php:291
msgid "Core files found:\n"
msgstr ""

#: index.php:292
msgid ""
"Disable XCache PHP Cacher (set xcache.size=0), remove the core file(s), then "
"restart PHP. If core file appears again, report call stack backtrace in the "
"core to XCache devs"
msgstr ""

#: index.php:298
#, php-format
msgid "You can see core files if PHP crash in %s if PHP crash"
msgstr ""

#: index.php:303
msgid "Readonly Protection"
msgstr ""

#: index.php:309
msgid "Set to enabled but not available"
msgstr ""

#: index.php:310
msgid "Use xcache.mmap_path other than /dev/zero"
msgstr ""

#: index.php:315 index.php:352
msgid "Disabled"
msgstr ""

#: index.php:316
msgid ""
"Enable readonly_protection == --performance & ++stability. Disable "
"readonly_protection == ++performance & --stability"
msgstr ""

#: index.php:321
msgid "XCache modules"
msgstr ""

#: index.php:331
msgid ""
"Acceptable. Module(s) listed are built into XCache but not for production "
"server.\n"
"Leave it as is if you're feeling good.\n"
"Re-configure XCache with the module(s) disabled if you're strict with server "
"security."
msgstr ""

#: index.php:341
msgid "XCache test setting"
msgstr ""

#: index.php:348
msgid "xcache.test is for testing only, not for server. set it to off"
msgstr ""

#: index.php:355
msgid "PHP Version"
msgstr ""

#: index.php:374
msgid "The version of PHP you're using is known to be unstable: "
msgstr ""

#: index.php:375
msgid "Upgrade to new version of PHP"
msgstr ""

#: index.php:381
msgid "Extension Compatibility"
msgstr ""

#: index.php:386
msgid "Zend Optimizer loaded"
msgstr ""

#: index.php:387
msgid ""
"Optimizer feature of 'Zend Optimizer' is disabled by XCache due to "
"compatibility reason; the Loader of it is still available, encoded files are "
"still supported"
msgstr ""

#: index.php:393
msgid "the ionCube PHP Loader loaded"
msgstr ""

#: index.php:394
msgid ""
"Compatibility with this the ionCube PHp Loader' is taken care of; But in "
"case if there's any problem, report to ionCube team and/or XCache devs"
msgstr ""

#: index.php:402
msgid "SAPI Compatibility"
msgstr ""

#: index.php:405
msgid "CGI is not supported"
msgstr ""

#: index.php:405
msgid "Use FastCGI or FPM instead"
msgstr ""

#: index.php:410
msgid ""
"PHP_FCGI_CHILDREN should be >= 1 and use 1 group of parent/childs model. See "
"http://xcache.lighttpd.net/wiki/Faq"
msgstr ""
PKq�\NR�r�0�0xcache_3/diagnosis/index.phpnu�[���<?php

include "../common/common.php";
include get_language_file("./lang");

$knownUnstablePhpVersions = array(
		array('=', '5.3.14', 'random corrupt memory on high concurrent'),
		);

$module = "diagnosis";

$notes = array();
$activeNote = null;
function checking($item) // {{{
{
	global $activeNote;
	$activeNote = array('item' => $item);
}
// }}}
function result($type, $result, $suggestion = "") // {{{
{
	global $notes, $activeNote;
	$notes[] = array(
			'type' => $type
			, 'result' => ($type != 'skipped' && !$suggestion ? "OK. " : "") . $result
			, 'suggestion' => $suggestion
			) + $activeNote;
}
// }}}
function getCacheInfos() // {{{
{
	$phpCacheCount = xcache_count(XC_TYPE_PHP);
	$varCacheCount = xcache_count(XC_TYPE_VAR);

	$cacheInfos = array();
	for ($i = 0; $i < $phpCacheCount; $i ++) {
		$cacheInfo = xcache_info(XC_TYPE_PHP, $i);
		$cacheInfo['type'] = XC_TYPE_PHP;
		$cacheInfos[] = $cacheInfo;
	}

	for ($i = 0; $i < $varCacheCount; $i ++) {
		$cacheInfo = xcache_info(XC_TYPE_VAR, $i);
		$cacheInfo['type'] = XC_TYPE_VAR;
		$cacheInfos[] = $cacheInfo;
	}
	return $cacheInfos;
}
// }}}
function getIniFileInfo() // {{{
{
	ob_start();
	phpinfo(INFO_GENERAL);
	$info = ob_get_clean();
	ob_start();
	if (preg_match_all("!<tr>[^<]*<td[^>]*>[^<]*(?:Configuration|ini|Server API)[^<]*</td>[^<]*<td[^>]*>[^<]*</td>[^<]*</tr>!s", $info, $m)) {
		$iniInfo = '<table class="phpinfo">'
			. implode('', $m[0])
			. '</table>';
	}
	else {
		$iniInfo = '';
	}
	$loadedIni = '';
	$iniDirectory = '';
	if (preg_match('!<td class="v">(.*?\\.ini)!', $info, $m)) {
		$loadedIni = trim($m[1]);
	}
	else if (preg_match('!Configuration File \\(php.ini\\) Path *</td><td class="v">([^<]+)!', $info, $m)) {
		$iniDirectory = trim($m[1]);
	}
	return array($loadedIni, $iniDirectory, $iniInfo);
}
// }}}

$xcacheLoaded = extension_loaded('XCache');
checking(_T("XCache extension")); // {{{
if (!$xcacheLoaded) {
	list($loadedIni, $iniDirectory, $iniInfo) = getIniFileInfo();
	if ($loadedIni) {
		echo sprintf(_T("Add extension=xcache.so (or xcache.dll) in %s"), $loadedIni);
	}
	else if ($iniDirectory) {
		echo sprintf(_T("Please put a php.ini in %s and add extension=xcache.so (or xcache.dll) in it"), $iniDirectory);
	}
	else {
		echo _T("Cannot detect php.ini location");
	}
	echo " ", _T("(See above)");
	result(N_("error"), _T('Not loaded'), ob_get_clean());
}
else {
	result(N_("info"), _T('Loaded'));
}
// }}}
if ($xcacheLoaded) { // {{{ load XCache summary
	$cacheInfos = getCacheInfos();

	$ooms = 0;
	$errors = 0;
	$disabled = 0;
	$compiling = 0;
	$readonlyProtection = false;
	$phpCacheCount = xcache_count(XC_TYPE_PHP);
	$phpCached = 0;
	$varCached = 0;
	foreach ($cacheInfos as $cacheInfo) {
		$ooms += $cacheInfo['ooms'];
		$errors += $cacheInfo['errors'];
		$disabled += $cacheInfo['disabled'] ? 1 : 0;
		if ($cacheInfo['type'] == XC_TYPE_PHP) {
			$compiling += $cacheInfo['compiling'] ? 1 : 0;
			$phpCached += $cacheInfo['cached'];
		}
		if ($cacheInfo['type'] == XC_TYPE_VAR && $cacheInfo['cached']) {
			$varCached += $cacheInfo['cached'];
		}
		if ($cacheInfo['can_readonly']) {
			$readonlyProtection = true;
		}
	}
}
// }}}
checking(_T("Enabling PHP Cacher")); // {{{
if (!$xcacheLoaded) {
	result(N_("skipped"), "XCache not loaded");
}
else if (!ini_get("xcache.size")) {
	result(N_("error")
		, _T("Not enabled")
		, _T("Your PHP pages is not accelerated by XCache. Set xcache.size to non-zero, set xcache.cacher = On")
		);
}
else if (!$phpCached) {
	result(N_("error")
		, _T("No php script cached")
		, _T("Your PHP pages is not accelerated by XCache. Set xcache.cacher = On")
		);
}
else {
	result(N_("info"), _T('Enabled'));
}
// }}}
checking(_T("PHP Compile Time Error")); // {{{
if (!$xcacheLoaded) {
	result(N_("skipped"), "XCache not loaded");
}
else if (!$phpCacheCount) {
	result(N_("skipped"), "XCache PHP cacher not enabled");
}
else if ($errors) {
	result(N_("warning")
		, _T("Error happened when compiling one or some of your PHP code")
		, _T("PHP code failed to be compiled cannot be cached. This usually means there was syntax error in your PHP code. Enable PHP error_log to see what parser error is it, fix your code. This warning won't go away until PHP is restarted")
		);
}
else {
	result(N_("info"), _T('No error happened'));
}
// }}}
checking(_T("Busy Compiling")); // {{{
if (!$xcacheLoaded) {
	result(N_("skipped"), "XCache not loaded");
}
else if (!$phpCacheCount) {
	result(N_("skipped"), "XCache PHP cacher not enabled");
}
else if ($compiling) {
	result(N_("warning")
		, _T("Cache marked as busy for compiling")
		, _T("It's ok if this status don't stay for long. Otherwise, it could be a sign of PHP crash/coredump, report to XCache devs")
		);
}
else {
	result(N_("info"), _T('Idle'));
}
// }}}
checking(_T("Enabling VAR Cacher")); // {{{
if (!$xcacheLoaded) {
	result(N_("skipped"), "XCache not loaded");
}
else if (!ini_get("xcache.var_size")) {
	result(N_("warning")
		, _T("Not enabled")
		, _T("PHP code that use XCache caching backend have to use other caching backend instead. Set xcache.var_size to non-zero if you have any PHP code that can use XCache Data Caching API")
		);
}
else {
	result(N_("info"), _T('Enabled'));

	checking(_T("Using VAR Cacher")); // {{{
	if (!$varCached) {
		result(N_("warning")
			, _T("No variable data cached")
			, _T("Var Cacher won't work simply by enabling it."
				. " PHP code must call XCache APIs like xcache_set() to use it as cache backend. 3rd party web apps may come with XCache support, config it to use XCache as caching backend")
			);
	}
	else {
		result(N_("info"), _T('Cache in use'));
	}
	// }}}
}
// }}}
checking(_T("Cache Size")); // {{{
if (!$xcacheLoaded) {
	result(N_("skipped"), "XCache not loaded");
}
else if ($ooms) {
	result(N_("warning")
		, _T("Out of memory happened when trying to write to cache")
		, _T("Increase xcache.size and/or xcache.var_size")
		);
}
else {
	result(N_("info"), _T('Enough'));
}
// }}}
checking(_T("Hash Slots")); // {{{
if (!$xcacheLoaded) {
	result(N_("skipped"), "XCache not loaded");
}
else {
	$slotsTooBig = null;
	$slotsTooSmall = null;
	foreach ($cacheInfos as $cacheInfo) {
		if ($cacheInfo['size'] < '1024000' && $cacheInfo['slots'] >= '8192') {
			$slotsTooBig = $cacheInfo['type'];
			break;
		}
		if ($cacheInfo['slots'] < $cacheInfo['cached'] / 2) {
			$slotsTooSmall = $cacheInfo['type'];
			break;
		}
	}
	if (isset($slotsTooBig)) {
		$prefix = $slotsTooBig == XC_TYPE_PHP ? '' : 'var_';
		result(N_("warning")
			, _T("Slots value too big")
			, sprintf(_T("A very small value is set to %s value and leave %s value is too big.\n"
				. "Decrease %s if small cache is really what you want"), "xcache.{$prefix}size", "xcache.{$prefix}slots", "xcache.{$prefix}slots")
			);
	}
	else if (isset($slotsTooSmall)) {
		$prefix = $slotsTooSmall == XC_TYPE_PHP ? '' : 'var_';
		result(N_("warning")
			, _T("Slots value too small")
			, sprintf(_T("So many item are cached. Increase %s to a more proper value"), "xcache.{$prefix}slots")
			);
	}
	else {
		result(N_("info"), _T('Looks good'));
	}
}
// }}}
checking(_T("Cache Status")); // {{{
if (!$xcacheLoaded) {
	result(N_("skipped"), "XCache not loaded");
}
else if ($disabled) {
	result(N_("warning")
		, _T("At least one of the caches is disabled. ")
		, _T("Enable the cache.")
			. (ini_get("xcache.crash_on_coredump") ? " " . _T("It was disabled by PHP crash/coredump handler or you disabled it manually.") : _T('You disabled it manually.'))
			. (ini_get("xcache.crash_on_coredump") ? " " . _T("If it was caused by PHP crash/coredump, report to XCache devs") : "")
		);
}
else {
	result(N_("info"), _T('Idle'));
}
// }}}

checking(_T("Coredump Directory")); // {{{
if (!$xcacheLoaded) {
	result(N_("skipped"), "XCache not loaded");
}
else if (!ini_get("xcache.coredump_directory")) {
	result(N_("info")
			, _T("Not enabled")
			, _T("Enable coredump to save debugging information in case when PHP crash. It can also be enabled in other module like php-fpm beside XCache")
			);
}
else if (ini_get("xcache.coredump_directory")) {
	$coreDir = ini_get("xcache.coredump_directory");
	if (substr($coreDir, -1) != DIRECTORY_SEPARATOR) {
		$coreDir .= DIRECTORY_SEPARATOR;
	}
	$coreFiles = glob($coreDir . "core*");
	if ($coreFiles) {
		result(N_("error")
				, _T("Core files found:\n") . implode("\n", $coreFiles)
				, _T("Disable XCache PHP Cacher (set xcache.size=0), remove the core file(s), then restart PHP. If core file appears again, report call stack backtrace in the core to XCache devs")
				);
	}
	else {
		result(N_("info")
				, _T("Enabled")
				, sprintf(_T("You can see core files if PHP crash in %s if PHP crash"), ini_get("xcache.coredump_directory"))
				);
	}
}
// }}}
checking(_T("Readonly Protection")); // {{{
if (!$xcacheLoaded) {
	result(N_("skipped"), "XCache not loaded");
}
else if (ini_get("xcache.readonly_protection") && !$readonlyProtection) {
	result(N_("error")
		, _T("Set to enabled but not available")
		, _T("Use xcache.mmap_path other than /dev/zero")
		);
}
else {
	result(N_("info")
		, $readonlyProtection ? _T("Enabled") : _T("Disabled")
		, _T("Enable readonly_protection == --performance & ++stability. "
			. "Disable readonly_protection == ++performance & --stability")
		);
}
// }}}
checking(_T("XCache modules")); // {{{
if (!$xcacheLoaded) {
	result(N_("skipped"), "XCache not loaded");
}
else {
	$xcacheModules = explode(" ", XCACHE_MODULES);
	$unexpectedModules = array_intersect($xcacheModules, array("coverager", "disassembler"));
	if ($unexpectedModules) {
		result(N_("warning")
			, implode("\n", $unexpectedModules)
			, _T("Acceptable. Module(s) listed are built into XCache but not for production server.\n"
				. "Leave it as is if you're feeling good.\n"
				. "Re-configure XCache with the module(s) disabled if you're strict with server security.")
			);
	}
	else {
		result(N_("info"), _T('Idle'));
	}
}
// }}}
checking(_T("XCache test setting")); // {{{
if (!$xcacheLoaded) {
	result(N_("skipped"), "XCache not loaded");
}
else if ((int) ini_get('xcache.test') == 1) {
	result(N_("warning")
		, _T("Enabled")
		, _T("xcache.test is for testing only, not for server. set it to off")
		);
}
else {
	result(N_("info"), _T('Disabled'));
}
// }}}
checking(_T("PHP Version")); // {{{
$phpVersion = phpversion();
$unstablePhpVersionReason = null;
foreach ($knownUnstablePhpVersions as $knownUnstablePhpVersion) {
	list($compareOp, $unstablePhpVersion, $reason) = $knownUnstablePhpVersion;
	if ($compareOp) {
		$isUnstable = version_compare($phpVersion, $unstablePhpVersion, $compareOp);
	}
	else {
		$isUnstable = substr($phpVersion, 0, strlen($unstablePhpVersion)) == $unstablePhpVersion;
	}

	if ($isUnstable) {
		$unstablePhpVersionReason = $reason;
		break;
	}
}
if ($unstablePhpVersionReason) {
	result(N_("error")
			, _T("The version of PHP you're using is known to be unstable: ") . $unstablePhpVersionReason
			, _T("Upgrade to new version of PHP"));
}
else {
	result(N_("info"), _T("Looks good"));
}
// }}}
checking(_T("Extension Compatibility")); // {{{
$loadedZendExtensions = get_loaded_extensions(true);
$extensionGood = true;
if (array_search("Zend Optimizer", $loadedZendExtensions) !== false) {
	result(N_("info")
		, _T("Zend Optimizer loaded")
		, _T("Optimizer feature of 'Zend Optimizer' is disabled by XCache due to compatibility reason; the Loader of it is still available, encoded files are still supported")
		);
	$extensionGood = false;
}
if (array_search("the ionCube PHP Loader", $loadedZendExtensions) !== false) {
	result(N_("info")
		, _T("the ionCube PHP Loader loaded")
		, _T("Compatibility with this the ionCube PHp Loader' is taken care of; But in case if there's any problem, report to ionCube team and/or XCache devs")
		);
	$extensionGood = false;
}
if (!$extensionGood) {
	result(N_("info"), _T("Looks good"));
}
// }}}
checking(_T("SAPI Compatibility")); // {{{

if (php_sapi_name() == "cgi" || php_sapi_name() == "cgi-fcgi" && !isset($_SERVER["FCGI_ROLE"])) {
	result(N_("error"), _T("CGI is not supported"), _T("Use FastCGI or FPM instead"));
}
else if (php_sapi_name() == "cgi-fcgi" && isset($_SERVER["FCGI_ROLE"]) && (int) getenv("PHP_FCGI_CHILDREN") < 1) {
	result(N_("error")
		, "PHP_FCGI_CHILDREN<1"
		, _T("PHP_FCGI_CHILDREN should be >= 1 and use 1 group of parent/childs model. See http://xcache.lighttpd.net/wiki/Faq"));
}
else {
	result(N_("info"), _T("Looks good"));
}
// }}}

include "./diagnosis.tpl.php";

PKq�\��y##$xcache_3/diagnosis/diagnosis.tpl.phpnu�[���<?php include "../common/header.tpl.php"; ?>
<table cellspacing="0" cellpadding="4" class="cycles" id="diagnosisResult">
	<caption>
		<?php echo _T("Diagnosis Result"); ?>
	</caption>
	<tr>
		<th>
			<?php echo _T("Item"); ?>
		</th>
		<th>
			<?php echo _T("Level"); ?>
		</th>
		<th>
			<?php echo _T("Result"); ?>
		</th>
		<th>
			<?php echo _T("Explanation/Suggestion"); ?>
		</th>
	</tr>
<?php foreach ($notes as $note) { ?>
	<tr class="<?php echo $note['type']; ?>">
		<td nowrap="nowrap" align="right"><?php echo $note['item']; ?></td>
		<td nowrap="nowrap"><?php echo ucfirst(__($note['type'])); ?></td>
		<td nowrap="nowrap"><?php echo nl2br($note['result']); ?></td>
		<td><?php echo nl2br($note['suggestion']); ?></td>
	</tr>
<?php } ?>
</table>
<?php include "../common/footer.tpl.php"; ?>
PKq�\�@��� xcache_3/diagnosis/diagnosis.cssnu�[���#diagnosisResult .info {
	background: #C0FFC0;
}
#diagnosisResult .warning {
	background: #FFF0FF;
}
#diagnosisResult .error {
	background: #FFA0A0;
}
#main #diagnosisResult td {
	vertical-align: top;
}
PKq�\݅��qq)xcache_3/coverager/lang/zh-traditional.ponu�[���msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-08 14:41+0800\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: coverager.tpl.php:37
msgid "Directory"
msgstr ""

#: coverager.tpl.php:38 coverager.tpl.php:100
msgid "Percent"
msgstr ""

#: coverager.tpl.php:39 coverager.tpl.php:101
msgid "Hits"
msgstr ""

#: coverager.tpl.php:40 coverager.tpl.php:102
msgid "Lines"
msgstr ""

#: coverager.tpl.php:41
msgid "TODO"
msgstr ""

#: coverager.tpl.php:99
msgid "File"
msgstr ""

#: coverager.tpl.php:151
msgid "root"
msgstr ""
PKq�\��_i@@*xcache_3/coverager/lang/zh-traditional.phpnu�[���<?php
// auto generated, do not modify
$strings += array(
		);

PKq�\�"�@��)xcache_3/coverager/lang/zh-simplified.phpnu�[���<?php
// auto generated, do not modify
$strings += array(
		"Directory"
		=> "目录",
		"Percent"
		=> "覆盖率",
		"Hits"
		=> "命中",
		"Lines"
		=> "行数",
		"TODO"
		=> "闲置文件",
		"File"
		=> "文件",
		"root"
		=> "开始",
		);

PKq�\��_i@@xcache_3/coverager/lang/en.phpnu�[���<?php
// auto generated, do not modify
$strings += array(
		);

PKq�\W:J��(xcache_3/coverager/lang/zh-simplified.ponu�[���msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-08 14:41+0800\n"
"Language: zh\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: coverager.tpl.php:37
msgid "Directory"
msgstr "目录"

#: coverager.tpl.php:38 coverager.tpl.php:100
msgid "Percent"
msgstr "覆盖率"

#: coverager.tpl.php:39 coverager.tpl.php:101
msgid "Hits"
msgstr "命中"

#: coverager.tpl.php:40 coverager.tpl.php:102
msgid "Lines"
msgstr "行数"

#: coverager.tpl.php:41
msgid "TODO"
msgstr "闲置文件"

#: coverager.tpl.php:99
msgid "File"
msgstr "文件"

#: coverager.tpl.php:151
msgid "root"
msgstr "开始"
PKq�\�7�nnxcache_3/coverager/lang/en.ponu�[���msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-08 14:41+0800\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: coverager.tpl.php:37
msgid "Directory"
msgstr ""

#: coverager.tpl.php:38 coverager.tpl.php:100
msgid "Percent"
msgstr ""

#: coverager.tpl.php:39 coverager.tpl.php:101
msgid "Hits"
msgstr ""

#: coverager.tpl.php:40 coverager.tpl.php:102
msgid "Lines"
msgstr ""

#: coverager.tpl.php:41
msgid "TODO"
msgstr ""

#: coverager.tpl.php:99
msgid "File"
msgstr ""

#: coverager.tpl.php:151
msgid "root"
msgstr ""
PKq�\���� xcache_3/coverager/coverager.cssnu�[���.coverFile {
	text-align:       left;
	color:            gray;
	padding-left:     10px;
	padding-right:    10px;
}

.coverBar {
	padding-left:     10px;
	padding-right:    10px;
}

.coverBarOutline {
	border: 1px solid black;
	background-color: #ffffff;
	width: 100px;
	font-size: 11px; line-height: 11px;
	font-family: tahoma;
	position: relative;
}

.coverPerHi, .coverPerMed, .coverPerLo {
	text-align:       center;
	font-weight:      bold;
	left: 0px; top: 2px;
	position: absolute;
	width: 100%;
}
.coverBarHi, .coverBarMed, .coverBarLo { left: 1px; top: 1px; height: 14px; }
.coverBarHi  { background-color: #A7FC9D; }
.coverBarMed { background-color: #FFEA20; }
.coverBarLo  { background-color: #FF0000; }


.coverNumHi, .coverNumMed, .coverNumLo {
	text-align:       right;
	padding-left:     10px;
	padding-right:    10px;
}
.coverNumHi  { /*background-color: #A7FC9D;*/ }
.coverNumMed { /*background-color: #FFEA20;*/ }
.coverNumLo  { background-color: #FF0000; }

.lineCov   { background-color: #F0F0F0; }
.lineNoCov { background-color: #ffe0e0; }
div.code {
	border: 1px solid gray;
	font-size: 12px;
}
pre.code {
	font-family: monospace;
	font-size: 12px;
	white-space: pre;
	padding: 0; margin: 0;
}

.error { color: red; }
PKq�\��hkk%xcache_3/coverager/config.default.phpnu�[���<?php

// [default config]
// DO NOT rename/delete/modify this file which will be overwritten when upgrade
// See config.example.php instead

// $config['include_paths'] = array();
// $config['exclude_paths'] = array();
$config['syntax_higlight'] = true;
$config['use_cache'] = false;
// $config['datadir'] is default to ini_get("xcache.coveragedump_directory")

PKq�\��xcache_3/coverager/index.phpnu�[���<?php

include "./common.php";

class XcacheCoverageViewer
{
	var $syntax_higlight = true;
	var $use_cache = false;
	var $include_paths = array();
	var $exclude_paths = array();
	var $charset = 'UTF-8';
	var $lang = 'en-us';
	var $datadir = null;
	var $datadir_len = null;
	var $path = null;
	var $outpath = null;

	function XcacheCoverageViewer()
	{
		$this->datadir = ini_get('xcache.coveragedump_directory');

		global $config;
		foreach (array('charset', 'include_paths', 'exclude_paths', 'syntax_higlight', 'use_cache', 'datadir', 'lang') as $k) {
			if (isset($config[$k])) {
				$this->{$k} = $config[$k];
			}
		}

		$this->datadir = preg_replace('!/$!', '', $this->datadir);
		$this->datadir_len = strlen($this->datadir);

		$this->path = isset($_GET['path']) ? $_GET['path'] : '';
		$this->path = preg_replace('!\.{2,}!', '.', $this->path);
		$qsep = preg_quote(DIRECTORY_SEPARATOR, '!');
		$this->path = preg_replace("![\\\\$qsep]{2,}!", DIRECTORY_SEPARATOR, $this->path);
		$this->path = preg_replace("!$qsep$!", '', $this->path);
		if ($this->path == '/') {
			$this->path = '';
		}
		$this->outpath = $this->datadir . $this->path;
	}

	function main()
	{
		$path = $this->path;

		if (is_dir($this->outpath)) {
			$action = 'dir';
			$prefix_len = strlen($path) + 1;
			$dirinfo = $this->loadDir($this->outpath);
			if (!$this->use_cache) {
				ksort($dirinfo['subdirs']);
				ksort($dirinfo['files']);
			}
		}
		else if (is_file($this->outpath . ".pcov")) {
			$action = 'file';

			$dir = dirname($path);
			$filename = basename($path);

			$fileinfo = $this->loadCov($this->outpath . ".pcov");

			$lines = file($path);
			// fix the tabs not in the middle
			foreach ($lines as $l => $line) {
				if (preg_match('!^(\\t*)([^\\t]+\\t.*)$!s', $line, $m)) {
					$lines[$l] = $m[1];
					$chunks = explode("\t", $m[2]);
					for ($i = 0, $c = count($chunks) - 1; $i < $c; $i ++) {
						$lines[$l] .= $chunks[$i] . str_repeat(" ", 4 - (strlen($chunks[$i]) % 4));
					}
					$lines[$l] .= $chunks[$c];
				}
			}
			if ($this->syntax_higlight) {
				$source = implode('', $lines);
				ob_start();
				highlight_string($source);
				$lines = str_replace("\n", "", ob_get_clean());
				$lines = str_replace('<code>', '', $lines);
				$lines = str_replace('</code>', '', $lines);
				$lines = preg_replace('(^<span[^>]*>|</span>$)', '', $lines);
				$lines = explode('<br />', $lines);
				$last = array_pop($lines);
				$lines[count($lines) - 1] .= $last;
				$filecov = sprint_cov($fileinfo['cov'], $lines, false);
				unset($source);
			}
			else {
				$filecov = sprint_cov($fileinfo['cov'], $lines);
			}

			list($tplfile, $tpllines, $tplcov) = $this->loadTplCov($fileinfo['cov'], substr($this->outpath, $this->datadir_len));
			if ($tplfile) {
				$tplcov = sprint_cov($tplcov, $tpllines);
				unset($tpllines);
			}
		}
		else if (!$this->datadir) {
			$action = 'error';
			$error  = 'require `xcache.coveragedump_directory` in ini or `$datadir` in config to be set';
		}
		else {
			$action = 'error';
			$error  = "no data";
		}

		global $config;
		include "coverager.tpl.php";
	}

	function loadDir($outdir, $addtodo = null)
	{
		if ($this->use_cache) {
			$cachefile = $outdir . "/.pcovcache";
			if (file_exists($cachefile)) {
				return unserialize(file_get_contents($cachefile));
			}
		}
		$srcdir = substr($outdir, $this->datadir_len);

		$total = $hits = $todos = 0;
		$files = array();
		$subdirs = array();
		if (!isset($addtodo)) {
			if ($this->include_paths) {
				foreach ($this->include_paths as $p) {
					if (strncmp($p, $srcdir, strlen($p)) == 0) {
						$addtodo = true;
						break;
					}
				}
			}
		}
		if ($addtodo) {
			if ($this->exclude_paths) {
				foreach ($this->exclude_paths as $p) {
					if (strncmp($p, $srcdir, strlen($p)) == 0) {
						$addtodo = false;
						break;
					}
				}
			}
		}
		foreach (glob($outdir . "/*") as $outfile) {
			if (is_dir($outfile)) {
				$info = $this->loadDir($outfile, $addtodo);
				$srcfile = substr($outfile, $this->datadir_len);
				$subdirs += $info['subdirs'];
				$total   += $info['total'];
				$hits    += $info['hits'];
				if ($addtodo === true) {
					$todos += $info['todos'];
				}
				unset($info['subdirs']);
				$subdirs[$srcfile] = $info;
			}
			else if (substr($outfile, -5) == ".pcov") {
				// pass
				$info = $this->loadFile($outfile);
				$total += $info['total'];
				$hits  += $info['hits'];
				$srcfile = substr($outfile, $this->datadir_len, -5);
				$files[$srcfile] = $info;
			}
			else {
				continue;
			}
		}
		if ($addtodo === true) {
			foreach (glob($srcdir . "/*") as $srcfile) {
				if (!isset($files[$srcfile]) && is_file($srcfile)) {
					$files[$srcfile] = array('total' => 0, 'hits' => 0);
					$todos ++;
				}
				else if (!isset($subdirs[$srcfile]) && is_dir($srcfile)) {
					$subdirs[$srcfile] = array('total' => 0, 'hits' => 0, 'todos' => 1, 'files' => 0, 'subdirs' => array());
					$todos ++;
				}
			}
		}

		if ($this->use_cache) {
			ksort($subdirs);
			ksort($files);
		}

		$info = array(
				'total'   => $total,
				'hits'    => $hits,
				'todos'   => $todos,
				'files'   => $files,
				'subdirs' => $subdirs,
				);

		if ($this->use_cache) {
			$fp = fopen($cachefile, "wb");
			fwrite($fp, serialize($info));
			fclose($fp);
		}
		return $info;
	}

	function loadFile($file)
	{
		if ($this->use_cache) {
			$cachefile = $file . "cache";
			if (file_exists($cachefile)) {
				return unserialize(file_get_contents($cachefile));
			}
		}

		$info = $this->loadCov($file); //, $lines);
		unset($info['cov']);

		if ($this->use_cache) {
			$fp = fopen($cachefile, "wb");
			fwrite($fp, serialize($info));
			fclose($fp);
		}
		return $info;
	}

	function loadCov($file)//, $lines)
	{
		$total = $hits = 0;

		$cov = xcache_coverager_decode(file_get_contents($file));

		return array('total' => count($cov) - 1, 'hits' => $cov[0], 'cov' => $cov);
	}

	function loadTplCov($cov, $ctpl)
	{
		$tplinfofile = $ctpl . '.phpinfo';

		if (!file_exists($tplinfofile)) {
			return;
		}

		$tplinfo = unserialize(file_get_contents($tplinfofile));

		if (!isset($tplinfo['sourceFile'])) {
			return;
		}
		$tplfile = $tplinfo['sourceFile'];
		if (!isset($tplinfo['lineMap']) || !count($tplinfo['lineMap'])) {
			return;
		}

		$tpllines = file($tplfile);

		$dline = 0;
		$sline = 0;
		$tplcov = array();
		foreach ($cov as $line => $times) {
			// find nearest line
			while ($dline < $line) {
				if ((list($dline, $sline) = each($tplinfo['lineMap'])) === false) {
					break 2;
				}
			}

			$tplcov[$sline] = $times;
		}
		return array($tplfile, $tpllines, $tplcov);
	}
}

function sprint_cov($cov, $lines, $encode = true)
{
	$lastattr = null;
	foreach ($lines as $l => $line) {
		$offs = $l + 1;
		if ($encode) {
			$line = str_replace("\n", "", htmlspecialchars($line));
		}
		else if ($line !== "") {
			if (substr($line, 0, 7) == '</span>') {
				$lastattr = null;
				$line = substr($line, 7);
			}
			else if (isset($lastattr)) {
				$line = $lastattr . $line;
			}

			if (preg_match('!(<span[^>]+>|</span>)[^<>]*$!', $line, $m)) {
				if ($m[1] == '</span>') {
					$lastattr = null;
				}
				else {
					$line .= '</span>';
					$lastattr = $m[1];
				}
			}
		}
		if (isset($cov[$offs])) {
			$lines[$l] = sprintf("<li class=\"line%sCov\"><pre class=\"code\"> %s\t%s\n</pre></li>"
					, $cov[$offs] ? '' : 'No'
					, $cov[$offs]
					, $line);
		}
		else {
			$lines[$l] = "<li><pre class=\"code\">\t$line\n</pre></li>";
		}
	}
	return implode('', $lines);
}

if (!function_exists('xcache_coverager_decode')) {
	function xcache_coverager_decode($bytes)
	{
		$bytes = unpack('l*', $bytes);
		$i = 1;
		if ($bytes[$i ++] != 0x564f4350) {
			return null;
		}
		$end = count($bytes);
		$cov = array();
		for (/* empty*/; $i <= $end; $i += 2) {
			$hits = $bytes[$i + 1];
			$cov[$bytes[$i]] = $hits <= 0 ? 0 : $hits;
		}
		return $cov;
	}
}

$app = new XcacheCoverageViewer();
$app->main();

?>
PKq�\���jjxcache_3/coverager/common.phpnu�[���<?php

require_once "../common/common.php";

include get_language_file("./lang");
$module = "coverager";

PKq�\�詷��$xcache_3/coverager/coverager.tpl.phpnu�[���<?php include "../common/header.tpl.php"; ?>

<?php
function calc_percent($info, &$percent, &$class)
{
	if (!$info['total']) {
		$percent = 0;
	}
	else {
		$percent = (int) ($info['hits'] / $info['total'] * 100);
	}
	if ($percent < 15) {
		$class = "Lo";
	}
	else if ($percent < 50) {
		$class = "Med";
	}
	else {
		$class = "Hi";
	}
}

function bar($percent, $class)
{
	return <<<EOS
	<div class="coverBarOutline">
		<div class="coverBar{$class}" style="width:{$percent}%"></div>
		<div class="coverPer{$class}">{$percent}</div>
	</div>
EOS;
}

function dir_head()
{
	global $cycle;
	$cycle = new Cycle('class="col1"', 'class="col2"');
	$l_dir = _T("Directory");
	$l_per = _T("Percent");
	$l_hit = _T("Hits");
	$l_lns = _T("Lines");
	$l_tds = _T("TODO");
	return <<<EOS
<table cellpadding="2" cellspacing="0" border="0" class="cycles">
	<tr>
		<th>{$l_dir}</th><th>{$l_per}</th><th>{$l_hit}</th><th>{$l_lns}</th><th>{$l_tds}</th>
	</tr>
EOS;
}

function dir_row($info, $srcdir)
{
	global $cycle;
	if ($info['files'] || $info['todos']) {
		$srcdir .= DIRECTORY_SEPARATOR;
		$c = $cycle->next();
		$srcdir_html = htmlspecialchars($srcdir);
		$todos = number_format($info['todos']);
		if ($info['total']) {
			$srcdir_url = urlencode($srcdir);
			$hits  = number_format($info['hits']);
			$total = number_format($info['total']);
			calc_percent($info, $percent, $class);
			$bar = bar($percent, $class);
			return <<<EOS
			<tr $c>
				<td class="coverFile"><a href="?path={$srcdir_url}">{$srcdir_html}</a></td>
				<td class="coverBar">$bar</td>
				<td class="coverNum{$class}">{$hits}</td>
				<td class="coverNum{$class}">{$total}</td>
				<td class="coverNum{$class}">{$todos}</td>
			</tr>
EOS;
		}
		else {
			return <<<EOS
			<tr $c>
				<td class="coverFile">{$srcdir_html}</td>
				<td class="coverBar"></td>
				<td class="coverNumLo"></td>
				<td class="coverNumLo"></td>
				<td class="coverNumLo">{$todos}</td>
			</tr>
EOS;
		}
	}
}

function dir_foot()
{
	return <<<EOS
</table>
EOS;
}

function file_head()
{
	global $cycle;
	$cycle = new Cycle('class="col1"', 'class="col2"');
	$l_fil = _T("File");
	$l_per = _T("Percent");
	$l_hit = _T("Hits");
	$l_lns = _T("Lines");
	return <<<EOS
<table cellpadding="2" cellspacing="0" border="0" class="cycles">
	<tr>
		<th>{$l_fil}</th><th>{$l_per}</th><th>{$l_hit}</th><th>{$l_lns}</th>
	</tr>
EOS;
}

function file_row($info, $srcfile)
{
	global $cycle;

	$c = $cycle->next();
	$srcfile_html = htmlspecialchars($srcfile);
	$total = number_format($info['total']);
	if ($info['total']) {
		$hits = number_format($info['hits']);
		$srcfile_url = urlencode($srcfile);
		calc_percent($info, $percent, $class);
		$bar = bar($percent, $class);
		return <<<EOS
			<tr $c>
					<td class="coverFile"><a href="?path={$srcfile_url}">{$srcfile_html}</a></td>
					<td class="coverBar">$bar</td>
					<td class="coverNum{$class}">{$hits}</td>
					<td class="coverNum{$class}">{$total}</td>
			</tr>
EOS;
	}
	else {
		return <<<EOS
			<tr $c>
					<td class="coverFile">{$srcfile_html}</a></td>
					<td class="coverBar"></td>
					<td class="coverNumLo"></td>
					<td class="coverNumLo">{$total}</td>
			</tr>
EOS;
	}
}

function file_foot()
{
	return <<<EOS
</table>
EOS;
}

$l_root = _T("root");
if ($action == 'dir') {
	if (function_exists('ob_filter_path_nicer')) {
		ob_start('ob_filter_path_nicer');
	}
	$path_html = htmlspecialchars($path);
	echo <<<EOS
	<div>
		<a href="?">$l_root</a> $path<br />
	</div>
EOS;
	echo dir_head($dirinfo);
	echo dir_row($dirinfo, $path);
	echo dir_foot($dirinfo);
	if ($dirinfo['subdirs']) {
		echo dir_head();
		foreach ($dirinfo['subdirs'] as $srcdir => $info) {
			echo dir_row($info, $srcdir);
		}
		echo dir_foot();
	}
	if ($dirinfo['files']) {
		echo file_head();
		foreach ($dirinfo['files'] as $srcfile => $info) {
			echo file_row($info, $srcfile);
		}
		echo file_foot();
	}
}
else if ($action == 'file') {
	if (function_exists('ob_filter_path_nicer')) {
		ob_start('ob_filter_path_nicer');
	}
	$dir_url = urlencode($dir);
	$dir_html = htmlspecialchars($dir);
	echo <<<EOS
	<div>
		<a href="?">$l_root</a> <a href="?path={$dir_url}">{$dir_html}</a>/<strong>{$filename}</strong><br />
	</div>
EOS;

	echo file_head();
	echo file_row($fileinfo, $path);
	echo file_foot();

	if ($tplfile) {
		$tplfile_html = htmlspecialchars($tplfile);
		echo <<<EOS
		<div>
			<a href="#tpl">{$tplfile_html}</a><br />
		</div>
EOS;
	}
	if (function_exists('ob_filter_path_nicer')) {
		ob_end_flush();
	}
	echo <<<EOS
	<div class="code">
		<ol>{$filecov}</ol>
	</div>
EOS;
	if ($tplfile) {
		echo <<<EOS
	<a name="tpl">{$tplfile}</a>
	<div class="code">
		<ol>{$tplcov}</ol>
	</div>
EOS;
	}
}
else {
	$error_html = htmlspecialchars($error);
	echo <<<EOS
	<span class="error">{$error_html}</span>
EOS;
}
?>

<?php include "../common/footer.tpl.php"; ?>

PKq�\���k��xcache_3/config.default.phpnu�[���<?php

// [default config]
// DO NOT rename/delete/modify this file which will be overwritten when upgrade
// See config.example.php instead

// detected by browser
// $config['lang'] = 'en-us';

$config['charset'] = "UTF-8";

// translators only
$config['show_todo_strings'] = false;

// this ob filter function is applied for the list with paths, not the whole page
$config['path_nicer'] = 'ob_filter_path_nicer_default';

PKq�\�l���#xcache_3/cacher/sub/summary.tpl.phpnu�[���<?php $cycleClass = new Cycle('class="col1"', 'class="col2"'); ?>
<table cellspacing="0" cellpadding="4" class="cycles caches">
	<caption><?php echo _T('Caches'); ?></caption>
	<tr>
	<?php echo
		th(N_("cache.cache"))
		, th(N_("cache.slots"))
		, th(N_("cache.size"))
		, th(N_("cache.avail"))
		, th(N_("cache.blocksgraph"))
		, th(N_("cache.operations"))
		, th(N_("cache.status"))
		, th(N_("cache.hits"))
		, th(N_("cache.hits_graph"))
		, th(N_("cache.hits_avg_h"))
		, th(N_("cache.hits_avg_s"))
		, th(N_("cache.updates"))
		, th(N_("cache.skips"))
		, th(N_("cache.ooms"))
		, th(N_("cache.errors"))
		, th(N_("cache.readonly_protected"))
		, th(N_("cache.cached"))
		, th(N_("cache.deleted"))
		, th(N_("cache.gc_timer"))
		;
	?>
	</tr>
	<?php
	$numkeys = explode(',', 'slots,size,avail,hits,updates,skips,ooms,errors,cached,deleted');
	$l_clear = _T('Clear');
	$l_disabled = _T('Disabled');
	$l_disable = _T('Disable');
	$l_enable = _T('Enable');
	$l_compiling = _T('Compiling');
	$l_normal = _T('Normal');
	$l_confirm = _T('Sure?');
	foreach (getCacheInfos() as $i => $ci) {
		$class = $cycleClass->next();
		echo <<<TR
	<tr {$class}>

TR;
		$pvalue = (int) ($ci['avail'] / $ci['size'] * 100);
		$pempty = 100 - $pvalue;
		if ($config['percent_graph_type'] == 'used') {
			// swap
			$tmp = $pvalue;
			$pvalue = $pempty;
			$pempty = $tmp;
		}

		$w = $config['percent_graph_width'] + 2;
		if (empty($ci['istotal'])) {
			$graph = freeblock_to_graph($ci['free_blocks'], $ci['size']);
			$blocksgraph = "<div class=\"blocksgraph\" style=\"width: {$w}px\">{$graph}</div>";
		}
		else {
			$blocksgraph = '';
		}

		$ci_slots = size($ci['slots']);
		$ci_size  = size($ci['size']);
		$ci_avail = size($ci['avail']);
		$ci = number_formats($ci, $numkeys);

		$hits_avg_h     = number_format(array_avg($ci['hits_by_hour']), 2);
		$hits_avg_s     = number_format(array_avg($ci['hits_by_second']), 2);
		$hits_graph_h   = get_cache_hits_graph($ci, 'hits_by_hour');

		if (!empty($ci['istotal'])) {
			$ci['status']       = '-';
			$ci['can_readonly'] = '-';
		}
		else {
			if ($ci['disabled']) {
				$ci['status'] = $l_disabled
					. sprintf("(%s)", age($ci['disabled']));
			}
			else if ($ci['type'] == XC_TYPE_PHP) {
				$ci['status'] = $ci['compiling']
					? $l_compiling . sprintf("(%s)", age($ci['compiling']))
					: $l_normal;
			}
			else {
				$ci['status'] = '-';
			}
			$ci['can_readonly'] = $ci['can_readonly'] ? 'yes' : 'no';
		}
		$enabledisable = $ci['disabled'] ? 'enable' : 'disable';
		$l_enabledisable = $ci['disabled'] ? $l_enable : $l_disable;
		echo <<<EOS
		<th>{$ci['cache_name']}</th>
		<td align="right" title="{$ci['slots']}">{$ci_slots}</td>
		<td align="right" title="{$ci['size']}">{$ci_size}</td>
		<td align="right" title="{$ci['avail']}">{$ci_avail}</td>
		<td title="{$pvalue} %"
			><div class="percent" style="width: {$w}px"
				><div style="width: {$pvalue}%" class="pvalue"></div
				><div style="width: {$pempty}%" class="pempty"></div
			></div
		>{$blocksgraph}</td>
		<td
			><form method="post" action=""
				><div
					><input type="hidden" name="type" value="{$ci['type']}"
					/><input type="hidden" name="cacheid" value="{$ci['cacheid']}"
					/><input type="submit" name="clearcache" value="{$l_clear}" class="submit" onclick="return confirm('{$l_confirm}');"
					/><input type="submit" name="{$enabledisable}" value="{$l_enabledisable}" class="submit"
				/></div
			></form
		></td>
		<td>{$ci['status']}</td>
		<td align="right">{$ci['hits']}</td>
		<td>{$hits_graph_h}</td>
		<td align="right">{$hits_avg_h}</td>
		<td align="right">{$hits_avg_s}</td>
		<td align="right">{$ci['updates']}</td>
		<td align="right">{$ci['skips']}</td>
		<td align="right">{$ci['ooms']}</td>
		<td align="right">{$ci['errors']}</td>
		<td>{$ci['can_readonly']}</td>
		<td align="right">{$ci['cached']}</td>
		<td align="right">{$ci['deleted']}</td>
		<td align="right">{$ci['gc']}</td>

EOS;
		?>
	</tr>
<?php } ?>
</table>
<div class="blockarea legends">
	<div class="legendtitle"><?php echo _T('Legends:'); ?></div>
	<div class="legend pvalue">&nbsp;&nbsp;</div>
	<div class="legendtitle"><?php echo $config['percent_graph_type'] == 'free' ? _T('% Free') : _T('% Used'); ?></div>
	<div class="legend" style="background: rgb(0,0,255)">&nbsp;&nbsp;</div>
	<div class="legendtitle"><?php echo $config['percent_graph_type'] == 'free' ? _T('Free Blocks') : _T('Used Blocks'); ?></div>
	<div class="legend" style="background: rgb(255,0,0)">&nbsp;&nbsp;</div>
	<div class="legendtitle"><?php echo _T('Hits'); ?></div>
</div>
<?php unset($cycleClass); ?>
PKq�\�Al�
�
%xcache_3/cacher/sub/entrylist.tpl.phpnu�[���<?php $cycleClass = new Cycle('class="col1"', 'class="col2"'); ?>
<form action="" method="post">
	<table cellspacing="0" cellpadding="4" class="cycles entries">
		<caption><?php echo $caption; ?></caption>
<?php

echo <<<TR
		<tr>

TR;

if ($isphp) {
	echo
		th(N_("entry.id"))
		;
}
else {
	echo
		th(N_("entry.remove"))
		;
}

echo
	th(N_("entry.name"))
	, th(N_("entry.hits"))
	, th(N_("entry.size"))
	;

if ($isphp) {
	echo
		th(N_("entry.refcount"))
		, th(N_("entry.phprefcount"))
		, th(N_("entry.class_cnt"))
		, th(N_("entry.function_cnt"))
		, th(N_("entry.file_size"))
		, th(N_("entry.file_mtime"))
		;
	echo
		th(N_("entry.file_device"))
		, th(N_("entry.file_inode"))
		;
}
echo
	th(N_("entry.hash"))
	, th(N_("entry.atime"))
	, th(N_("entry.ctime"))
	;

if ($listName == 'Deleted') {
	echo
		th(N_("entry.delete"))
		;
}
?>
		</tr>
<?php
foreach ($entries as $i => $entry) {
	$class = $cycleClass->next();
	echo <<<TR
		<tr $class>

TR;
	$hits     = number_format($entry['hits']);
	$size     = size($entry['size']);
	if ($isphp) {
		$class_cnt    = number_format($entry['class_cnt']);
		$function_cnt = number_format($entry['function_cnt']);
		$phprefcount  = number_format($entry['phprefcount']);
		$file_size    = size($entry['file_size']);
	}

	if ($isphp) {
		$file_mtime = age($entry['file_mtime']);
	}
	$ctime = age($entry['ctime']);
	$atime = age($entry['atime']);
	if ($listName == 'Deleted') {
		$dtime = age($entry['dtime']);
	}

	if ($isphp) {
		$hname = htmlspecialchars($entry['name']);
		$namelink = $hname;
		echo <<<ENTRY
			<td>{$entry['cache_name']} {$i}</td>

ENTRY;
	}
	else {
		$name = $entry['name'];
		if (!empty($config['enable_eval'])) {
			$name = var_export($name, true);
		}
		$uname = urlencode($name);
		$hname = htmlspecialchars(str_replace("\0", "\\0", $entry['name']));
		echo <<<ENTRY
			<td><label><input type="checkbox" name="remove[]" value="{$hname}"/>{$entry['cache_name']} {$i}</label></td>

ENTRY;
		$namelink = "<a href=\"edit.php?name=$uname\">$hname</a>";
	}

	echo <<<ENTRY
			<td>{$namelink}</td>
			<td align="right" int="{$entry['hits']}">{$entry['hits']}</td>
			<td align="right" int="{$entry['size']}">{$size}</td>

ENTRY;
	if ($isphp) {
		$refcount = number_format($entry['refcount']);
		echo <<<ENTRY
			<td align="right" int="{$entry['refcount']}">{$entry['refcount']}</td>
			<td align="right" int="{$entry['phprefcount']}">{$phprefcount}</td>
			<td align="right" int="{$entry['class_cnt']}">{$class_cnt}</td>
			<td align="right" int="{$entry['function_cnt']}">{$function_cnt}</td>
			<td align="right" int="{$entry['file_size']}">{$file_size}</td>
			<td align="right" int="{$entry['file_mtime']}">{$file_mtime}</td>

ENTRY;
		if (isset($entry['file_inode'])) {
			echo <<<ENTRY
			<td align="right" int="{$entry['file_device']}">{$entry['file_device']}</td>
			<td align="right" int="{$entry['file_inode']}">{$entry['file_inode']}</td>

ENTRY;
		}
	}
	echo <<<ENTRY
			<td align="right" int="{$entry['hvalue']}">{$entry['hvalue']}</td>
			<td align="right" int="{$entry['atime']}">{$atime}</td>
			<td align="right" int="{$entry['ctime']}">{$ctime}</td>

ENTRY;
	if ($listName == 'Deleted') {
		echo <<<ENTRY
			<td align="right" int="{$entry['dtime']}">{$dtime}</td>

ENTRY;
	}

	echo <<<TR
		</tr>

TR;
}
?>
	</table>
<?php if (!$isphp && $listName != 'Deleted') { ?>
	<input type="submit" value="<?php echo _T("Remove Selected"); ?>">
<?php } ?>
</form>
<?php
unset($cycleClass);
?>
PKq�\"��ּ�(xcache_3/cacher/sub/testcoredump.tpl.phpnu�[���<form method="post" action=""
	><div
		><input type="submit" name="coredump" value="Test coredump" class="submit" onclick="return confirm('<?php echo _T('Sure?'); ?>');"
	/></div
></form>
PKq�\��Tdd&xcache_3/cacher/sub/moduleinfo.tpl.phpnu�[���<h2><?php echo _T("Module Info"); ?></h2>
<div class="phpinfo"><?php echo getModuleInfo(); ?></div>
PKq�\��Gҵ�xcache_3/cacher/cacher.cssnu�[���td, th { white-space: pre; }

.percent { height: 3px; margin-bottom: 1px; border: 1px solid gray; }
.percent div { float: left; height: 100%; }
.pvalue { background: limegreen; }

.blocksgraph { height: 13px; }
.blocksgraph div { float: left; height: 3px; width: 4px; border: 0 solid gray; border-width: 0 0 1px 0; }
.blocksgraph { border: 1px solid gray; border-bottom: 0; }
.percent *, .blocksgraph *, .hitsgraph * { font-size: 1px; line-height: 1px; }

.hitsgraph { margin: auto; }
.hitsgraph a { display: block; float: left; border: 0 solid gray; }
.hitsgraph a { width: 2px; height: 20px; border-top-width: 1px; border-bottom-width: 1px; } /* update this along with index.php */
.hitsgraph a * { display: block; }
.hitsgraph a.active { border-top-color: yellow; }
.hitsgraph a:hover { background: gray; }

dl { overflow: hidden; }
dt { font-weight: bold; clear: both; float: left; width: 100px; text-align: right; margin: 0; }
dd { margin: 0; }
.blockarea { overflow: hidden; width: 400px; }
.legends { padding-bottom: 8px; }
div.legend { float: left; border: 1px solid gray; font: 12px/12px monospace; }
div.legendtitle { float: left; padding: 2px; padding-right: 10px; font: 12px/12px monospace; }
PKq�\����&xcache_3/cacher/lang/zh-traditional.ponu�[���msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-08 14:41+0800\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: edit.tpl.php:8
#, php-format
msgid "Editing Variable %s"
msgstr "正在编辑变量 %s"

#: edit.tpl.php:13
#, php-format
msgid "Set %s in config to enable"
msgstr "請在配置文件中設置 %s 啟用本功能"

#: index.php:187 index.php:213
msgid "Total"
msgstr "总共"

#: index.php:263
msgid "Summary"
msgstr "簡要訊息"

#: index.php:264
msgid "List PHP"
msgstr "列出PHP"

#: index.php:265
msgid "List Var Data"
msgstr "列變數資料"

#: listentries.tpl.php:11
msgid "php Cached"
msgstr "快取的 PHP 指令"

#: listentries.tpl.php:11
msgid "var Cached"
msgstr "快取的變數"

#: listentries.tpl.php:15
msgid "php Deleted"
msgstr "待刪 PHP 指令快取"

#: listentries.tpl.php:15
msgid "var Deleted"
msgstr "待刪變數快取"

#: sub/entrylist.tpl.php:14
msgid "entry.id"
msgstr "Id|"

#: sub/entrylist.tpl.php:19
msgid "entry.remove"
msgstr "移除|"

#: sub/entrylist.tpl.php:24
msgid "entry.name"
msgstr "項目名稱/檔案名稱|項目名稱或者檔案名稱"

#: sub/entrylist.tpl.php:25
msgid "entry.hits"
msgstr "命中|該項目被命中的次數 (從共享記憶體區載入)"

#: sub/entrylist.tpl.php:26
msgid "entry.size"
msgstr "大小|項目在共享記憶體裡佔用位元數"

#: sub/entrylist.tpl.php:31
msgid "entry.refcount"
msgstr "引用數|項目依然被其他程序佔用的引用次數"

#: sub/entrylist.tpl.php:32
msgid "entry.phprefcount"
msgstr "共享|與本項目相同 PHP 內容的个數"

#: sub/entrylist.tpl.php:33
msgid "entry.class_cnt"
msgstr "类|类个数"

#: sub/entrylist.tpl.php:34
msgid "entry.function_cnt"
msgstr "函数|函数个数"

#: sub/entrylist.tpl.php:35
msgid "entry.file_size"
msgstr "源大小|原始檔案大小"

#: sub/entrylist.tpl.php:36
msgid "entry.file_mtime"
msgstr "修改|原始檔案最後修改時間"

#: sub/entrylist.tpl.php:39
msgid "entry.file_device"
msgstr "dev|原始檔案所在設備ID"

#: sub/entrylist.tpl.php:40
msgid "entry.file_inode"
msgstr "ino|原始檔案的inode"

#: sub/entrylist.tpl.php:44
msgid "entry.hash"
msgstr "Hash|Hash"

#: sub/entrylist.tpl.php:45
msgid "entry.atime"
msgstr "存取|最後存取該項目的時間"

#: sub/entrylist.tpl.php:46
msgid "entry.ctime"
msgstr "建立|該項目被建立於共享內的時間"

#: sub/entrylist.tpl.php:51
msgid "entry.delete"
msgstr "移除|該項目被移除於共享內的時間"

#: sub/entrylist.tpl.php:149
msgid "Remove Selected"
msgstr "移除所选"

#: sub/moduleinfo.tpl.php:1
msgid "Module Info"
msgstr "組元訊息"

#: sub/summary.tpl.php:3
msgid "Caches"
msgstr "快取"

#: sub/summary.tpl.php:6
msgid "cache.cache"
msgstr "快取|"

#: sub/summary.tpl.php:7
msgid "cache.slots"
msgstr "槽|Hash 槽個數,對應 php.ini 裡的設置"

#: sub/summary.tpl.php:8
msgid "cache.size"
msgstr "大小|共享記憶體區大小,單位:位元"

#: sub/summary.tpl.php:9
msgid "cache.avail"
msgstr "剩餘|可用記憶體,對應共享記憶體區的剩餘記憶體位元數"

#: sub/summary.tpl.php:10
msgid "cache.blocksgraph"
msgstr "百分比图|條狀顯示可用記憶體的比例"

#: sub/summary.tpl.php:11
msgid "cache.operations"
msgstr "操作|點擊按鈕清除對應共享記憶體區的資料"

#: sub/summary.tpl.php:12
msgid "cache.status"
msgstr ""
"狀態|狀態標記. 當共享內存區正在編譯 PHP 腳本時標記為 \"編譯中\". 當共享內存區"
"暫停使用時標記為 \"禁用\""

#: sub/summary.tpl.php:13
msgid "cache.hits"
msgstr "命中|共享記憶體命中次數,命中=從該共享記憶體載入 PHP 或者變數"

#: sub/summary.tpl.php:14
msgid "cache.hits_graph"
msgstr "24H 分布|24 小时命中分布图. 图表现是最后 24 小时的命中次数"

#: sub/summary.tpl.php:15
msgid "cache.hits_avg_h"
msgstr "命中/H|每小时命中次数. 只统计最后 24 小时"

#: sub/summary.tpl.php:16
msgid "cache.hits_avg_s"
msgstr "命中/S|每秒命中次数. 只统计最后 5 秒"

#: sub/summary.tpl.php:17
msgid "cache.updates"
msgstr "更新|共享記憶更新過次數"

#: sub/summary.tpl.php:18
msgid "cache.skips"
msgstr ""
"跳過|跳過更新次數,跳過=XCache 自動判斷阻塞的共享記憶體區自動跳過阻塞等待,直"
"接使用编译不存储方式繼續處理請求"

#: sub/summary.tpl.php:19
msgid "cache.ooms"
msgstr ""
"記憶體不足|記憶體不足次數,顯示需要儲存新資料但是共享記憶體區記憶體不足的次"
"數. 如果出現太頻繁請考慮加大配置中的 xcache.size 或者 xcache.var_size"

#: sub/summary.tpl.php:20
msgid "cache.errors"
msgstr ""
"错误|编译错误, 显示您的脚本被编译时出错的次数. 如果您发现这个数字不断增长, 您"
"应该检查什么脚本产生错误. 参考 說明 获取更多信息"

#: sub/summary.tpl.php:21
msgid "cache.readonly_protected"
msgstr "保护|顯示該 Cache 是否支援並啟用 readonly_protection. 参考 說明"

#: sub/summary.tpl.php:22
msgid "cache.cached"
msgstr "快取|共享記憶體於該共享記憶體區的項目個數"

#: sub/summary.tpl.php:23
msgid "cache.deleted"
msgstr "待刪|共享記憶體區內將要刪除的項目 (已經刪除但是還被某些程序佔用)"

#: sub/summary.tpl.php:24
msgid "cache.gc_timer"
msgstr "GC|垃圾回收的倒數計時"

#: sub/summary.tpl.php:30
msgid "Clear"
msgstr "清除"

#: sub/summary.tpl.php:31
msgid "Disabled"
msgstr "禁用"

#: sub/summary.tpl.php:32
msgid "Disable"
msgstr "禁用"

#: sub/summary.tpl.php:33
msgid "Enable"
msgstr "啟用"

#: sub/summary.tpl.php:34
msgid "Compiling"
msgstr "編譯中"

#: sub/summary.tpl.php:35
msgid "Normal"
msgstr "正常"

#: sub/summary.tpl.php:36 sub/testcoredump.tpl.php:3
msgid "Sure?"
msgstr "確認?"

#: sub/summary.tpl.php:132
msgid "Legends:"
msgstr "图例:"

#: sub/summary.tpl.php:134
msgid "% Free"
msgstr "% 剩余"

#: sub/summary.tpl.php:134
msgid "% Used"
msgstr "% 已用"

#: sub/summary.tpl.php:136
msgid "Free Blocks"
msgstr "未用块"

#: sub/summary.tpl.php:136
msgid "Used Blocks"
msgstr "已用块"

#: sub/summary.tpl.php:138
msgid "Hits"
msgstr "命中"
PKq�\V^��'xcache_3/cacher/lang/zh-traditional.phpnu�[���<?php
// auto generated, do not modify
$strings += array(
		"Editing Variable %s"
		=> "正在编辑变量 %s",
		"Set %s in config to enable"
		=> "請在配置文件中設置 %s 啟用本功能",
		"Total"
		=> "总共",
		"Summary"
		=> "簡要訊息",
		"List PHP"
		=> "列出PHP",
		"List Var Data"
		=> "列變數資料",
		"php Cached"
		=> "快取的 PHP 指令",
		"var Cached"
		=> "快取的變數",
		"php Deleted"
		=> "待刪 PHP 指令快取",
		"var Deleted"
		=> "待刪變數快取",
		"entry.id"
		=> "Id|",
		"entry.remove"
		=> "移除|",
		"entry.name"
		=> "項目名稱/檔案名稱|項目名稱或者檔案名稱",
		"entry.hits"
		=> "命中|該項目被命中的次數 (從共享記憶體區載入)",
		"entry.size"
		=> "大小|項目在共享記憶體裡佔用位元數",
		"entry.refcount"
		=> "引用數|項目依然被其他程序佔用的引用次數",
		"entry.phprefcount"
		=> "共享|與本項目相同 PHP 內容的个數",
		"entry.class_cnt"
		=> "类|类个数",
		"entry.function_cnt"
		=> "函数|函数个数",
		"entry.file_size"
		=> "源大小|原始檔案大小",
		"entry.file_mtime"
		=> "修改|原始檔案最後修改時間",
		"entry.file_device"
		=> "dev|原始檔案所在設備ID",
		"entry.file_inode"
		=> "ino|原始檔案的inode",
		"entry.hash"
		=> "Hash|Hash",
		"entry.atime"
		=> "存取|最後存取該項目的時間",
		"entry.ctime"
		=> "建立|該項目被建立於共享內的時間",
		"entry.delete"
		=> "移除|該項目被移除於共享內的時間",
		"Remove Selected"
		=> "移除所选",
		"Module Info"
		=> "組元訊息",
		"Caches"
		=> "快取",
		"cache.cache"
		=> "快取|",
		"cache.slots"
		=> "槽|Hash 槽個數,對應 php.ini 裡的設置",
		"cache.size"
		=> "大小|共享記憶體區大小,單位:位元",
		"cache.avail"
		=> "剩餘|可用記憶體,對應共享記憶體區的剩餘記憶體位元數",
		"cache.blocksgraph"
		=> "百分比图|條狀顯示可用記憶體的比例",
		"cache.operations"
		=> "操作|點擊按鈕清除對應共享記憶體區的資料",
		"cache.status"
		=> "狀態|狀態標記. 當共享內存區正在編譯 PHP 腳本時標記為 \"編譯中\". 當共享內存區暫停使用時標記為 \"禁用\"",
		"cache.hits"
		=> "命中|共享記憶體命中次數,命中=從該共享記憶體載入 PHP 或者變數",
		"cache.hits_graph"
		=> "24H 分布|24 小时命中分布图. 图表现是最后 24 小时的命中次数",
		"cache.hits_avg_h"
		=> "命中/H|每小时命中次数. 只统计最后 24 小时",
		"cache.hits_avg_s"
		=> "命中/S|每秒命中次数. 只统计最后 5 秒",
		"cache.updates"
		=> "更新|共享記憶更新過次數",
		"cache.skips"
		=> "跳過|跳過更新次數,跳過=XCache 自動判斷阻塞的共享記憶體區自動跳過阻塞等待,直接使用编译不存储方式繼續處理請求",
		"cache.ooms"
		=> "記憶體不足|記憶體不足次數,顯示需要儲存新資料但是共享記憶體區記憶體不足的次數. 如果出現太頻繁請考慮加大配置中的 xcache.size 或者 xcache.var_size",
		"cache.errors"
		=> "错误|编译错误, 显示您的脚本被编译时出错的次数. 如果您发现这个数字不断增长, 您应该检查什么脚本产生错误. 参考 說明 获取更多信息",
		"cache.readonly_protected"
		=> "保护|顯示該 Cache 是否支援並啟用 readonly_protection. 参考 說明",
		"cache.cached"
		=> "快取|共享記憶體於該共享記憶體區的項目個數",
		"cache.deleted"
		=> "待刪|共享記憶體區內將要刪除的項目 (已經刪除但是還被某些程序佔用)",
		"cache.gc_timer"
		=> "GC|垃圾回收的倒數計時",
		"Clear"
		=> "清除",
		"Disabled"
		=> "禁用",
		"Disable"
		=> "禁用",
		"Enable"
		=> "啟用",
		"Compiling"
		=> "編譯中",
		"Normal"
		=> "正常",
		"Sure?"
		=> "確認?",
		"Legends:"
		=> "图例:",
		"% Free"
		=> "% 剩余",
		"% Used"
		=> "% 已用",
		"Free Blocks"
		=> "未用块",
		"Used Blocks"
		=> "已用块",
		"Hits"
		=> "命中",
		);

PKq�\o��ǃ�&xcache_3/cacher/lang/zh-simplified.phpnu�[���<?php
// auto generated, do not modify
$strings += array(
		"Editing Variable %s"
		=> "正在编辑变量 %s",
		"Set %s in config to enable"
		=> "请在配置文件中设置 %s 启用本功能",
		"Total"
		=> "总共",
		"Summary"
		=> "摘要信息",
		"List PHP"
		=> "列出PHP",
		"List Var Data"
		=> "列变量数据",
		"php Cached"
		=> "缓存的 PHP 脚本",
		"var Cached"
		=> "缓存的变量",
		"php Deleted"
		=> "待删 PHP 脚本缓存",
		"var Deleted"
		=> "待删变量缓存",
		"entry.id"
		=> "Id|",
		"entry.remove"
		=> "删除|",
		"entry.name"
		=> "项目名/文件名|项目名或者文件名",
		"entry.hits"
		=> "命中|该项目被命中的次数 (从缓存区载入)",
		"entry.size"
		=> "大小|项目在缓存里占用字节数",
		"entry.refcount"
		=> "引用数|项目依然被其他进程占据的引用次数",
		"entry.phprefcount"
		=> "共享数|与本项目相同 PHP 代码的个数",
		"entry.class_cnt"
		=> "类|类个数",
		"entry.function_cnt"
		=> "函数|函数个数",
		"entry.file_size"
		=> "源大小|源文件大小",
		"entry.file_mtime"
		=> "修改|源文件最后修改时间",
		"entry.file_device"
		=> "dev|源文件所在设备ID",
		"entry.file_inode"
		=> "ino|源文件的 inode",
		"entry.hash"
		=> "哈希|该项目的哈希值",
		"entry.atime"
		=> "访问|最后访问该项目的时间",
		"entry.ctime"
		=> "创建|该项目被创建于缓存区内的时间",
		"entry.delete"
		=> "删除|该项目被决定删除的时间",
		"Remove Selected"
		=> "删除所选",
		"Module Info"
		=> "模块信息",
		"Caches"
		=> "缓存区",
		"cache.cache"
		=> "缓存|",
		"cache.slots"
		=> "槽|Hash 槽个数, 对应 php.ini 里的设置",
		"cache.size"
		=> "大小|共享内存区大小, 单位: 字节",
		"cache.avail"
		=> "剩余|可用内存, 对应缓存区的剩余内存字节数",
		"cache.blocksgraph"
		=> "百分比图|条状显示可用内存的比例, 以及显示分配块状态",
		"cache.operations"
		=> "操作|点击按钮清除对应缓存区的数据",
		"cache.status"
		=> "状态|状态标记. 当缓存区正在编译 PHP 脚本时标记为 \"编译中\". 当缓存区暂停使用时标记为 \"禁用\"",
		"cache.hits"
		=> "命中|缓存命中次数, 命中=从该缓存载入 PHP 或者变量",
		"cache.hits_graph"
		=> "24H 分布|24 小时命中分布图. 图表现是最后 24 小时的命中次数",
		"cache.hits_avg_h"
		=> "命中/H|每小时命中次数. 只统计最后 24 小时",
		"cache.hits_avg_s"
		=> "命中/S|每秒命中次数. 只统计最后 5 秒",
		"cache.updates"
		=> "更新|缓存更新次数",
		"cache.skips"
		=> "跳过|跳过更新次数, 跳过=XCache 自动判断阻塞的缓存区自动跳过阻塞等待, 直接使用编译不缓存方式继续处理请求",
		"cache.ooms"
		=> "内存不足|内存不足次数, 显示需要存储新数据但是缓存区内存不足的次数. 如果出现太频繁请考虑加大配置中的 xcache.size 或者 xcache.var_size",
		"cache.errors"
		=> "错误|编译错误, 显示您的脚本被编译时出错的次数. 如果您发现这个数字不断增长, 您应该检查什么脚本产生错误. 参考 帮助 获取更多信息",
		"cache.readonly_protected"
		=> "保护|显示该 Cache 是否支持并启用 readonly_protection. 参考 帮助 获取更多信息",
		"cache.cached"
		=> "缓存|缓存于该缓存区的项目条数",
		"cache.deleted"
		=> "待删|缓存区内将要删除的项目 (已经删除但是还被某些进程占用)",
		"cache.gc_timer"
		=> "GC|垃圾回收的倒计时",
		"Clear"
		=> "清除",
		"Disabled"
		=> "禁用",
		"Disable"
		=> "禁用",
		"Enable"
		=> "启用",
		"Compiling"
		=> "编译中",
		"Normal"
		=> "正常",
		"Sure?"
		=> "确认?",
		"Legends:"
		=> "图例:",
		"% Free"
		=> "% 剩余",
		"% Used"
		=> "% 已用",
		"Free Blocks"
		=> "未用块",
		"Used Blocks"
		=> "已用块",
		"Hits"
		=> "命中",
		);

PKq�\4�Z���xcache_3/cacher/lang/en.phpnu�[���<?php
// auto generated, do not modify
$strings += array(
		"php Cached"
		=> "PHP Cached",
		"var Cached"
		=> "Variable Cached",
		"php Deleted"
		=> "PHP Deleted",
		"var Deleted"
		=> "Variable Deleted",
		"entry.id"
		=> "Id|",
		"entry.remove"
		=> "Remove|",
		"entry.name"
		=> "Entry name|The entry name or filename",
		"entry.hits"
		=> "Hits|Hit times of this entry (loaded from this cache)",
		"entry.size"
		=> "Size|Size in bytes of this entry in the cache",
		"entry.refcount"
		=> "Refs|Reference count of this entry is holded by a php request",
		"entry.phprefcount"
		=> "Shares|Count of entry sharing this php data",
		"entry.class_cnt"
		=> "Cls.|Count of classes",
		"entry.function_cnt"
		=> "Funcs|Count of functions",
		"entry.file_size"
		=> "Src Size|Size of the source file",
		"entry.file_mtime"
		=> "Modified|Last modified time of the source file",
		"entry.file_device"
		=> "dev|device number of the source file",
		"entry.file_inode"
		=> "ino|inode number of the source file",
		"entry.hash"
		=> "Hash|Hash value of this entry",
		"entry.atime"
		=> "Access|Last time when this entry is accessed",
		"entry.ctime"
		=> "Create|The time when this entry is stored",
		"entry.delete"
		=> "Delete|The time when this entry is deleted",
		"Caches"
		=> "Caches",
		"cache.cache"
		=> "Cache|",
		"cache.slots"
		=> "Slots|Number of hash slots. the setting from your php.ini",
		"cache.size"
		=> "Size|Cache Size, Size of the cache (or cache chunk), in bytes",
		"cache.avail"
		=> "Avail|Available Memory, free memory in bytes of this cache",
		"cache.blocksgraph"
		=> "Percent Graph|Shows how much memory available in percent, and memory blocks status in graph",
		"cache.operations"
		=> "Operations|Press the clear button to clean this cache",
		"cache.status"
		=> "Status|Compiling flag, \"Compiling\" if the cache is busy compiling php script. \"Disabled\" if cache is disabled",
		"cache.hits"
		=> "Hits|Cache Hits, hit=a var/php is loaded from this cache",
		"cache.hits_graph"
		=> "Hits*24H|Hits graph of last 24 hours",
		"cache.hits_avg_h"
		=> "Hits/H|Average Hits per Hour. Only last 24 hours is logged",
		"cache.hits_avg_s"
		=> "Hits/S|Average Hits per Second. Only last 5 seconds is logged",
		"cache.updates"
		=> "Updates|Cache Updates",
		"cache.skips"
		=> "Skips|Skips. Skip=updates are needed but skipped for some reason. e.g.: other process/thread is busy compiling on this cache",
		"cache.ooms"
		=> "OOMs|Out Of Memory, how many times a new item should be stored but there isn't enough memory in the cache, think of increasing the xcache.size or xcache.var_size",
		"cache.errors"
		=> "Errs|Compiler errors, how many times your script(s) failed to be compiled by PHP. You should really check what is happening if you see this value increase. (See Help for more information)",
		"cache.readonly_protected"
		=> "Protected|Whether readonly_protection is available and enable on this cache (See help for more information)",
		"cache.cached"
		=> "Cached|Number of entries stored in this cache",
		"cache.deleted"
		=> "Deleted|Number of entries is pending in delete list (expired but referenced)",
		"cache.gc_timer"
		=> "GC|Seconds count down of Garbage Collection",
		);

PKq�\;��**%xcache_3/cacher/lang/zh-simplified.ponu�[���msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-08 14:41+0800\n"
"Language: zh\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: edit.tpl.php:8
#, php-format
msgid "Editing Variable %s"
msgstr "正在编辑变量 %s"

#: edit.tpl.php:13
#, php-format
msgid "Set %s in config to enable"
msgstr "请在配置文件中设置 %s 启用本功能"

#: index.php:187 index.php:213
msgid "Total"
msgstr "总共"

#: index.php:263
msgid "Summary"
msgstr "摘要信息"

#: index.php:264
msgid "List PHP"
msgstr "列出PHP"

#: index.php:265
msgid "List Var Data"
msgstr "列变量数据"

#: listentries.tpl.php:11
msgid "php Cached"
msgstr "缓存的 PHP 脚本"

#: listentries.tpl.php:11
msgid "var Cached"
msgstr "缓存的变量"

#: listentries.tpl.php:15
msgid "php Deleted"
msgstr "待删 PHP 脚本缓存"

#: listentries.tpl.php:15
msgid "var Deleted"
msgstr "待删变量缓存"

#: sub/entrylist.tpl.php:14
msgid "entry.id"
msgstr "Id|"

#: sub/entrylist.tpl.php:19
msgid "entry.remove"
msgstr "删除|"

#: sub/entrylist.tpl.php:24
msgid "entry.name"
msgstr "项目名/文件名|项目名或者文件名"

#: sub/entrylist.tpl.php:25
msgid "entry.hits"
msgstr "命中|该项目被命中的次数 (从缓存区载入)"

#: sub/entrylist.tpl.php:26
msgid "entry.size"
msgstr "大小|项目在缓存里占用字节数"

#: sub/entrylist.tpl.php:31
msgid "entry.refcount"
msgstr "引用数|项目依然被其他进程占据的引用次数"

#: sub/entrylist.tpl.php:32
msgid "entry.phprefcount"
msgstr "共享数|与本项目相同 PHP 代码的个数"

#: sub/entrylist.tpl.php:33
msgid "entry.class_cnt"
msgstr "类|类个数"

#: sub/entrylist.tpl.php:34
msgid "entry.function_cnt"
msgstr "函数|函数个数"

#: sub/entrylist.tpl.php:35
msgid "entry.file_size"
msgstr "源大小|源文件大小"

#: sub/entrylist.tpl.php:36
msgid "entry.file_mtime"
msgstr "修改|源文件最后修改时间"

#: sub/entrylist.tpl.php:39
msgid "entry.file_device"
msgstr "dev|源文件所在设备ID"

#: sub/entrylist.tpl.php:40
msgid "entry.file_inode"
msgstr "ino|源文件的 inode"

#: sub/entrylist.tpl.php:44
msgid "entry.hash"
msgstr "哈希|该项目的哈希值"

#: sub/entrylist.tpl.php:45
msgid "entry.atime"
msgstr "访问|最后访问该项目的时间"

#: sub/entrylist.tpl.php:46
msgid "entry.ctime"
msgstr "创建|该项目被创建于缓存区内的时间"

#: sub/entrylist.tpl.php:51
msgid "entry.delete"
msgstr "删除|该项目被决定删除的时间"

#: sub/entrylist.tpl.php:149
msgid "Remove Selected"
msgstr "删除所选"

#: sub/moduleinfo.tpl.php:1
msgid "Module Info"
msgstr "模块信息"

#: sub/summary.tpl.php:3
msgid "Caches"
msgstr "缓存区"

#: sub/summary.tpl.php:6
msgid "cache.cache"
msgstr "缓存|"

#: sub/summary.tpl.php:7
msgid "cache.slots"
msgstr "槽|Hash 槽个数, 对应 php.ini 里的设置"

#: sub/summary.tpl.php:8
msgid "cache.size"
msgstr "大小|共享内存区大小, 单位: 字节"

#: sub/summary.tpl.php:9
msgid "cache.avail"
msgstr "剩余|可用内存, 对应缓存区的剩余内存字节数"

#: sub/summary.tpl.php:10
msgid "cache.blocksgraph"
msgstr "百分比图|条状显示可用内存的比例, 以及显示分配块状态"

#: sub/summary.tpl.php:11
msgid "cache.operations"
msgstr "操作|点击按钮清除对应缓存区的数据"

#: sub/summary.tpl.php:12
msgid "cache.status"
msgstr ""
"状态|状态标记. 当缓存区正在编译 PHP 脚本时标记为 \"编译中\". 当缓存区暂停使用"
"时标记为 \"禁用\""

#: sub/summary.tpl.php:13
msgid "cache.hits"
msgstr "命中|缓存命中次数, 命中=从该缓存载入 PHP 或者变量"

#: sub/summary.tpl.php:14
msgid "cache.hits_graph"
msgstr "24H 分布|24 小时命中分布图. 图表现是最后 24 小时的命中次数"

#: sub/summary.tpl.php:15
msgid "cache.hits_avg_h"
msgstr "命中/H|每小时命中次数. 只统计最后 24 小时"

#: sub/summary.tpl.php:16
msgid "cache.hits_avg_s"
msgstr "命中/S|每秒命中次数. 只统计最后 5 秒"

#: sub/summary.tpl.php:17
msgid "cache.updates"
msgstr "更新|缓存更新次数"

#: sub/summary.tpl.php:18
msgid "cache.skips"
msgstr ""
"跳过|跳过更新次数, 跳过=XCache 自动判断阻塞的缓存区自动跳过阻塞等待, 直接使用"
"编译不缓存方式继续处理请求"

#: sub/summary.tpl.php:19
msgid "cache.ooms"
msgstr ""
"内存不足|内存不足次数, 显示需要存储新数据但是缓存区内存不足的次数. 如果出现太"
"频繁请考虑加大配置中的 xcache.size 或者 xcache.var_size"

#: sub/summary.tpl.php:20
msgid "cache.errors"
msgstr ""
"错误|编译错误, 显示您的脚本被编译时出错的次数. 如果您发现这个数字不断增长, 您"
"应该检查什么脚本产生错误. 参考 帮助 获取更多信息"

#: sub/summary.tpl.php:21
msgid "cache.readonly_protected"
msgstr ""
"保护|显示该 Cache 是否支持并启用 readonly_protection. 参考 帮助 获取更多信息"

#: sub/summary.tpl.php:22
msgid "cache.cached"
msgstr "缓存|缓存于该缓存区的项目条数"

#: sub/summary.tpl.php:23
msgid "cache.deleted"
msgstr "待删|缓存区内将要删除的项目 (已经删除但是还被某些进程占用)"

#: sub/summary.tpl.php:24
msgid "cache.gc_timer"
msgstr "GC|垃圾回收的倒计时"

#: sub/summary.tpl.php:30
msgid "Clear"
msgstr "清除"

#: sub/summary.tpl.php:31
msgid "Disabled"
msgstr "禁用"

#: sub/summary.tpl.php:32
msgid "Disable"
msgstr "禁用"

#: sub/summary.tpl.php:33
msgid "Enable"
msgstr "启用"

#: sub/summary.tpl.php:34
msgid "Compiling"
msgstr "编译中"

#: sub/summary.tpl.php:35
msgid "Normal"
msgstr "正常"

#: sub/summary.tpl.php:36 sub/testcoredump.tpl.php:3
msgid "Sure?"
msgstr "确认?"

#: sub/summary.tpl.php:132
msgid "Legends:"
msgstr "图例:"

#: sub/summary.tpl.php:134
msgid "% Free"
msgstr "% 剩余"

#: sub/summary.tpl.php:134
msgid "% Used"
msgstr "% 已用"

#: sub/summary.tpl.php:136
msgid "Free Blocks"
msgstr "未用块"

#: sub/summary.tpl.php:136
msgid "Used Blocks"
msgstr "已用块"

#: sub/summary.tpl.php:138
msgid "Hits"
msgstr "命中"
PKq�\�o�EExcache_3/cacher/lang/en.ponu�[���msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-08 14:41+0800\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: edit.tpl.php:8
#, php-format
msgid "Editing Variable %s"
msgstr ""

#: edit.tpl.php:13
#, php-format
msgid "Set %s in config to enable"
msgstr ""

#: index.php:187 index.php:213
msgid "Total"
msgstr ""

#: index.php:263
msgid "Summary"
msgstr ""

#: index.php:264
msgid "List PHP"
msgstr ""

#: index.php:265
msgid "List Var Data"
msgstr ""

#: listentries.tpl.php:11
msgid "php Cached"
msgstr "PHP Cached"

#: listentries.tpl.php:11
msgid "var Cached"
msgstr "Variable Cached"

#: listentries.tpl.php:15
msgid "php Deleted"
msgstr "PHP Deleted"

#: listentries.tpl.php:15
msgid "var Deleted"
msgstr "Variable Deleted"

#: sub/entrylist.tpl.php:14
msgid "entry.id"
msgstr "Id|"

#: sub/entrylist.tpl.php:19
msgid "entry.remove"
msgstr "Remove|"

#: sub/entrylist.tpl.php:24
msgid "entry.name"
msgstr "Entry name|The entry name or filename"

#: sub/entrylist.tpl.php:25
msgid "entry.hits"
msgstr "Hits|Hit times of this entry (loaded from this cache)"

#: sub/entrylist.tpl.php:26
msgid "entry.size"
msgstr "Size|Size in bytes of this entry in the cache"

#: sub/entrylist.tpl.php:31
msgid "entry.refcount"
msgstr "Refs|Reference count of this entry is holded by a php request"

#: sub/entrylist.tpl.php:32
msgid "entry.phprefcount"
msgstr "Shares|Count of entry sharing this php data"

#: sub/entrylist.tpl.php:33
msgid "entry.class_cnt"
msgstr "Cls.|Count of classes"

#: sub/entrylist.tpl.php:34
msgid "entry.function_cnt"
msgstr "Funcs|Count of functions"

#: sub/entrylist.tpl.php:35
msgid "entry.file_size"
msgstr "Src Size|Size of the source file"

#: sub/entrylist.tpl.php:36
msgid "entry.file_mtime"
msgstr "Modified|Last modified time of the source file"

#: sub/entrylist.tpl.php:39
msgid "entry.file_device"
msgstr "dev|device number of the source file"

#: sub/entrylist.tpl.php:40
msgid "entry.file_inode"
msgstr "ino|inode number of the source file"

#: sub/entrylist.tpl.php:44
msgid "entry.hash"
msgstr "Hash|Hash value of this entry"

#: sub/entrylist.tpl.php:45
msgid "entry.atime"
msgstr "Access|Last time when this entry is accessed"

#: sub/entrylist.tpl.php:46
msgid "entry.ctime"
msgstr "Create|The time when this entry is stored"

#: sub/entrylist.tpl.php:51
msgid "entry.delete"
msgstr "Delete|The time when this entry is deleted"

#: sub/entrylist.tpl.php:149
msgid "Remove Selected"
msgstr ""

#: sub/moduleinfo.tpl.php:1
msgid "Module Info"
msgstr ""

#: sub/summary.tpl.php:3
msgid "Caches"
msgstr "Caches"

#: sub/summary.tpl.php:6
msgid "cache.cache"
msgstr "Cache|"

#: sub/summary.tpl.php:7
msgid "cache.slots"
msgstr "Slots|Number of hash slots. the setting from your php.ini"

#: sub/summary.tpl.php:8
msgid "cache.size"
msgstr "Size|Cache Size, Size of the cache (or cache chunk), in bytes"

#: sub/summary.tpl.php:9
msgid "cache.avail"
msgstr "Avail|Available Memory, free memory in bytes of this cache"

#: sub/summary.tpl.php:10
msgid "cache.blocksgraph"
msgstr ""
"Percent Graph|Shows how much memory available in percent, and memory blocks "
"status in graph"

#: sub/summary.tpl.php:11
msgid "cache.operations"
msgstr "Operations|Press the clear button to clean this cache"

#: sub/summary.tpl.php:12
msgid "cache.status"
msgstr ""
"Status|Compiling flag, \"Compiling\" if the cache is busy compiling php "
"script. \"Disabled\" if cache is disabled"

#: sub/summary.tpl.php:13
msgid "cache.hits"
msgstr "Hits|Cache Hits, hit=a var/php is loaded from this cache"

#: sub/summary.tpl.php:14
msgid "cache.hits_graph"
msgstr "Hits*24H|Hits graph of last 24 hours"

#: sub/summary.tpl.php:15
msgid "cache.hits_avg_h"
msgstr "Hits/H|Average Hits per Hour. Only last 24 hours is logged"

#: sub/summary.tpl.php:16
msgid "cache.hits_avg_s"
msgstr "Hits/S|Average Hits per Second. Only last 5 seconds is logged"

#: sub/summary.tpl.php:17
msgid "cache.updates"
msgstr "Updates|Cache Updates"

#: sub/summary.tpl.php:18
msgid "cache.skips"
msgstr ""
"Skips|Skips. Skip=updates are needed but skipped for some reason. e.g.: "
"other process/thread is busy compiling on this cache"

#: sub/summary.tpl.php:19
msgid "cache.ooms"
msgstr ""
"OOMs|Out Of Memory, how many times a new item should be stored but there "
"isn't enough memory in the cache, think of increasing the xcache.size or "
"xcache.var_size"

#: sub/summary.tpl.php:20
msgid "cache.errors"
msgstr ""
"Errs|Compiler errors, how many times your script(s) failed to be compiled by "
"PHP. You should really check what is happening if you see this value "
"increase. (See Help for more information)"

#: sub/summary.tpl.php:21
msgid "cache.readonly_protected"
msgstr ""
"Protected|Whether readonly_protection is available and enable on this cache "
"(See help for more information)"

#: sub/summary.tpl.php:22
msgid "cache.cached"
msgstr "Cached|Number of entries stored in this cache"

#: sub/summary.tpl.php:23
msgid "cache.deleted"
msgstr ""
"Deleted|Number of entries is pending in delete list (expired but referenced)"

#: sub/summary.tpl.php:24
msgid "cache.gc_timer"
msgstr "GC|Seconds count down of Garbage Collection"

#: sub/summary.tpl.php:30
msgid "Clear"
msgstr ""

#: sub/summary.tpl.php:31
msgid "Disabled"
msgstr ""

#: sub/summary.tpl.php:32
msgid "Disable"
msgstr ""

#: sub/summary.tpl.php:33
msgid "Enable"
msgstr ""

#: sub/summary.tpl.php:34
msgid "Compiling"
msgstr ""

#: sub/summary.tpl.php:35
msgid "Normal"
msgstr ""

#: sub/summary.tpl.php:36 sub/testcoredump.tpl.php:3
msgid "Sure?"
msgstr ""

#: sub/summary.tpl.php:132
msgid "Legends:"
msgstr ""

#: sub/summary.tpl.php:134
msgid "% Free"
msgstr ""

#: sub/summary.tpl.php:134
msgid "% Used"
msgstr ""

#: sub/summary.tpl.php:136
msgid "Free Blocks"
msgstr ""

#: sub/summary.tpl.php:136
msgid "Used Blocks"
msgstr ""

#: sub/summary.tpl.php:138
msgid "Hits"
msgstr ""
PKq�\b ���xcache_3/cacher/summary.tpl.phpnu�[���<?php include "../common/header.tpl.php"; ?>
<div class="switcher"><?php echo switcher("do", $doTypes); ?></div>
<?php include "./sub/summary.tpl.php"; ?>
<?php include "./sub/moduleinfo.tpl.php"; ?>
<?php include "../common/footer.tpl.php"; ?>
PKq�\6-Qrxcache_3/cacher/mkpassword.phpnu�[���<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
?>
<html>
	<head>
		<title>Simple MD5 password generator</title>
		<style stype="text/css">
			code pre { display: block; border: 1px dashed black; padding: 10px; }
		</style>
	</head>
	<body>
		<h1>Simple MD5 password generator</h1>
		<form method="post">
			<fieldset>
				Name:<br />
				<input type="text" name="username"><br />
				Password:<br />
				<input type="password" name="password"><br />
				<input type="submit"><br />
				The INI settings you need is:
				<code>
				<pre><?php
				if ($_SERVER['REQUEST_METHOD'] == 'POST') {
					$md5 = md5(@ $_POST['password']);
					$offs = mt_rand(0 + 1, 31 - 1);
					$md5_1 = substr($md5, 0, $offs);
					$md5_2 = substr($md5, $offs);
					$username = htmlspecialchars($_POST['username']);
					echo "xcache.admin.user=\"$username\"\n";
					echo "xcache.admin.pass=\"<span>$md5_1</span><span>$md5_2</span>\"\n";
				}
				?></pre>
				</code>
			</fieldset>
		</form>
	</body>
</html>
PKr�\ k����"xcache_3/cacher/config.default.phpnu�[���<?php

// [default config]
// DO NOT rename/delete/modify this file which will be overwritten when upgrade
// See config.example.php instead


// width of graph for free or usage blocks
$config['percent_graph_width'] = 120;
$config['percent_graph_type'] = 'used'; // either 'used' or 'free'

// only enable if you have password protection for admin page
// enabling this option will cause user to eval() whatever code they want
$config['enable_eval'] = false;

PKr�\֝,���xcache_3/cacher/index.phpnu�[���<?php

include "./common.php";

function freeblock_to_graph($freeblocks, $size) // {{{
{
	global $config;

	// cached in static variable
	static $graph_initial;
	if (!isset($graph_initial)) {
		$graph_initial = array_fill(0, $config['percent_graph_width'], 0);
	}
	$graph = $graph_initial;
	foreach ($freeblocks as $b) {
		$begin = $b['offset'] / $size * $config['percent_graph_width'];
		$end = ($b['offset'] + $b['size']) / $size * $config['percent_graph_width'];

		if ((int) $begin == (int) $end) {
			$v = $end - $begin;
			$graph[(int) $v] += $v - (int) $v;
		}
		else {
			$graph[(int) $begin] += 1 - ($begin - (int) $begin);
			$graph[(int) $end] += $end - (int) $end;
			for ($i = (int) $begin + 1, $e = (int) $end; $i < $e; $i ++) {
				$graph[$i] += 1;
			}
		}
	}
	$html = array();
	$c = 255;
	foreach ($graph as $k => $v) {
		if ($config['percent_graph_type'] != 'free') {
			$v = 1 - $v;
		}
		$v = (int) ($v * $c);
		$r = $g = $c - $v;
		$b = $c;
		$html[] = '<div style="background: rgb(' . "$r,$g,$b" . ')"></div>';
	}
	return implode('', $html);
}
// }}}
function calc_total(&$total, $data) // {{{
{
	foreach ($data as $k => $v) {
		switch ($k) {
		case 'type':
		case 'cache_name':
		case 'cacheid':
		case 'free_blocks':
			continue 2;
		}
		if (!isset($total[$k])) {
			$total[$k] = $v;
		}
		else {
			switch ($k) {
			case 'hits_by_hour':
			case 'hits_by_second':
				foreach ($data[$k] as $kk => $vv) {
					$total[$k][$kk] += $vv;
				}
				break;

			default:
				$total[$k] += $v;
			}
		}
	}
}
// }}}
function array_avg($a) // {{{
{
	if (count($a) == 0) {
		return '';
	}
	return array_sum($a) / count($a);
}
// }}}
function bar_hits_percent($v, $percent, $active) // {{{
{
	$r = 220 + (int) ($percent * 25);
	$g = $b = 220 - (int) ($percent * 220);
	$percent = (int) ($percent * 100);
	$a = $active ? ' class="active"' : '';
	$height = 20 - 1 * 2;
	$valueHeight = ceil($height * $percent / 100);
	$paddingHeight = $height - $valueHeight;
	$valueHeight = $valueHeight ? $valueHeight . "px" : 0;
	$paddingHeight = $paddingHeight ? $paddingHeight . "px" : 0;
	return '<a title="' . $v . '" href="javascript:;"' . $a . '>'
		. ($paddingHeight ? '<span style="height: ' . $paddingHeight . '"></span>' : '')
		. ($valueHeight ? '<span style="background: rgb(' . "$r,$g,$b" . '); height: ' . $valueHeight . '"></span>' : '')
		. '</a>';
}
// }}}
function get_cache_hits_graph($ci, $key) // {{{
{
	global $maxHitsByHour;
	if ($ci['cacheid'] == -1) {
		$max = max($ci[$key]);
	}
	else {
		$max = $maxHitsByHour[$ci['type']];
	}
	if (!$max) {
		$max = 1;
	}
	$t = (time() / (60 * 60)) % 24;

	$html = array();
	$width = count($ci[$key]) * 2;
	$html[] = '<div class="hitsgraph" style="width: ' . $width . 'px">';
	foreach ($ci[$key] as $i => $v) {
		$html[] = bar_hits_percent($v, $v / $max, $i == $t);
	}
	$html[] = "</div>";
	return implode('', $html);
}
// }}}
function getModuleInfo() // {{{
{
	ob_start();
	phpinfo(INFO_MODULES);
	$moduleInfo = ob_get_clean();
	if (!preg_match_all('!(XCache[^<>]*)</a></h2>(.*?)<h2>!is', $moduleInfo, $m)) {
		return;
	}

	$moduleInfo = array();
	foreach ($m[1] as $i => $dummy) {
		$caption = trim($m[1][$i]);
		$info = str_replace('<br />', '', trim($m[2][$i]));

		$regex = '!<table[^>]*>!';
		if (preg_match($regex, $info)) {
			$moduleInfo[] = preg_replace($regex, "\\0<caption>$caption</caption>", $info, 1);
		}
		else {
			$moduleInfo[] = "<h3>$caption</h3>";
			$moduleInfo[] = $info;
		}
	}
	$moduleInfo = implode('', $moduleInfo);
	if (ini_get("xcache.test")) {
		ob_start();
		include "./sub/testcoredump.tpl.php";
		$test_coredump = trim(ob_get_clean());
		$moduleInfo = str_replace('xcache.coredump_directory', 'xcache.coredump_directory' . $test_coredump, $moduleInfo);
	}
	return $moduleInfo;
}
// }}}
function getCacheInfos() // {{{
{
	static $cacheInfos;
	if (isset($cacheInfos)) {
		return $cacheInfos;
	}

	$phpCacheCount = xcache_count(XC_TYPE_PHP);
	$varCacheCount = xcache_count(XC_TYPE_VAR);

	$cacheInfos = array();
	$total = array();
	global $maxHitsByHour;
	$maxHitsByHour = array(0, 0);
	for ($i = 0; $i < $phpCacheCount; $i ++) {
		$data = xcache_info(XC_TYPE_PHP, $i);
		if ($_GET['do'] === 'listphp') {
			$data += xcache_list(XC_TYPE_PHP, $i);
		}
		$data['type'] = XC_TYPE_PHP;
		$data['cache_name'] = "php#$i";
		$data['cacheid'] = $i;
		$cacheInfos[] = $data;
		$maxHitsByHour[XC_TYPE_PHP] = max($maxHitsByHour[XC_TYPE_PHP], max($data['hits_by_hour']));
		if ($phpCacheCount >= 2) {
			calc_total($total, $data);
		}
	}

	if ($phpCacheCount >= 2) {
		$total['type'] = XC_TYPE_PHP;
		$total['cache_name'] = _T('Total');
		$total['cacheid'] = -1;
		$total['gc'] = null;
		$total['istotal'] = true;
		unset($total['compiling']);
		$cacheInfos[] = $total;
	}

	$total = array();
	for ($i = 0; $i < $varCacheCount; $i ++) {
		$data = xcache_info(XC_TYPE_VAR, $i);
		if ($_GET['do'] === 'listvar') {
			$data += xcache_list(XC_TYPE_VAR, $i);
		}
		$data['type'] = XC_TYPE_VAR;
		$data['cache_name'] = "var#$i";
		$data['cacheid'] = $i;
		$cacheInfos[] = $data;
		$maxHitsByHour[XC_TYPE_VAR] = max($maxHitsByHour[XC_TYPE_VAR], max($data['hits_by_hour']));
		if ($varCacheCount >= 2) {
			calc_total($total, $data);
		}
	}

	if ($varCacheCount >= 2) {
		$total['type'] = XC_TYPE_VAR;
		$total['cache_name'] = _T('Total');
		$total['cacheid'] = -1;
		$total['gc'] = null;
		$total['istotal'] = true;
		$cacheInfos[] = $total;
	}
	return $cacheInfos;
}
// }}}
function getEntryList() // {{{
{
	static $entryList;
	if (isset($entryList)) {
		return $entryList;
	}
	$entryList = array('cache_list' => array(), 'deleted_list' => array());
	if ($_GET['do'] == 'listphp') {
		$entryList['type'] = XC_TYPE_PHP;
	}
	else {
		$entryList['type'] = XC_TYPE_VAR;
	}
	foreach (getCacheInfos() as $i => $c) {
		if (!empty($c['istotal'])) {
			continue;
		}
		if ($c['type'] == $entryList['type'] && isset($c['cache_list'])) {
			foreach ($c['cache_list'] as $e) {
				$e['cache_name'] = $c['cache_name'];
				$entryList['cache_list'][] = $e;
			}
			foreach ($c['deleted_list'] as $e) {
				$e['cache_name'] = $c['cache_name'];
				$entryList['deleted_list'][] = $e;
			}
		}
	}
	return $entryList;
}
// }}}

if (!extension_loaded('XCache')) {
	header("Location: ../diagnosis");
	exit;
}

xcache_count(XC_TYPE_PHP); // trigger auth
xcache_admin_namespace();

$doTypes = array(
		'' => _T('Summary'),
		'listphp' => _T('List PHP'),
		'listvar' => _T('List Var Data'),
		);

function processPOST() // {{{
{
	if (isset($_POST['remove']) && is_array($_POST['remove'])) {
		foreach ($_POST['remove'] as $name) {
			if (is_string($name)) {
				xcache_unset($name);
			}
		}
	}

	$type = isset($_POST['type']) ? $_POST['type'] : null;
	if ($type != XC_TYPE_PHP && $type != XC_TYPE_VAR) {
		$type = null;
	}
	if (isset($type)) {
		$cacheid = (int) (isset($_POST['cacheid']) ? $_POST['cacheid'] : 0);
		if (isset($_POST['clearcache'])) {
			xcache_clear_cache($type, $cacheid);
		}
		if (isset($_POST['enable'])) {
			xcache_enable_cache($type, $cacheid);
		}
		if (isset($_POST['disable'])) {
			xcache_enable_cache($type, $cacheid, false);
		}
	}

	if (isset($_POST['coredump'])) {
		xcache_coredump();
	}
}
// }}}

processPOST();

if (!isset($_GET['do'])) {
	$_GET['do'] = '';
}

switch ($_GET['do']) {
case 'listphp':
case 'listvar':
	include "./listentries.tpl.php";
	break;

default:
	include "./summary.tpl.php";
	break;
}

?>
PKr�\�z�ggxcache_3/cacher/common.phpnu�[���<?php

require_once "../common/common.php";

include get_language_file("./lang");
$module = "cacher";

PKr�\6�|f��#xcache_3/cacher/listentries.tpl.phpnu�[���<?php include "../common/header.tpl.php"; ?>
<div class="switcher"><?php echo switcher("do", $doTypes); ?></div>
<?php include "./sub/summary.tpl.php"; ?>
<?php
$entryList = getEntryList();
$isphp = $entryList['type'] == XC_TYPE_PHP;
ob_start($config['path_nicer']);

$listName = 'Cached';
$entries = $entryList['cache_list'];
$caption = $isphp ? _T("php Cached") : _T("var Cached");
include "./sub/entrylist.tpl.php";

$listName = 'Deleted';
$caption = $isphp ? _T("php Deleted") : _T("var Deleted");
$entries = $entryList['deleted_list'];
include "./sub/entrylist.tpl.php";

ob_end_flush();
unset($isphp);
?>
<?php include "../common/footer.tpl.php"; ?>
PKr�\�]�;xcache_3/cacher/edit.phpnu�[���<?php

include "./common.php";

if (!isset($_GET['name'])) {
	die("missing name");
}

// trigger auth
$vcnt = xcache_count(XC_TYPE_VAR);
xcache_admin_namespace();

$name = $_GET['name'];
if (!empty($config['enable_eval'])) {
	eval('$name = ' . $name . ';');
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	if (!empty($config['enable_eval'])) {
		eval('$value = ' . $_POST['value'] . ';');
	}
	else {
		$value = $_POST['value'];
	}
	xcache_set($name, $value);
	header("Location: ./?do=listvar");
	exit;
}
$value = xcache_get($name);
if (!empty($config['enable_eval'])) {
	$value = var_export($value, true);
	$editable = true;
}
else {
	if (is_string($value)) {
		$editable = true;
	}
	else {
		$editable = false;
		$value = var_export($value, true);
	}
}

include "edit.tpl.php";

?>
PKr�\"{���xcache_3/cacher/edit.tpl.phpnu�[���<?php include "../common/header.tpl.php"; ?>
<?php
$h_name = htmlspecialchars(var_export($name, true));
$h_value = htmlspecialchars($value);
?>
<form method="post" action="">
	<fieldset>
		<legend><?php echo sprintf(_T("Editing Variable %s"), $h_name); ?></legend>
		<textarea name="value" style="width: 100%; height: 200px; overflow-y: auto" <?php echo $editable ? "" : "disabled=disabled"; ?>><?php echo $h_value; ?></textarea><br>
		<input type="submit" <?php echo $editable ? "" : "disabled=disabled"; ?>>
		<?php
		if (!$editable) {
			echo sprintf(_T("Set %s in config to enable"), "\$config['enable_eval'] = true");
		}
		?>
	</fieldset>
</form>
<?php include "../common/footer.tpl.php"; ?>
PKr�\�&���xcache_3/index.phpnu�[���<?php

chdir("common");
require_once "common.php";
if (!$modules) {
	die("no sub modules' php pages installed");
}
foreach ($modules as $k => $v) {
	header("Location: $k/");
	break;
}

PKr�\
f�hh&xcache_3/common/lang/zh-traditional.ponu�[���msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-08 14:41+0800\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: common.php:47
msgid "Document"
msgstr "幫助文檔"

#: common.php:48
msgid "INI Reference"
msgstr "INI 參考"

#: common.php:49
msgid "Get Support"
msgstr "獲取支持"

#: common.php:50
msgid "Discusson"
msgstr "討論"

#: common.php:267
msgid "Cacher"
msgstr "快取器"

#: common.php:270
msgid "Coverager"
msgstr "代码覆盖查看器"

#: common.php:273
msgid "Diagnosis"
msgstr "診斷"
PKr�\r"d//'xcache_3/common/lang/zh-traditional.phpnu�[���<?php
// auto generated, do not modify
$strings += array(
		"Document"
		=> "幫助文檔",
		"INI Reference"
		=> "INI 參考",
		"Get Support"
		=> "獲取支持",
		"Discusson"
		=> "討論",
		"Cacher"
		=> "快取器",
		"Coverager"
		=> "代码覆盖查看器",
		"Diagnosis"
		=> "診斷",
		);

PKr�\��//&xcache_3/common/lang/zh-simplified.phpnu�[���<?php
// auto generated, do not modify
$strings += array(
		"Document"
		=> "帮助文档",
		"INI Reference"
		=> "INI 参考",
		"Get Support"
		=> "获取支持",
		"Discusson"
		=> "讨论",
		"Cacher"
		=> "缓存器",
		"Coverager"
		=> "代码覆盖查看器",
		"Diagnosis"
		=> "诊断",
		);

PKr�\��_i@@xcache_3/common/lang/en.phpnu�[���<?php
// auto generated, do not modify
$strings += array(
		);

PKr�\���ee%xcache_3/common/lang/zh-simplified.ponu�[���msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-08 14:41+0800\n"
"Language: zh\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: common.php:47
msgid "Document"
msgstr "帮助文档"

#: common.php:48
msgid "INI Reference"
msgstr "INI 参考"

#: common.php:49
msgid "Get Support"
msgstr "获取支持"

#: common.php:50
msgid "Discusson"
msgstr "讨论"

#: common.php:267
msgid "Cacher"
msgstr "缓存器"

#: common.php:270
msgid "Coverager"
msgstr "代码覆盖查看器"

#: common.php:273
msgid "Diagnosis"
msgstr "诊断"
PKr�\�"xcache_3/common/lang/en.ponu�[���msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-08 14:41+0800\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: common.php:47
msgid "Document"
msgstr ""

#: common.php:48
msgid "INI Reference"
msgstr ""

#: common.php:49
msgid "Get Support"
msgstr ""

#: common.php:50
msgid "Discusson"
msgstr ""

#: common.php:267
msgid "Cacher"
msgstr ""

#: common.php:270
msgid "Coverager"
msgstr ""

#: common.php:273
msgid "Diagnosis"
msgstr ""
PKr�\H�x&

xcache_3/common/tablesort.jsnu�[���var sort_column;
var prev_span = null;
function get_inner_text(el) {
 if((typeof el == 'string')||(typeof el == 'undefined'))
  return el;
 if(el.innerText)
  return el.innerText;
 else {
  var str = "";
  var cs = el.childNodes;
  var l = cs.length;
  for (var i=0;i<l;i++) {
   if (cs[i].nodeType==1) str += get_inner_text(cs[i]);
   else if (cs[i].nodeType==3) str += cs[i].nodeValue;
  }
 }
 return str;
}
function sortfn(a,b) {
 var i = a.cells[sort_column].getAttribute('int');
 if (i != null) {
  return parseInt(i)-parseInt(b.cells[sort_column].getAttribute('int'));
 } else {
  var at = get_inner_text(a.cells[sort_column]);
  var bt = get_inner_text(b.cells[sort_column]);
  aa = at.toLowerCase();
  bb = bt.toLowerCase();
  if (aa==bb) return 0;
  else if (aa<bb) return -1;
  else return 1;
 }
}
function resort(lnk) {
 var span = lnk.childNodes[1];
 if (!span) {
 	 var span = document.createElement("span")
 	 span.className = "sortarrow";
 	 lnk.appendChild(span);
 }
 var table = lnk.parentNode.parentNode.parentNode.parentNode;
 var rows = new Array();
 for (j=1;j<table.rows.length;j++)
  rows[j-1] = table.rows[j];
 sort_column = lnk.parentNode.cellIndex;
 rows.sort(sortfn);
 if (prev_span != null) prev_span.innerHTML = '';
 if (span.getAttribute('sortdir')=='down') {
  span.innerHTML = '&uarr;';
  span.setAttribute('sortdir','up');
  rows.reverse();
 } else {
  span.innerHTML = '&darr;';
  span.setAttribute('sortdir','down');
 }
 for (i=0;i<rows.length;i++)
  table.tBodies[0].appendChild(rows[i]);
 prev_span = span;
}
PKr�\��H�yyxcache_3/common/footer.tpl.phpnu�[���</div>
<div id="footer">
	<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>
	<a href="http://jigsaw.w3.org/css-validator/check/referer">
		<img style="border:0;width:88px;height:31px" src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!" />
	</a>
	<div id="poweredBy">
		<h3>PHP <?php
	echo phpversion();
?> Powered By: XCache <?php
	echo defined('XCACHE_VERSION') ? XCACHE_VERSION : '';
?>, <?php
	echo defined('XCACHE_MODULES') ? XCACHE_MODULES : '';
?>
		</h3>
	</div>
</div>

</body>
</html>
PKr�\(�hN��xcache_3/common/header.tpl.phpnu�[���<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $GLOBALS['config']['charset']; ?>" />
	<meta http-equiv="Content-Language" content="<?php echo $GLOBALS['config']['lang']; ?>" />
	<script type="text/javascript" src="../common/tablesort.js"></script>

	<link rel="stylesheet" type="text/css" href="../common/common.css" />
	<link rel="stylesheet" type="text/css" href="<?php echo $GLOBALS['module']; ?>.css" />
	<title><?php echo sprintf("XCache %s", $xcache_version = defined('XCACHE_VERSION') ? XCACHE_VERSION : ''); ?> - <?php echo ucfirst($GLOBALS['module']); ?></title>
</head>

<body>
<div id="header">
	<div id="banner">
		<a href="http://xcache.lighttpd.net/" rel="external"><img src="../common/xcache.png" id="logo" alt="XCache logo" width="175" height="51" />
			<?php echo $xcache_version; ?> - <?php echo ucfirst($GLOBALS['module']); ?>
		</a>
	</div>
	<div id="nav">
		<div id="mainnav">
				<?php echo mainnav(); ?>
		</div>
		<div id="subnav" class="switcher">
				<?php echo subnav(); ?>
		</div>
	</div>
</div>
<div id="headerbase">&nbsp;</div>
<div id="main">
PKr�\J�O���xcache_3/common/common.phpnu�[���<?php

class Cycle
{
	var $values;
	var $i;
	var $count;

	function Cycle($v)
	{
		$this->values = func_get_args();
		$this->i = -1;
		$this->count = count($this->values);
	}

	function next()
	{
		$this->i = ($this->i + 1) % $this->count;
		return $this->values[$this->i];
	}

	function cur()
	{
		return $this->values[$this->i];
	}

	function reset()
	{
		$this->i = -1;
	}
}

function switcher($name, $options)
{
	$n = isset($_GET[$name]) ? $_GET[$name] : null;
	$html = array();
	foreach ($options as $k => $v) {
		$html[] = sprintf('<a href="?%s=%s"%s>%s</a>', $name, $k, $k == $n ? ' class="active"' : '', $v);
	}
	return implode('', $html);
}

function mainnav()
{
	foreach (array(
				"http://xcache.lighttpd.net/" => "XCache",
				"http://xcache.lighttpd.net/wiki/DocTOC" => _T("Document"),
				"http://xcache.lighttpd.net/wiki/PhpIni" => _T("INI Reference"),
				"http://xcache.lighttpd.net/wiki/GetSupport" => _T("Get Support"),
				"https://groups.google.com/group/xcache/" => _T("Discusson"),
				"http://www.php.net/" => "PHP",
				"http://www.lighttpd.net/" => "Lighttpd",
				) as $url => $title) {
		$html[] = sprintf('<a href="%s" rel="external">%s</a>', $url, $title);
	}
	return implode('|', $html);
}

function subnav()
{
	global $module, $modules;
	$html = array();
	foreach ($modules as $k => $v) {
		$html[] = sprintf('<a href="../%s/"%s>%s</a>', $k, $k == $module ? ' class="active"' : '', $v);
	}
	return implode('', $html);
}

function th($name, $attrs = null)
{
	$translated = __($name);
	if ($translated == $name) {
		$translated = "$name|$name";
	}
	list($text, $title) = explode('|', $translated, 2);
	return sprintf('%s<th%s id="%s" class="h" title="%s"><a href="javascript:" onclick="resort(this); return false">%s</a></th>%s'
			, "\t"
			, $attrs ? " $attrs" : ""
			, $name, htmlspecialchars(trim($title)), trim($text)
			, "\n");
}

function xcache_validateFileName($name)
{
	return preg_match('!^[a-zA-Z0-9._-]+$!', $name);
}

function get_language_file_ex($dir, $lang)
{
	static $langMap = array(
			'zh'    => 'zh-simplified',
			'zh-hk' => 'zh-traditional',
			'zh-tw' => 'zh-traditional',
			);

	if (isset($langMap[$lang])) {
		$lang = $langMap[$lang];
	}
	else if (!xcache_validateFileName($lang)) {
		return null;
	}

	$file = "$dir/$lang.php";
	if (file_exists($file)) {
		return $file;
	}
	return null;
}

function get_language_file($dir)
{
	global $config;
	if (!empty($config['lang'])) {
		$lang = strtolower($config['lang']);
		$file = get_language_file_ex($dir, $lang);
		if (!isset($file)) {
			$lang = strtok($lang, ':-');
			$file = get_language_file_ex($dir, $lang);
		}
	}
	else {
		$config['lang'] = 'en';

		if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
			foreach (explode(',', str_replace(' ', '', $_SERVER['HTTP_ACCEPT_LANGUAGE'])) as $lang) {
				$lang = strtok($lang, ':;');
				$file = get_language_file_ex($dir, $lang);
				if (isset($file)) {
					$config['lang'] = $lang;
					break;
				}
				if (strpos($lang, '-') !== false) {
					$file = get_language_file_ex($dir, strtok($lang, ':-'));
					if (isset($file)) {
						$config['lang'] = $lang;
						break;
					}
				}
			}
		}
	}
	return isset($file) ? $file : "$dir/en.php";
}

function _T($str)
{
	if (isset($GLOBALS['strings'][$str])) {
		return $GLOBALS['strings'][$str];
	}
	if (!empty($GLOBALS['config']['show_todo_strings'])) {
		return '<span style="color:red">' . $str . '</span>|';
	}
	return $str;
}

function __($str)
{
	return _T($str);
}

function N_($str)
{
	return $str;
}

function number_formats($a, $keys)
{
	foreach ($keys as $k) {
		$a[$k] = number_format($a[$k]);
	}
	return $a;
}

function size($size)
{
	$size = (int) $size;
	if ($size < 1024)
		return number_format($size, 2) . ' b';

	if ($size < 1048576)
		return number_format($size / 1024, 2) . ' K';

	return number_format($size / 1048576, 2) . ' M';
}

function age($time)
{
	if (!$time) return '';
	$delta = REQUEST_TIME - $time;

	if ($delta < 0) {
		$delta = -$delta;
	}
	
  	static $seconds = array(1, 60, 3600, 86400, 604800, 2678400, 31536000);
	static $name = array('s', 'm', 'h', 'd', 'w', 'M', 'Y');

	for ($i = 6; $i >= 0; $i --) {
		if ($delta >= $seconds[$i]) {
			$ret = (int) ($delta / $seconds[$i]);
			return $ret . $name[$i];
		}
	}

	return '0s';
}

function stripaddslashes_array($value, $mqs = false)
{
	if (is_array($value)) {
		foreach($value as $k => $v) {
			$value[$k] = stripaddslashes_array($v, $mqs);
		}
	}
	else if(is_string($value)) {
		$value = $mqs ? str_replace('\'\'', '\'', $value) : stripslashes($value);
	}
	return $value;
}

function ob_filter_path_nicer_default($list_html)
{
	$sep = DIRECTORY_SEPARATOR;
	$docRoot = $_SERVER['DOCUMENT_ROOT'];
	if ($sep != '/') {
		$docRoot = str_replace('/', $sep, $docRoot);
	}
	$list_html = str_replace(">$docRoot",  ">{DOCROOT}" . (substr($docRoot, -1) == $sep ? $sep : ""), $list_html);
	$xcachedir = realpath(dirname(__FILE__) . "$sep..$sep");
	$list_html = str_replace(">$xcachedir$sep", ">{XCache}$sep", $list_html);
	if ($sep == '/') {
		$list_html = str_replace(">/home/", ">{H}/", $list_html);
	}
	return $list_html;
}

error_reporting(E_ALL);
ini_set('display_errors', 'On');
define('REQUEST_TIME', time());

if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc()) {
	$mqs = (bool) ini_get('magic_quotes_sybase');
	$_GET = stripaddslashes_array($_GET, $mqs);
	$_POST = stripaddslashes_array($_POST, $mqs);
	$_REQUEST = stripaddslashes_array($_REQUEST, $mqs);
	unset($mqs);
}
ini_set('magic_quotes_runtime', '0');

$config = array();
if (file_exists("./config.default.php")) {
	include "./config.default.php";
}
include "../config.default.php";
if (file_exists("../config.php")) {
	include "../config.php";
}
if (file_exists("./config.php")) {
	include "./config.php";
}

$strings = array();
include get_language_file("../common/lang");

$modules = array();
if (file_exists("../cacher/index.php")) {
	$modules["cacher"] = _T("Cacher");
}
if (file_exists("../coverager/index.php")) {
	$modules["coverager"] = _T("Coverager");
}
if (file_exists("../diagnosis/index.php")) {
	$modules["diagnosis"] = _T("Diagnosis");
}
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Content-Type: text/html; " . $GLOBALS['config']['charset']);
header("Content-Language: " . $GLOBALS['config']['lang']);

?>
PKr�\p��NNxcache_3/common/common.cssnu�[���* {
	box-sizing: border-box;
	-moz-box-sizing: border-box;
}
body {
	background: white;
	color: black;
	margin: 0;
	padding: 0;
	font-family: arial;
	font-size: 12pt;
}
form {
	margin: 0;
	padding: 0;
}
a:link
, a:visited {
	color: #0066CC;
}
a:link:hover
, a:visited:hover {
	color: #BB0000;
}
a:link:active
, a:visited:active {
	color: red;
}
#header {
	background: #5084D5;
	position: relative;
	height: 51px;
	color: #d0d0d0;
}
h1, h2, h3, h4, h5, h6 {
	margin-bottom: 2px;
}
#header #banner {
	font: 32px/51px "arial", serif;
	color: white;
}
#header #banner a {
	color: white;
}
#header #banner #logo {
	border: 0;
	display: block;
	float: left;
	margin-right: 5px;
	background: white;
}
#header #mainnav {
	top: 3px;
	right: 5px;
	font-size: 16px;
	line-height: 16px;
	position: absolute;
}
#header #mainnav a {
	font-size: 14px;
}
#header #subnav {
	bottom: 0;
	right: 5px;
	position: absolute;
	font-size: 28px;
	line-height: 28px;
}
#header #subnav a {
	font-size: 24px;
}
#header #nav {
	font-family: "arial", serif;
}
#header #mainnav a:link, #header #mainnav a:visited {
	color: black;
}
#header #mainnav a:active, #header #mainnav a:hover {
	color: red;
}
#header #mainnav a {
	padding: 0 8px 0 8px;
}
#headerbase {
	background: #1163BC;
	border: 1px solid #334C66;
	border-width: 1px 0 1px 0;
	margin-bottom: 10px;
	font: 12px/12px serif;
}
#main table {
	font-size: 12px;
	border: 1px solid #334C66;
	border-top-width: 0;
}
#main table caption {
	background: #1163BC;
	color: white;
	line-height: 20px;
	border: 1px solid #334C66;
	border-bottom-width: 0;
	padding: 0;
}
#main table tfoot {
	background: #1163BC;
}
#main table th {
	background: #E7E7FF;
	color: black;
}
#main table td {
	vertical-align: top;
}
#main {
	margin: 20px;
}
#note {
	font-size: 11.9px;
}
#footer {
	bottom: 0px;
	background: #E7E7FF;
	border-top: 1px solid gray;
}
#poweredBy {
	overflow: hidden;
}
#footer {
	clear: both;
	height: 40px;
	position: relative;
}
#footer img {
	margin-top: 2px;
	margin-left: 2px;
	border: 0;
}
#poweredBy h3 {
	float: right;
	margin-right: 20px;
	margin-top: 20px;
}
#poweredBy h3 {
	margin: 0;
	font-size: 12px;
	position: absolute;
	bottom: 8px;
	right: 8px;
}
.phpinfo table { border: 1px solid #334C66; margin-bottom: 1px; }
.phpinfo table th, .phpinfo table td { border: 1px solid #334C66; }
.phpinfo table th { font-weight: bold; }
.phpinfo .e {background: #81BBF2; font-weight: bold; color: #000000;}
#main .phpinfo .h th {background: #5084D5; font-weight: bold; color: #000000;}
.phpinfo .v {color: #000000;}
.button { }
span.sortarrow { color: white; text-decoration: none; }
table.cycles { border: 1px solid #334C66; margin-bottom: 5px; }
table.cycles .col1 { background: #f5f5f5; }
table.cycles .col2 { background: #e0e0e0; }
table.cycles th, table.cycles td { border: 1px solid #334C66; font-family: monospace; }
#main table.cycles caption { color: white; font-weight: bold; height: 24px; line-height: 24px; font-family: serif; }
#main table.cycles th { background: #81BBF2; color: #334C66; font-weight: bold; height: 20px; line-height: 20px; font-family: serif; }
#main table.cycles th.h { background: #5084D5; }
th.h a:visited
, th.h a:link { color: black; }
th.h a:hover { color: #BB0000; }
th.h a:active { color: red; }
th a { font-weight: bold; display: block; width: 100%; height: 100%; }
th { font-size: 12px; }
input, table { font-family: sans-serif; }
input { font-size: 12px; }
table { border-collapse: collapse; font-size: 11px; margin: 0; }
table caption {
	font-size: 14px;
	font-weight: bold;
}

a {
	text-decoration: none;
}
#main table td {
	vertical-align: middle;
}
.switcher a { color: black; padding: 1px 8px 1px 8px; border: 1px solid white; }
.switcher a { border-color: white; border-bottom-color: #334C66; }
#nav .switcher a { border-color: #5084D5; border-bottom-color: #334C66; }
#nav .switcher a.active, .switcher a.active { color: white; background: #1163BC; border-color: #334C66; border-bottom-color: #1163BC; }
#nav .switcher a:hover.active, .switcher a:hover.active { background: #81BBF2; }
.switcher a:hover { background: #81BBF2; }
#nav .switcher a:active, .switcher a:active { background: #81BBF2; }
PKr�\��[���xcache_3/common/xcache.pngnu�[����PNG


IHDR�3�6XMgAMA��� cHRM���U��y}��=. *�"�iCCPICC Profile8˭��k�@�ovi+(UTb�YY�zhѺ��n�5��
Z��t7���$���_!=TQ�x��I)�H��A��P�B�&�d�z��3o2o �nx^3�qC�<uV�0Q�4��'�1X��v�͏P��C��:0b��*��k��i^����ӆ���օ�pׄ��K��ܬa��dͯ���G<O]�)wM�5w���O�k�.��E6����^f��}�[�iQ�t�|�y>�M��3�.╗���������q�ޏ��m�k+ݱo��Z)�����xHٽ�\����@�{��Pm=���wh�M��k��?�R�w����̢l�R;Y�%�,��%��X��]jK��5@�Z�u�r9�D
��g
��N�-s��{���O���Z霴LT�9�dA��d�FuN��Qԓ<�Ҍ�i�OH_mM'{Y�$Щ$sLc|��?_���Y`��ѻX��z���3���^�-oٷ�P���R�-�k��������l���A������	pHYs���+DIDATx^�]	x�U�~�6I�n�h
X�R�MvP����13ze�q�;�0�:x��
FD@DևUYe�P(�Z(Ж�i��i2�w�`��ٓ.��<�j����|��Wf���T�up���\�b�[�:�2҆�Z���d������ 0(��Fܮg2� C�Fan׵������P��"x=��ڀ��!&\�H�Br
~o�����;�,C`�??��p��L�
�=�:��cB���
�=	�"�_�FP�+k�׻%�;6�~�r��
L8�k"{�}��!(��S��.�ueѽ�;I/��
Q��k���K��
���y<�'Y�M�q�2�0����f�")�J�z�!F��R:�-H����CSZFcg��1���6Һ9J~/w>�9]�\�r�$���#�2�����\n0���~��"ª��<5��͡�&����kw{|�탦Z��{;��Z�Y��ḛ�e&�k��BAJ\���/3���v�����g"��|9׺Ԗ#��W��	��e�� �PVV���@.��h܈�Ԁ~�qxj@[��\�'
�.�"X�������z�:5��[�׶����|��u3���Vh�%&BW�s"o��`@d��'�͸Q���fA!�y=.o�K���{�Z%�e�N#.C�#O�p�B��O!?/�l��0�jJ���Bh���|�'�ɜ����f�p��j������KαF�[B����&�}�t���;w�I�<l�����>�M1�"e�)�ʸIt!ȝj5^��(�WNrR4)�t��ׯ���"���=|�`O�NK�j��w���n7�6��b�ݮk]!-;ouQaJ�m1P�d�0��\VdyN
�$ʃ�8edaIj�f1�w�}�!�Q�N!���"�X��;�{�ڲ�H^�Hveq]-��ýb��~�2._<O
��Qj�FB
aN{��et\셥[���]`�VL���P���E#&RE	 ��Z=�n��k8��'��w�>�~v �FWu��:u���CH
�"��M����ZI.��W����)�a��4�2��ڐ�,,<C��JR9
��}��O����#0�鎍��$=/*�bƨ�?�!�͈o	�RN
h Tķ�D��G�8�ك@�sq.^*��r� ֩�,:FzV�J��V�y�!et�t�2�r���K���}���KA<&���\���U�HWe���=���C�d] �c�O�Z�Â�ѭ�snͷ���|����s(
�vha��+m����Y��&yo��p�؄lu�d5�/! +�ف�f���ܳ�����v����i��}�{
\nཱུ? "Da�?G�ZGJa74�t1ȇ�C\���\��e]J^E�N
]�%�R�3��eo���
įuT��p��z���u�Q,q�y���~�.���r�ܟe����7g��-'�KFܦh0�h<E)�B�Cǐ}%r����HXC�������6��zҲn;tF�rD�5口��n›�Fa�j��
#Tē�ѨA�0�)��ȩ�Gv^.]�#	i��6V�[M��
FBӆ�A���z~n������$�5�2�u���_ێ��q�gZ�.d���;%�P)m�#w��F���kL,P�;t�e\�'ڤ�gJ%�j*!a3��.�S�ydc*ۘaD��l��ﯫc�I9^9)p;7|�2
�	��@^�o�.��_��t�b6��QGIK�eD�xb�m�D���ۡ#iƊ��[�ӳ���)���������V�U�|@_?[6�;�Q�~���6�T�+�h�8J�:�H��U{�?>0f �h��c�!1��diWoa�����r�̉�41�����)m ��W�'��0� gzz�:�Y� �™���%���4��!�Ct��}{����Z�Jn�O��kY~��1����$9v�m�������n����$�2ќ�h����q�+��">ĺ�M$��庶n�Y��筥[�E���1v���5o�*ӈ,,vgkg~�
�}�`^�?7ygm)���U0:��G�W-}��*9�0��3����חo%pp���l e�9�u��_���bai�v8�����"󦱅���|zIx
)����5y�KUY��$ԯg�x4 �6�������A-|q��O1�3���E�!���$xũ� ��6�a�ٽ���8��:��X���.m��B��d�d�U!-�<�(��$B��Z�܂b!��7��ѐbfI�c��Fko��̨~IB��o��.ZRL��`��l/uo�w����I9O��O7$�
��N(���P�ρ�����k�筼J��H����S�`h��p��9�g��˄��;��6��7'�X��_��t
�>�L7�}� �V�N�`�W��G{a �6c>;S���I6�f,^�k7�.��WUJ2��aь�hKWz�t6�:��.����o�m0����vc��i6
�6�����[c茩��Ui?+����P&%���>�#�I���J^���,��h�k��0yҳ>./�oi�oE�����S\{�ÿ�sGm����pvaoe'��wM���&����y��XүR�&9Di,�o�)7��dc�YD��VW���Wl�de.2,X�r�f�Q��=��?aS7�I��J]ZC���%I�Bm���f��C�q�V���E�PW2]YA���+O8$����xn����iL����`�3���c�����o�X!�?�XX���P���̫����N���|hdv8's�P�X��&
���R��o|
Ak�i�򡯣���-W�p��yܸ�����vѫCK��ܚ��ube�h��m,��X�V��X�����t�o�0qh/���Z�!�e,�m#9'��R@�rH�[�f`/�8\�:��*}r?��1�w_zvh%r�N	�4K�`β��a�Z{,�j�R��Y�B-����*yt=.Y��'~m�c��d s�3e�7��V�۬S��0�r�;�V�cEO��⳹��=1
�7�)��T>L�}J������ %���;�ҝ
�%��#ŗ�[ֆ�7��,����Y!>R��M�ĺ=�p"-��z���QXa�qB�Z̾U ���E@����\$2�Y2iuZtiӌ�Z�V�y���S���J��Ħ'��J����ٚ !{�1_�\Oڜf2��$��V���/��9��
��x
�Z-qL�T�mt��f�Wm(�$��۠).Kj��Y���x�K�tV�s��ܳ#IG�N�.�~<��d���1���B1*&��#�R���ik�t�f�`��B*�m"�^�G�8,��Z�:\�sQ�Fd��R�5Y����@L�oI#���O^��s�E>r.�Ϧ��K8p*
�3��ۜX�3�
��^���P�Y�^J� zo�j�\<y����
��ƕ$���}�3l��|�����1x��n�w\�ͤ{����y�,����e�_0S�[d�N��В� �N�3�5�@Bԩ������x不1b@W<3���O�쉏BǶVi���؂Y��x)v�:}>�0eԃؽ=��a};cBrO<O��6e��� ������&e��
hL�#�R�U��"$�C{�ބ��WB���
��H��װb�~��ТY�G��`�}Y�����|�;�f�9��ٖjI�n�r��M�ؘH�_�:�yw&v��"�m�ok�����Ŵ	��c�1�nһ�y�$LQ���<$iC�@X����X��L1�P�L��'�Ա��̰�H�D7K�����;�a���⏷
��6ՓG&�pH��z`�`���ö���s1/�������_�W	P�&���t���_GJ���_��h�+��|��%ɢ�ר��f�&\pG�U[~p�+3���쭮XCa����|S2o_�y�c�i���o���;P��.K?5;�%�� ���K)���~ne�Dq��}���FG��y�
���o)7g�h��2�8��K����#5��.�mh���YJJ���m�a�%_n��g��f�INc�N�(�+�7*���A��!=��	//¥,iW�� �d�6���a/�18��Σ�t�~*��o¡�oAU7����y���	�%��0,��k�@ҧ��3��+7��V{�r���f���()�8"LIRKt+s�?��ov ��d^���/�u|E��`w�?��KA�؆���B�P�n�b���"^6�Ʋe�q�,EE�"�Ls�Ȋ��^�Ϡ�7�;�S/�Y�����Y��X���q��m�ƙ߯�%�]\L��2���Y��xY��7��ܴ�3rЀ��"CU46s�#�Gkp!3;�@-^�	g���x�}��_G�Ց�ۭ�K�S����#ѐ����F����|w�s�����*P���O�=���0��m����~w�z|���B�r���p�/��m�<�ʡ���`'=�e+�x��2+8|����K�2�t *�]p}���>?7G�?��\��ql�f�TN��Jq0,�������p�$n���75XZZ���>4<���oP }�Յ=g���ቡ�kx?&������E.ö/V ;���+�ֳ��. I�{��ȸ
����V�\M�M��6�RΕ
�׷h�39��t���;7/�d��x�1<9L����GS����"�t$4�'�g�S�@�6f1��
���_�y��df�1U���}��V���m)���$��1��c��k]~wn^�馵�';頑�s�ߦk�CB*���k��H���?�2$�Ǣ���7��������y=�f��8����C}Y󡲗%�!�U����h���$�ȡ�Y��Ŗ-D�\)����	���w
���4{���R�s�^~w��v��Z���;�ao7�Q�/R���\����dطa��nBFR�'R���2/��O���Ӆ�B�H��g��)z��H��������J���}[��o���5��� s�<��?/��-�6�O%�@.^���ؖ��>�[R-�!5τ���/Ob��3h��	��Dc����tA!�M33R�N��^�z��/{��w�2�.�x.ΔN�ۙFNz6~�����[D=�!GE�᝔�Ȓ�-p�+ޝM/�?�kh�QD�ߝK�SP6Y�PJ�ȕ8�smZ��P�/��$�.����KWn��/����8w^8ׯ�9Ǎ��'1i����G��&�'�?$3����P����{�zwMģ��˿�h��׃��
�GY����$V?x��������9oY��a��oܴ�!�W���H��+P�:�u��/yj9E���IEND�B`�PK��\DA��??pecl/vld/CREDITSnu�[���vld
Marcus Börger, Derick Rethans, Andrei Zmievski and others
PK��\�"�**pecl/vld/README.rstnu�[���README
======

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.

PK��\��{00pecl/vld/Changelognu�[���Wed 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

PK��\$�u���%doc/alt-php80-snuffleupagus/README.mdnu�[���<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)

PK��\�E#/&&+doc/alt-php80-snuffleupagus/CONTRIBUTING.mdnu�[���## 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*
PK��\�l�licenses/alt-php80-vld/LICENSEnu�[���Copyright (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.
PK��\p���(licenses/alt-php80-snuffleupagus/LICENSEnu�[���                   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.
PK�"�\��$$licenses/alt-libaom/LICENSEnu�[���PK�"�\[8�FFolicenses/alt-libaom/PATENTSnu�[���PK�(�\C.��H�Hman/man1/python3.7.1nu�[���PK�(�\��kk!2edoc/alt-python37-idna/LICENSE.rstnu�[���PK�(�\���t��!�tdoc/alt-python37-idna/HISTORY.rstnu�[���PK�(�\��F��� ��doc/alt-python37-idna/README.rstnu�[���PK�(�\�Yď#�doc/alt-python37-setuptools/LICENSEnu�[���PK�(�\_��#Z�doc/alt-python37-setuptools/zpl.txtnu�[���PK�(�\SoD �1�1$ædoc/alt-python37-setuptools/psfl.txtnu�[���PK�(�\���*��doc/alt-python37-setuptools/docs/index.rstnu�[���PK�(�\��Uê���<�doc/alt-python37-setuptools/docs/deprecated/easy_install.rstnu�[���PK�(�\�Ӹ�53�doc/alt-python37-setuptools/docs/deprecated/index.rstnu�[���PK�(�\@�G���?��doc/alt-python37-setuptools/docs/deprecated/distutils/index.rstnu�[���PK�(�\R����C�doc/alt-python37-setuptools/docs/deprecated/distutils/extending.rstnu�[���PK�(�\�Y�
&
&Dd�doc/alt-python37-setuptools/docs/deprecated/distutils/sourcedist.rstnu�[���PK�(�\f�m�(�(B��doc/alt-python37-setuptools/docs/deprecated/distutils/examples.rstnu�[���PK�(�\U��)�z�zE�doc/alt-python37-setuptools/docs/deprecated/distutils/setupscript.rstnu�[���PK�(�\�W��D�doc/alt-python37-setuptools/docs/deprecated/distutils/commandref.rstnu�[���PK�(�\.<��ZZC��doc/alt-python37-setuptools/docs/deprecated/distutils/builtdist.rstnu�[���PK�(�\:X���C�doc/alt-python37-setuptools/docs/deprecated/distutils/uploading.rstnu�[���PK�(�\n�O���PZ�doc/alt-python37-setuptools/docs/deprecated/distutils/_setuptools_disclaimer.rstnu�[���PK�(�\>�yq�!�!F�doc/alt-python37-setuptools/docs/deprecated/distutils/introduction.rstnu�[���PK�(�\I���F�doc/alt-python37-setuptools/docs/deprecated/distutils/packageindex.rstnu�[���PK�(�\�ׁ���D� doc/alt-python37-setuptools/docs/deprecated/distutils/configfile.rstnu�[���PK�(�\I��xzxz@9doc/alt-python37-setuptools/docs/deprecated/distutils/apiref.rstnu�[���PK�(�\2�����@��doc/alt-python37-setuptools/docs/deprecated/distutils-legacy.rstnu�[���PK�(�\�j'��?�doc/alt-python37-setuptools/docs/deprecated/functionalities.rstnu�[���PK�(�\eO<�x�x;�doc/alt-python37-setuptools/docs/deprecated/python_eggs.rstnu�[���PK�(�\4W�pppp2Q9doc/alt-python37-setuptools/docs/pkg_resources.rstnu�[���PK�(�\�0�7�78#�doc/alt-python37-setuptools/docs/references/keywords.rstnu�[���PK�(�\�'��ss/V�doc/alt-python37-setuptools/docs/build_meta.rstnu�[���PK�(�\��s���/(�doc/alt-python37-setuptools/docs/setuptools.rstnu�[���PK�(�\ƺ4�{{4Ydoc/alt-python37-setuptools/docs/userguide/index.rstnu�[���PK�(�\���@�
�
?8
doc/alt-python37-setuptools/docs/userguide/development_mode.rstnu�[���PK�(�\G��N��9�doc/alt-python37-setuptools/docs/userguide/quickstart.rstnu�[���PK�(�\P��d��8�8doc/alt-python37-setuptools/docs/userguide/datafiles.rstnu�[���PK�(�\��f�n)n)AXdoc/alt-python37-setuptools/docs/userguide/declarative_config.rstnu�[���PK�(�\��cߑ�@��doc/alt-python37-setuptools/docs/userguide/package_discovery.rstnu�[���PK�(�\�!�**8��doc/alt-python37-setuptools/docs/userguide/extension.rstnu�[���PK�(�\C���"�"7{�doc/alt-python37-setuptools/docs/userguide/keywords.rstnu�[���PK�(�\4/o�*�*D��doc/alt-python37-setuptools/docs/userguide/dependency_management.rstnu�[���PK�(�\Ѩ���1�1;�doc/alt-python37-setuptools/docs/userguide/distribution.rstnu�[���PK�(�\\��ى�:"Idoc/alt-python37-setuptools/docs/userguide/entry_point.rstnu�[���PK�(�\'��*VVF^doc/alt-python37-setuptools/docs/userguide/functionalities_rewrite.rstnu�[���PK�(�\���@�j�j7�_doc/alt-python37-setuptools/docs/userguide/commands.rstnu�[���PK�(�\��`''<8�doc/alt-python37-setuptools/docs/userguide/miscellaneous.rstnu�[���PK�(�\�S��
�
4��doc/alt-python37-setuptools/docs/python 2 sunset.rstnu�[���PK�(�\
`�nPP(�doc/alt-python37-setuptools/docs/conf.pynu�[���PK�(�\c�g���,�	doc/alt-python37-setuptools/docs/roadmap.rstnu�[���PK�(�\�&5pp,�	doc/alt-python37-setuptools/docs/history.rstnu�[���PK�(�\$dگ�6r	doc/alt-python37-setuptools/docs/development/index.rstnu�[���PK�(�\�rE��9�	doc/alt-python37-setuptools/docs/development/releases.rstnu�[���PK�(�\�
���@}	doc/alt-python37-setuptools/docs/development/developer-guide.rstnu�[���PK�(�\O�mm)�-	doc/alt-python37-distlib/CONTRIBUTORS.txtnu�[���PK�(�\�ԝ�8�8$M4	doc/alt-python37-distlib/LICENSE.txtnu�[���PK�(�\-�9�[�[$dm	doc/alt-python37-distlib/CHANGES.rstnu�[���PK�(�\o���#��	doc/alt-python37-distlib/README.rstnu�[���PK�(�\�O�j>	>	+��	doc/alt-python37-lxml/ZopePublicLicense.txtnu�[���PK�(�\���U��"'�	doc/alt-python37-lxml/LICENSES.txtnu�[���PK�(�\t�
\
\
 c�	doc/alt-python37-lxml/README.rstnu�[���PK�(�\���� �	doc/alt-python37-lxml/readme.txtnu�[���PK�(�\SI���"M
doc/alt-python37-attrs/AUTHORS.rstnu�[���PK�(�\���::�
doc/alt-python37-attrs/LICENSEnu�[���PK�(�\^�|���!
doc/alt-python37-attrs/README.rstnu�[���PK�(�\2���II#1
doc/alt-python37-docopt/LICENSE-MITnu�[���PK�(�\��)dkCkC"�#
doc/alt-python37-docopt/README.rstnu�[���PK�(�\'�0��	�	�g
doc/alt-python37-pip/README.rstnu�[���PK�(�\���;;+_q
doc/alt-python37-importlib_metadata/LICENSEnu�[���PK�(�\>]q)�>�>/�s
doc/alt-python37-importlib_metadata/CHANGES.rstnu�[���PK�(�\������.;�
doc/alt-python37-importlib_metadata/README.rstnu�[���PK�(�\�E�=U,U,"��
doc/alt-python37-multidict/LICENSEnu�[���PK�(�\��$˖�%,�
doc/alt-python37-multidict/README.rstnu�[���PK�(�\�@ytt�
doc/alt-python37-raven/PKG-INFOnu�[���PK�(�\Z{�^���
doc/alt-python37-raven/LICENSEnu�[���PK�(�\��
�
!doc/alt-python37-raven/README.rstnu�[���PK�(�\-�5��(�(')doc/alt-python37-simplejson/LICENSE.txtnu�[���PK�(�\�s��&8doc/alt-python37-simplejson/README.rstnu�[���PK�(�\D��
R
R'{>doc/alt-python37-simplejson/CHANGES.txtnu�[���PK�(�\�/�(__"ܐdoc/alt-python37-unshare/README.mdnu�[���PK�(�\�y��|�|$��doc/alt-python37-pyrsistent/PKG-INFOnu�[���PK�(�\�?��c�c"�doc/alt-python37-pyrsistent/READMEnu�[���PK�(�\�;Θ$$'�udoc/alt-python37-pyrsistent/LICENCE.mitnu�[���PK�(�\�*=�@5@5'rzdoc/alt-python37-pyrsistent/CHANGES.txtnu�[���PK�(�\�����$	�doc/alt-python37-markupsafe/PKG-INFOnu�[���PK�(�\[a���'�doc/alt-python37-markupsafe/LICENSE.rstnu�[���PK�(�\
��pXX'5�doc/alt-python37-markupsafe/CHANGES.rstnu�[���PK�(�\�b"���&��doc/alt-python37-markupsafe/README.rstnu�[���PK�(�\�m���#�#��doc/alt-python37-six/CHANGESnu�[���PK�(�\C�^&����doc/alt-python37-six/PKG-INFOnu�[���PK�(�\�^خ**@
doc/alt-python37-six/LICENSEnu�[���PK�(�\�tٚ��
doc/alt-python37-six/README.rstnu�[���PK�(�\?rfYGG"�
doc/alt-python37-filelock/PKG-INFOnu�[���PK�(�\���a��!8
doc/alt-python37-filelock/LICENSEnu�[���PK�(�\�Ts�~~#C
doc/alt-python37-filelock/README.mdnu�[���PK�(�\!���
�
 
doc/alt-python37-jinja2/PKG-INFOnu�[���PK�(�\��ֲ��#�*
doc/alt-python37-jinja2/LICENSE.rstnu�[���PK�(�\���+��2�0
doc/alt-python37-jinja2/examples/basic/debugger.pynu�[���PK�(�\�\����H=2
doc/alt-python37-jinja2/examples/basic/test_filter_and_linestatements.pynu�[���PK�(�\��k��.}4
doc/alt-python37-jinja2/examples/basic/test.pynu�[���PK�(�\�ͼ���5~7
doc/alt-python37-jinja2/examples/basic/inheritance.pynu�[���PK�(�\֩'1  3k9
doc/alt-python37-jinja2/examples/basic/translate.pynu�[���PK�(�\�*D	@@?�;
doc/alt-python37-jinja2/examples/basic/templates/subbroken.htmlnu�[���PK�(�\���x||<�<
doc/alt-python37-jinja2/examples/basic/templates/broken.htmlnu�[���PK�(�\�9�:--/�=
doc/alt-python37-jinja2/examples/basic/cycle.pynu�[���PK�(�\���--:?
doc/alt-python37-jinja2/examples/basic/test_loop_filter.pynu�[���PK�(�\�������#�@
doc/alt-python37-jinja2/CHANGES.rstnu�[���PK�(�\U����"��
doc/alt-python37-jinja2/README.rstnu�[���PK�(�\2���II#��
doc/alt-python37-schema/LICENSE-MITnu�[���PK�(�\;�m�xx"F�
doc/alt-python37-schema/README.rstnu�[���PK�(�\�Yď)�Wdoc/alt-python37-setuptools-wheel/LICENSEnu�[���PK�(�\�>��1�1\doc/alt-python37-libs/LICENSEnu�[���PK�(�\�$,ee+_�doc/alt-python37-libs/systemtap-example.stpnu�[���PK�(�\"z���&�& �doc/alt-python37-libs/README.rstnu�[���PK�(�\5�Ә"�doc/alt-python37-libs/pyfuntop.stpnu�[���PK�(�\���3{"{"+{�doc/alt-python37-devel/valgrind-python.suppnu�[���PK�(�\{\�?��Q�doc/alt-python37-devel/gdbinitnu�[���PK�(�\Vx�;��&t�doc/alt-python37-devel/README.valgrindnu�[���PK�(�\�t*^��"�doc/alt-python37-requests/PKG-INFOnu�[���PK�(�\��˞'�'!�doc/alt-python37-requests/LICENSEnu�[���PK�(�\��xi�i�$�=doc/alt-python37-requests/HISTORY.mdnu�[���PK�(�\t�C0ww#~doc/alt-python37-requests/README.mdnu�[���PK�(�\k�_GWGW$Hdoc/alt-python37-pyjwt/CHANGELOG.rstnu�[���PK�(�\U��88�kdoc/alt-python37-pyjwt/LICENSEnu�[���PK�(�\��^� 	 	!ipdoc/alt-python37-pyjwt/README.rstnu�[���PK�(�\�_�cyy �ydoc/alt-python37-pysocks/LICENSEnu�[���PK�(�\�S�:0:0"�doc/alt-python37-pysocks/README.mdnu�[���PK�(�\�>��1�1/�doc/alt-python37/LICENSEnu�[���PK�(�\"z���&�&p�doc/alt-python37/README.rstnu�[���PK�(�\k�d�@g@g \	doc/alt-python37-chardet/LICENSEnu�[���PK�(�\H�Z||#�pdoc/alt-python37-chardet/README.rstnu�[���PK�(�\�M�!!#�ydoc/alt-python37-jsonschema/COPYINGnu�[���PK�(�\�8AH&/~doc/alt-python37-jsonschema/README.rstnu�[���PK�(�\O�	�1�1*��doc/alt-python37-typing-extensions/LICENSEnu�[���PK�(�\
>A?#
#
-��doc/alt-python37-typing-extensions/README.rstnu�[���PK�(�\J`\T*T*4�doc/alt-python37-psutil/CREDITSnu�[���PK�(�\��<

�doc/alt-python37-psutil/LICENSEnu�[���PK�(�\1�zi]�]�#3doc/alt-python37-psutil/HISTORY.rstnu�[���PK�(�\�ty�N�N"�doc/alt-python37-psutil/README.rstnu�[���PK�(�\�Yď�Ndoc/alt-python37-zipp/LICENSEnu�[���PK�(�\OF�X!$Sdoc/alt-python37-zipp/CHANGES.rstnu�[���PK�(�\��k��� �adoc/alt-python37-zipp/README.rstnu�[���PK�(�\kr�e
e
"�edoc/alt-python-virtualenv/PKG-INFOnu�[���PK�(�\�=,22!Fsdoc/alt-python-virtualenv/LICENSEnu�[���PK�(�\�ˈ���#�wdoc/alt-python-virtualenv/README.mdnu�[���PK�(�\���(doc/alt-python-virtualenv/docs/index.rstnu�[���PK�(�\���cc)��doc/alt-python-virtualenv/docs/extend.rstnu�[���PK�(�\�΀�[[1>�doc/alt-python-virtualenv/docs/_static/custom.cssnu�[���PK�(�\e�K�{${$,��doc/alt-python-virtualenv/docs/render_cli.pynu�[���PK�(�\���u.�.�,��doc/alt-python-virtualenv/docs/changelog.rstnu�[���PK�(�\�t0��/[�doc/alt-python-virtualenv/docs/installation.rstnu�[���PK�(�\s�$=
=
0��doc/alt-python-virtualenv/docs/cli_interface.rstnu�[���PK�(�\6Cn�89�doc/alt-python-virtualenv/docs/changelog/bugfix.2269.rstnu�[���PK�(�\?�-�PP5 �doc/alt-python-virtualenv/docs/changelog/examples.rstnu�[���PK�(�\�,�;;8ծdoc/alt-python-virtualenv/docs/changelog/template.jinja2nu�[���PK�(�\�Eβ��8x�doc/alt-python-virtualenv/docs/changelog/bugfix.2271.rstnu�[���PK�(�\ȓ�`==-a�doc/alt-python-virtualenv/docs/user_guide.rstnu�[���PK�(�\-����	�	&��doc/alt-python-virtualenv/docs/conf.pynu�[���PK�(�\�
�`&`&.�doc/alt-python-virtualenv/docs/development.rstnu�[���PK�(�\�+""&�"doc/alt-python37-platformdirs/PKG-INFOnu�[���PK�(�\�U�HH)�Ddoc/alt-python37-platformdirs/LICENSE.txtnu�[���PK�(�\�����)�Idoc/alt-python37-platformdirs/CHANGES.rstnu�[���PK�(�\<:���(�]doc/alt-python37-platformdirs/README.rstnu�[���PK�(�\X{WH �ydoc/alt-python37-certifi/LICENSEnu�[���PK�(�\�8_��#Y~doc/alt-python37-certifi/README.rstnu�[���PK�(�\f��m;;#9�doc/alt-python37-future/LICENSE.txtnu�[���PK�(�\x��
�&�&"ljdoc/alt-python37-future/README.rstnu�[���PK�(�\�;2,2,�doc/alt-python37-PyYAML/CHANGESnu�[���PK�(�\�2����doc/alt-python37-PyYAML/READMEnu�[���PK�(�\��<��doc/alt-python37-PyYAML/examples/pygments-lexer/example.yamlnu�[���PK�(�\x��^==7�doc/alt-python37-PyYAML/examples/pygments-lexer/yaml.pynu�[���PK�(�\H�5�RR:j5doc/alt-python37-PyYAML/examples/yaml-highlight/yaml_hl.pynu�[���PK�(�\�f�-��;&Gdoc/alt-python37-PyYAML/examples/yaml-highlight/yaml_hl.cfgnu�[���PK�(�\��4[[$Ydoc/alt-python37-urllib3/LICENSE.txtnu�[���PK�(�\�J.���$�]doc/alt-python37-urllib3/CHANGES.rstnu�[���PK�(�\�L�#�doc/alt-python37-urllib3/README.rstnu�[���PK�(�\�)y@@!�doc/alt-python37-pytz/LICENSE.txtnu�[���PK�(�\?).u�K�K 
doc/alt-python37-pytz/README.txtnu�[���PK�(�\i��b��!-Ydoc/alt-python37-pytz/CHANGES.txtnu�[���PK�(�\�L��BB%l_licenses/alt-python37-pip/LICENSE.txtnu�[���PK�(�\�L��BB+dlicenses/alt-python37-pip-wheel/LICENSE.txtnu�[���PK�(�\��R�MM$�hlicenses/alt-python37-PyYAML/LICENSEnu�[���PK�(�\ď�(($Amsystemtap/tapset/libpython3.7-64.stpnu�[���PK�(�\y��L{�{�-�opython-wheels/pip-20.2.4-py2.py3-none-any.whlnuȯ��PK�(�\��MYS	S	0�.python-wheels/setuptools-58.3.0-py3-none-any.whlnuȯ��PK�(�\�;��$$ H"7bash-completion/completions/pip3nu�[���PK0�\�	�����#7licenses/alt-libraqm/COPYINGnu�[���PK�\9'r�

�(7man/man1/erb.1nu�[���PK�\���"JJ�57man/man1/ruby.1nu�[���PK�\Сy
y
3�7man/man1/irb.1nu�[���PK�\3�8:��
�7man/man1/ri.1nu�[���PK�\n,�	�	
�7doc/alt-ruby25/COPYINGnu�[���PK�\�C,@
@
9�7doc/alt-ruby25/COPYING.janu�[���PK�\�qo·7doc/alt-ruby25/BSDLnu�[���PK�\�$�zD�D��7doc/alt-ruby25/LEGALnu�[���PK�\D�.��L8doc/alt-ruby25/README.EXTnu�[���PK�\�\��++�L8doc/alt-ruby25/README.EXT.janu�[���PK�\�O����kM8doc/alt-ruby25/ChangeLognu�[���PK�\e��$$ABLdoc/alt-ruby25/README.ja.mdnu�[���PK�\�Np�MBMB�`Ldoc/alt-ruby25/NEWSnu�[���PK�\�*��@�Ldoc/alt-ruby25/README.mdnu�[���PK�\��FN�F�FX�Ldoc/alt-ruby25/GPLnu�[���PKd�\օAq��FMman/man8/php-fpm.8nu�[���PKd�\���6#*#*Mman/man1/phar.1nu�[���PKd�\��-��AMman/man1/php-config.1nu�[���PKd�\G����HMman/man1/php-cgi.1nu�[���PKd�\=�ɳ$�$�HMman/man1/php.1nu�[���PKd�\z\u-�mMman/man1/phar.phar.1nu�[���PKd�\~� F-nMman/man1/phpdbg.1nu�[���PKd�\\6���oyMman/man1/phpize.1nu�[���PKd�\Z�\��,�,+�}Mdoc/alt-php56-ioncube-loader/USER-GUIDE.txtnu�[���PKd�\�z)�)�.�Mdoc/alt-php56-ioncube-loader/loader-wizard.phpnu�[���PKd�\h������+noPdoc/alt-php56-ioncube-loader/USER-GUIDE.pdfnu�[���PKd�\&�**(�Qdoc/alt-php56-ioncube-loader/LICENSE.txtnu�[���PKd�\a����'�5Qdoc/alt-php56-ioncube-loader/README.txtnu�[���PKd�\����/FQdoc/pear/Mail/LICENSEnu�[���PKd�\���DgDgVLQdoc/pear/File_MARC/LICENSEnu�[���PKd�\���!!�Qdoc/pear/File_MARC/CHANGELOGnu�[���PKd�\��~���$Q�Qdoc/pear/File_MARC/examples/read.phpnu�[���PKd�\cV����(`�Qdoc/pear/File_MARC/examples/marc_yaz.phpnu�[���PKd�\���)��Qdoc/pear/File_MARC/examples/subfields.phpnu�[���PKe�\~N0�::'��Qdoc/pear/File_MARC/examples/example.mrcnu�[���PKe�\W]H���x�Qdoc/pear/Net_Socket/LICENSEnu�[���PKe�\y˿�����Qdoc/pear/Net_Socket/README.mdnu�[���PKe�\5k��#�#&��Qdoc/pear/XML_Util/examples/example.phpnu�[���PKe�\�f��'Rdoc/pear/XML_Util/examples/example2.phpnu�[���PKe�\���^,^,&R#Rdoc/pear/Structures_LinkedList/LICENSEnu�[���PKe�\g�R��(PRdoc/pear/Structures_LinkedList/CHANGELOGnu�[���PKe�\p��||?=TRdoc/pear/Structures_LinkedList/examples/double_link_example.phpnu�[���PKe�\���
�
?(`Rdoc/pear/Structures_LinkedList/examples/single_link_example.phpnu�[���PKe�\����((OkRdoc/pear/Net_SMTP/LICENSEnu�[���PKe�\TkU�$�pRdoc/pear/Net_SMTP/examples/basic.phpnu�[���PKe�\�SOܪ%�%,uRdoc/pear/Net_SMTP/README.rstnu�[���PKe�\�u����"�Rdoc/pear/PEAR/LICENSEnu�[���PKe�\�E���,�Rdoc/pear/PEAR/README.rstnu�[���PKe�\���xxV�Rdoc/pear/PEAR/INSTALLnu�[���PKe�\DG�e��!�Rdoc/pear/Structures_Graph/LICENSEnu�[���PKe�\x� ���N9�Rdoc/pear/Structures_Graph/docs/tutorials/Structures_Graph/Structures_Graph.pkgnu�[���PKe�\�r¦J�J)��Rdoc/pear/Archive_Tar/docs/Archive_Tar.txtnu�[���PKe�\(��$M$M�,Sfpm/status.htmlnu�[���PKe�\B��shh�ySpear/Mail/mock.phpnu�[���PKe�\E@�%>>��Spear/Mail/sendmail.phpnu�[���PKe�\�{���Spear/Mail/null.phpnu�[���PKe�\�+V����6�Spear/Mail/mime.phpnu�[���PKe�\�؛�J�J�$�Tpear/Mail/mimePart.phpnu�[���PKe�\x�ع����FUpear/Mail/mimeDecode.phpnu�[���PKe�\@iE�\\��Upear/Mail/mail.phpnu�[���PKe�\wԐE;E;S�Upear/Mail/smtpmx.phpnu�[���PKe�\B�_Ǭ=�=�4Vpear/Mail/smtp.phpnu�[���PKe�\��A~�{�{�rVpear/Mail/RFC822.phpnu�[���PKe�\L�}�II��Vpear/.registry/net_smtp.regnu�[���PKe�\�	HR(�(�2	Wpear/.registry/file_marc.regnu�[���PKe�\aX�,6,6(��Wpear/.registry/structures_linkedlist.regnu�[���PKe�\e��D�D�*�Wpear/.registry/pear.regnu�[���PKe�\
C�9�iYpear/.registry/net_idna2.regnu�[���PKe�\,������Ypear/.registry/net_socket.regnu�[���PKe�\ʑ�|&|&"�Ypear/.registry/auth_sasl.regnu�[���PKe�\���)�)!�Ypear/.registry/console_getopt.regnu�[���PKe�\Y.��.�.�
�Ypear/.registry/mail_mime.regnu�[���PKf�\�e�1{1{��Zpear/.registry/xml_rpc.regnu�[���PKf�\M��dS)S)�D[pear/.registry/mail.regnu�[���PKf�\O�:+:+"�n[pear/.registry/mail_mimedecode.regnu�[���PKf�\i�ENEN%�[pear/.registry/net_sieve.regnu�[���PKf�\�@��++#��[pear/.registry/structures_graph.regnu�[���PKf�\T��uvuv&\pear/.registry/xml_util.regnu�[���PKf�\0���W�W�\pear/.registry/archive_tar.regnu�[���PKf�\���=YY��\pear/Archive/Tar.phpnu�[���PKf�\�o�P�P <^pear/System.phpnu�[���PKf�\5F	'�"�"5�^pear/File/MARCXML.phpnu�[���PKf�\Sbw�{7{7�^pear/File/MARC.phpnu�[���PKf�\Ɍ5��9�9��^pear/File/MARC/Lint.phpnu�[���PKf�\7�*c���!apear/File/MARC/Subfield.phpnu�[���PKf�\�9g4xUxU�8apear/File/MARC/Record.phpnu�[���PKf�\�+������apear/File/MARC/Field.phpnu�[���PKf�\(#�~����apear/File/MARC/Exception.phpnu�[���PKf�\�S��hh��apear/File/MARC/List.phpnu�[���PKf�\R��A;A;B�apear/File/MARC/Data_Field.phpnu�[���PKf�\lz�` �bpear/File/MARC/Control_Field.phpnu�[���PKf�\�IC�(A(A 70bpear/File/MARC/Lint/CodeData.phpnu�[���PKf�\�/f���qbpear/File/MARCBASE.phpnu�[���PKf�\P'hB�&�&
��bpear/Mail.phpnu�[���PKf�\P(~�T
T
U�bpear/Auth/SASL/CramMD5.phpnu�[���PKf�\vR�r,,�bpear/Auth/SASL/External.phpnu�[���PKf�\�T�j�bpear/Auth/SASL/Common.phpnu�[���PKf�\�J�}
}
��bpear/Auth/SASL/Anonymous.phpnu�[���PKf�\�<� OO��bpear/Auth/SASL/Login.phpnu�[���PKf�\����==)�bpear/Auth/SASL/Plain.phpnu�[���PKf�\%ׅtg!g!��bpear/Auth/SASL/DigestMD5.phpnu�[���PKf�\ќ��0�0a cpear/Auth/SASL/SCRAM.phpnu�[���PKf�\2r�����Qcpear/Auth/SASL.phpnu�[���PKf�\�ny
���fcpear/.depdbnu�[���PKf�\Z2�iHH �wcpear/.pkgxml/Pear_Mail-1.4.1.xmlnu�[���PKg�\�3�--1G�cpear/.pkgxml/Pear_Structures_LinkedList-0.2.2.xmlnu�[���PKg�\�/�h����'՘cpear/.pkgxml/Pear_Mail_Mime-1.10.11.xmlnu�[���PKg�\z�WzDD%�+dpear/.pkgxml/Pear_Net_IDNA2-0.2.0.xmlnu�[���PKg�\��c���%y8dpear/.pkgxml/Pear_Auth_SASL-1.1.0.xmlnu�[���PKg�\�7�p�K�K�Odpear/.pkgxml/XML_Util.xmlnu�[���PKg�\������dpear/.pkgxml/Pear.listnu�[���PKg�\�0$�--%Ɯdpear/.pkgxml/Pear_File_MARC-1.4.1.xmlnu�[���PKg�\ȗ��&�dpear/.pkgxml/Pear_Net_Socket-1.2.2.xmlnu�[���PKg�\�Q���?�?%}�dpear/.pkgxml/Pear_Net_Sieve-1.4.5.xmlnu�[���PKg�\#�r�

%�epear/.pkgxml/Pear_Net_SMTP-1.10.0.xmlnu�[���PKg�\%ONO��+�epear/.pkgxml/Pear_Mail_mimeDecode-1.5.6.xmlnu�[���PKg�\�T�,�,:epear/OS/Guess.phpnu�[���PKg�\ioK��Pgepear/XML/RPC/Dump.phpnu�[���PKg�\G�J�W�Wg|epear/XML/RPC/Server.phpnu�[���PKg�\c���}�}`�epear/XML/Util.phpnu�[���PKg�\�/=�����QRfpear/XML/RPC.phpnu�[���PKg�\�'7,����
`<gpear/PEAR.phpnu�[���PKg�\����Z�Z�1�gpear/Net/Sieve.phpnu�[���PKg�\z��|����́hpear/Net/SMTP.phpnu�[���PKg�\���NFUFU�?ipear/Net/Socket.phpnu�[���PKg�\���S66�ipear/Net/IDNA2/Exception.phpnu�[���PKg�\&��#rr%��ipear/Net/IDNA2/Exception/Nameprep.phpnu�[���PKg�\��
����`�ipear/Net/IDNA2.phpnu�[���PKg�\��0AC5C5O-kpear/Console/Getopt.phpnu�[���PKg�\�8�:�:�bkpear/pearcmd.phpnu�[���PKg�\��ƪcc��kpear/peclcmd.phpnu�[���PKg�\����p:p:%O�kpear/Structures/LinkedList/Single.phpnu�[���PKg�\�*�z%-%-%�kpear/Structures/LinkedList/Double.phpnu�[���PKg�\~(�htt7�
lpear/Structures/Graph/Manipulator/TopologicalSorter.phpnu�[���PKg�\9����1i&lpear/Structures/Graph/Manipulator/AcyclicTest.phpnu�[���PKg�\�C� + +K=lpear/Structures/Graph/Node.phpnu�[���PKg�\Uyv��hlpear/Structures/Graph.phpnu�[���PKg�\Y�\�((!�lpear/.channels/pear.php.net.regnu�[���PKg�\%�++��lpear/.channels/pecl.php.net.regnu�[���PKg�\`>�lpear/.channels/doc.php.net.regnu�[���PKg�\ui<�u�lpear/.channels/.alias/pecl.txtnu�[���PKg�\� ��ψlpear/.channels/.alias/pear.txtnu�[���PKg�\�o/�!)�lpear/.channels/.alias/phpdocs.txtnu�[���PKg�\Xm���lpear/.channels/__uri.regnu�[���PKg�\��_�0�0؊lpear/PEAR/Command.phpnu�[���PKg�\�`�eEAEA��lpear/PEAR/REST.phpnu�[���PKg�\(Pz���/�lpear/PEAR/Proxy.phpnu�[���PKg�\�{�	�)�) \mpear/PEAR/Downloader/Package.phpnu�[���PKg�\��gk�U�U[=npear/PEAR/Validate.phpnu�[���PKg�\B] ��!��npear/PEAR/Installer/Role/Test.xmlnu�[���PKg�\��K

 y�npear/PEAR/Installer/Role/Ext.phpnu�[���PKg�\�Ƥ ֘npear/PEAR/Installer/Role/Cfg.phpnu�[���PKg�\�^D{		 ��npear/PEAR/Installer/Role/Www.phpnu�[���PKg�\���BB ��npear/PEAR/Installer/Role/Ext.xmlnu�[���PKg�\Y���!��npear/PEAR/Installer/Role/Test.phpnu�[���PKg�\�?m

 �npear/PEAR/Installer/Role/Php.phpnu�[���PKg�\h&P*�� M�npear/PEAR/Installer/Role/Doc.xmlnu�[���PKh�\*Y|	%% .�npear/PEAR/Installer/Role/Man.phpnu�[���PKh�\	��
!��npear/PEAR/Installer/Role/Data.phpnu�[���PKh�\f�sz��!�npear/PEAR/Installer/Role/Data.xmlnu�[���PKh�\?���GG#�npear/PEAR/Installer/Role/Common.phpnu�[���PKh�\��

 ��npear/PEAR/Installer/Role/Doc.phpnu�[���PKh�\z�q��� ��npear/PEAR/Installer/Role/Php.xmlnu�[���PKh�\p��"" ��npear/PEAR/Installer/Role/Src.xmlnu�[���PKh�\��srr L�npear/PEAR/Installer/Role/Src.phpnu�[���PKh�\��[�#�npear/PEAR/Installer/Role/Script.phpnu�[���PKh�\>1H��� t�npear/PEAR/Installer/Role/Www.xmlnu�[���PKh�\��/�� h�npear/PEAR/Installer/Role/Cfg.xmlnu�[���PKh�\�0�c�� ]�npear/PEAR/Installer/Role/Man.xmlnu�[���PKh�\@v�а�#R�npear/PEAR/Installer/Role/Script.xmlnu�[���PKh�\V�Z���U�npear/PEAR/Installer/Role.phpnu�[���PKh�\l(e���]opear/PEAR/Downloader.phpnu�[���PKh�\.�4���~ppear/PEAR/Frontend.phpnu�[���PKh�\��	MdMd�(ppear/PEAR/Frontend/CLI.phpnu�[���PKh�\Z�E�x9x9$U�ppear/PEAR/Task/Postinstallscript.phpnu�[���PKh�\�3}!�ppear/PEAR/Task/Replace/rw.phpnu�[���PKh�\&
i.'��ppear/PEAR/Task/Postinstallscript/rw.phpnu�[���PKh�\�-!��ppear/PEAR/Task/Common.phpnu�[���PKh�\�����`�ppear/PEAR/Task/Unixeol.phpnu�[���PKh�\\k���qpear/PEAR/Task/Unixeol/rw.phpnu�[���PKh�\D$���
qpear/PEAR/Task/Windowseol.phpnu�[���PKh�\�JD��Rqpear/PEAR/Task/Replace.phpnu�[���PKh�\&%75)) �1qpear/PEAR/Task/Windowseol/rw.phpnu�[���PKh�\��ym6m67qpear/PEAR/Exception.phpnu�[���PKh�\�b�����mqpear/PEAR/ErrorStack.phpnu�[���PKh�\p������qpear/PEAR/Dependency2.phpnu�[���PKh�\r"����m�rpear/PEAR/ChannelFile.phpnu�[���PKi�\�@P�� R~spear/PEAR/ChannelFile/Parser.phpnu�[���PKi�\Z�bgbgN�spear/PEAR/Common.phpnu�[���PKi�\��'������spear/PEAR/RunTest.phpnu�[���PKi�\��U  �ztpear/PEAR/Packager.phpnu�[���PKi�\[
�W��9�tpear/PEAR/XMLParser.phpnu�[���PKi�\c��__�tpear/PEAR/DependencyDB.phpnu�[���PKi�\���=_�_��upear/PEAR/PackageFile/v2/rw.phpnu�[���PKi�\C�8�L�L&x
vpear/PEAR/PackageFile/v2/Validator.phpnu�[���PKi�\�5������NWwpear/PEAR/PackageFile/v1.phpnu�[���PKi�\�_=�@�@#Mxpear/PEAR/PackageFile/Parser/v1.phpnu�[���PKi�\��OWHH#'^xpear/PEAR/PackageFile/Parser/v2.phpnu�[���PKi�\`�=����&�jxpear/PEAR/PackageFile/Generator/v1.phpnu�[���PKi�\�ɁɁ&�/ypear/PEAR/PackageFile/Generator/v2.phpnu�[���PKi�\��wv@@�ypear/PEAR/PackageFile/v2.phpnu�[���PKi�\،�w��t�zpear/PEAR/Installer.phpnu�[���PKi�\�ٲ�=�=��{pear/PEAR/PackageFile.phpnu�[���PKi�\$���(�(�|pear/PEAR/Registry.phpnu�[���PKi�\Z h66�<}pear/PEAR/Command/Package.xmlnu�[���PKi�\�%Fii4Y}pear/PEAR/Command/Test.xmlnu�[���PKi�\,��t"u"u�_}pear/PEAR/Command/Remote.phpnu�[���PKi�\݄<iiU�}pear/PEAR/Command/Mirror.xmlnu�[���PKi�\�%q����
�}pear/PEAR/Command/Channels.phpnu�[���PKi�\
�\����Z~pear/PEAR/Command/Remote.xmlnu�[���PKi�\���u��8h~pear/PEAR/Command/Registry.xmlnu�[���PKi�\nmi?;�;��o~pear/PEAR/Command/Install.phpnu�[���PKi�\,_�h/h/7pear/PEAR/Command/Test.phpnu�[���PKi�\d֣S���fpear/PEAR/Command/Pickle.xmlnu�[���PKi�\+9ҜҜ�kpear/PEAR/Command/Package.phpnu�[���PKi�\�X�

��pear/PEAR/Command/Auth.phpnu�[���PKi�\�%sp  �pear/PEAR/Command/Common.phpnu�[���PKj�\��#S
S
{3�pear/PEAR/Command/Build.phpnu�[���PKj�\�P>>>�pear/PEAR/Command/Pickle.phpnu�[���PKj�\���s6
6
||�pear/PEAR/Command/Config.xmlnu�[���PKj�\
u������pear/PEAR/Command/Build.xmlnu�[���PKj�\�w��zz͋�pear/PEAR/Command/Channels.xmlnu�[���PKj�\0(;rʹʹ���pear/PEAR/Command/Registry.phpnu�[���PKj�\�z��k<k<�Q�pear/PEAR/Command/Config.phpnu�[���PKj�\j���!�!g��pear/PEAR/Command/Install.xmlnu�[���PKj�\�4�{�����pear/PEAR/Command/Auth.xmlnu�[���PKj�\��������pear/PEAR/Command/Mirror.phpnu�[���PKj�\�����ǁpear/PEAR/Config.phpnu�[���PKj�\��Y�;;ւpear/PEAR/REST/13.phpnu�[���PKj�\,#y��+�+d�pear/PEAR/REST/11.phpnu�[���PKj�\�W�f���=�pear/PEAR/REST/10.phpnu�[���PKj�\��T�I�Ih��pear/PEAR/Builder.phpnu�[���PKj�\j�y99��pear/PEAR/Validator/PECL.phpnu�[���PKj�\�Z��aa
-�pear/.filemapnu�[���PKj�\�������-�pear/data/PEAR/template.specnu�[���PKj�\ũ�

�5�pear/data/PEAR/package.dtdnu�[���PKj�\6E�WW#:C�pear/data/Mail_mimeDecode/xmail.xslnu�[���PKj�\�
$v66#�K�pear/data/Mail_mimeDecode/xmail.dtdnu�[���PKj�\
mN�pear/.locknu�[���PKj�\�ó��� �N�pear/test/Mail/tests/9137_2.phptnu�[���PKj�\�x`(��"�S�pear/test/Mail/tests/bug17317.phptnu�[���PKj�\*�����U�pear/test/Mail/tests/9137.phptnu�[���PKj�\)f$�!! �Y�pear/test/Mail/tests/rfc822.phptnu�[���PKj�\8x����"`e�pear/test/Mail/tests/bug17178.phptnu�[���PKj�\��q/���f�pear/test/Mail/tests/13659.phptnu�[���PKj�\w�����$ni�pear/test/Mail/tests/smtp_error.phptnu�[���PKj�\(Y����'�l�pear/test/File_MARC/tests/xmlescape.mrcnu�[���PKj�\�s}���8�o�pear/test/File_MARC/tests/marc_xml_namespace_prefix.phptnu�[���PKk�\�2�.ii's�pear/test/File_MARC/tests/marc_018.phptnu�[���PKk�\f��~-��pear/test/File_MARC/tests/marc_field_001.phptnu�[���PKk�\��`��'���pear/test/File_MARC/tests/marc_012.phptnu�[���PKk�\�_X���-�pear/test/File_MARC/tests/marc_field_004.phptnu�[���PKk�\�p̎u1u1'���pear/test/File_MARC/tests/marc_016.phptnu�[���PKk�\.%�``'��pear/test/File_MARC/tests/marc_010.phptnu�[���PKk�\���
��-}ӄpear/test/File_MARC/tests/marc_field_005.phptnu�[���PKk�\\.i�vv&�ׄpear/test/File_MARC/tests/sandburg.mrcnu�[���PKk�\�>���+�܄pear/test/File_MARC/tests/marc_xml_003.phptnu�[���PKk�\�����'��pear/test/File_MARC/tests/marc_008.phptnu�[���PKk�\y���
�
,�pear/test/File_MARC/tests/marc_lint_003.phptnu�[���PKk�\	V�U,,/M�pear/test/File_MARC/tests/marc_field_21246.phptnu�[���PKk�\�S3'��pear/test/File_MARC/tests/marc_021.phptnu�[���PKk�\�&��cc';�pear/test/File_MARC/tests/marc_002.phptnu�[���PKk�\#c����'��pear/test/File_MARC/tests/onerecord.xmlnu�[���PKk�\�����18'�pear/test/File_MARC/tests/marc_xml_namespace.phptnu�[���PKk�\�c����-i*�pear/test/File_MARC/tests/marc_xml_16642.phptnu�[���PKk�\7�'h.�pear/test/File_MARC/tests/marc_009.phptnu�[���PKk�\�����+�4�pear/test/File_MARC/tests/marc_xml_005.phptnu�[���PKk�\2���$;�pear/test/File_MARC/tests/skipif.incnu�[���PKk�\}۶\pp)<�pear/test/File_MARC/tests/bad_example.xmlnu�[���PKl�\<��--0�X�pear/test/File_MARC/tests/marc_subfield_002.phptnu�[���PKl�\�kP�'f]�pear/test/File_MARC/tests/marc_023.phptnu�[���PKl�\)�]�
�
'�_�pear/test/File_MARC/tests/marc_005.phptnu�[���PKl�\��%Hhh'�m�pear/test/File_MARC/tests/marc_003.phptnu�[���PKl�\�0�S��0�s�pear/test/File_MARC/tests/marc_subfield_001.phptnu�[���PKl�\F;�Re%e%'�v�pear/test/File_MARC/tests/marc_004.phptnu�[���PKl�\x;��##'���pear/test/File_MARC/tests/marc_006.phptnu�[���PKl�\B�1��
�
,��pear/test/File_MARC/tests/marc_lint_005.phptnu�[���PKl�\O~iK!K!'�pear/test/File_MARC/tests/marc_013.phptnu�[���PKl�\�=O	
	
&�΅pear/test/File_MARC/tests/sandburg.xmlnu�[���PKl�\���YY+�ۅpear/test/File_MARC/tests/marc_xml_009.phptnu�[���PKl�\��	\��,��pear/test/File_MARC/tests/marc_lint_001.phptnu�[���PKl�\�泮�#��pear/test/File_MARC/tests/music.mrcnu�[���PKl�\����1�1+��pear/test/File_MARC/tests/marc_xml_008.phptnu�[���PKl�\�jS�'�5�pear/test/File_MARC/tests/marc_015.phptnu�[���PKl�\ye@��+�H�pear/test/File_MARC/tests/marc_xml_007.phptnu�[���PKl�\e����
�
'M�pear/test/File_MARC/tests/marc_011.phptnu�[���PKl�\�#"�
)
)'7X�pear/test/File_MARC/tests/marc_022.phptnu�[���PKl�\��ԛ�
�
'���pear/test/File_MARC/tests/marc_014.phptnu�[���PKl�\Ҕ��	�	)⏆pear/test/File_MARC/tests/marc_16783.phptnu�[���PKl�\8��11.���pear/test/File_MARC/tests/marc_record_001.phptnu�[���PKl�\�è{{'���pear/test/File_MARC/tests/marc_020.phptnu�[���PKl�\�_|6	6	,V��pear/test/File_MARC/tests/marc_lint_002.phptnu�[���PKl�\a!���'赆pear/test/File_MARC/tests/namespace.xmlnu�[���PKm�\rP��+�Նpear/test/File_MARC/tests/marc_xml_004.phptnu�[���PKm�\�f==)A�pear/test/File_MARC/tests/bad_example.mrcnu�[���PKm�\F�-//-��pear/test/File_MARC/tests/marc_field_002.phptnu�[���PKm�\W��))'c�pear/test/File_MARC/tests/marc_019.phptnu�[���PKm�\~N0�::%�pear/test/File_MARC/tests/example.mrcnu�[���PKm�\�p�޸�'r�pear/test/File_MARC/tests/marc_007.phptnu�[���PKm�\�cܯ�+��pear/test/File_MARC/tests/marc_xml_006.phptnu�[���PKm�\!Ņ\��+��pear/test/File_MARC/tests/marc_xml_001.phptnu�[���PKm�\�{�	�	/�,�pear/test/File_MARC/tests/marc_xml_rsinger.phptnu�[���PKm�\�5;�-�-#�6�pear/test/File_MARC/tests/music.xmlnu�[���PKm�\E4kL�	�	'�d�pear/test/File_MARC/tests/marc_001.phptnu�[���PKm�\}&�
GG,�n�pear/test/File_MARC/tests/marc_lint_004.phptnu�[���PKm�\44�-��-���pear/test/File_MARC/tests/marc_field_003.phptnu�[���PKm�\N���&&+���pear/test/File_MARC/tests/marc_xml_002.phptnu�[���PKm�\9�DD'��pear/test/File_MARC/tests/marc_017.phptnu�[���PKm�\+W��
�
(���pear/test/File_MARC/tests/bigarchive.xmlnu�[���PKm�\(���NN#���pear/test/File_MARC/tests/camel.mrcnu�[���PKm�\)#��pp-ZӇpear/test/Mail_Mime/tests/test_Bug_18772.phptnu�[���PKm�\M�-\��-'ׇpear/test/Mail_Mime/tests/test_Bug_17175.phptnu�[���PKm�\%��BB,;ڇpear/test/Mail_Mime/tests/test_Bug_GH16.phptnu�[���PKm�\ܶg�hh.��pear/test/Mail_Mime/tests/test_Bug_9722_1.phptnu�[���PKm�\�zŬ�-��pear/test/Mail_Mime/tests/test_Bug_11731.phptnu�[���PKm�\�a�[��-��pear/test/Mail_Mime/tests/class-filename.phptnu�[���PKm�\�-7c77.��pear/test/Mail_Mime/tests/test_Bug_3513_2.phptnu�[���PKm�\�E�oo-��pear/test/Mail_Mime/tests/test_Bug_13962.phptnu�[���PKm�\g��+��-X�pear/test/Mail_Mime/tests/test_Bug_13444.phptnu�[���PKm�\Ya�k!!=S�pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part1.phptnu�[���PKm�\ّB�
�
/��pear/test/Mail_Mime/tests/qp_encoding_test.phptnu�[���PKm�\������-%��pear/test/Mail_Mime/tests/test_Bug_15320.phptnu�[���PKm�\�X�##-P�pear/test/Mail_Mime/tests/test_Bug_19497.phptnu�[���PKm�\���v��.��pear/test/Mail_Mime/tests/test_Bug_8541_1.phptnu�[���PKm�\i;���.!�pear/test/Mail_Mime/tests/test_Bug_7561_1.phptnu�[���PKm�\Y�����,	�pear/test/Mail_Mime/tests/test_Bug_GH26.phptnu�[���PKm�\Ui�E!E!7S�pear/test/Mail_Mime/tests/headers_without_mbstring.phptnu�[���PKm�\�8��.�-�pear/test/Mail_Mime/tests/test_Bug_3513_1.phptnu�[���PKn�\2!�B��180�pear/test/Mail_Mime/tests/test_linebreak_dot.phptnu�[���PKn�\e;�I-17�pear/test/Mail_Mime/tests/test_Bug_21205.phptnu�[���PKn�\�(V,��-�<�pear/test/Mail_Mime/tests/test_Bug_12411.phptnu�[���PKn�\��RoUU-�?�pear/test/Mail_Mime/tests/test_Bug_20226.phptnu�[���PKn�\�YcLYY-DA�pear/test/Mail_Mime/tests/test_Bug_16539.phptnu�[���PKn�\@�/�NN-�^�pear/test/Mail_Mime/tests/test_Bug_21206.phptnu�[���PKn�\`�~@/�a�pear/test/Mail_Mime/tests/test_Bug_12385_1.phptnu�[���PKn�\��᠗"�"4d�pear/test/Mail_Mime/tests/headers_with_mbstring.phptnu�[���PKn�\�'�''.��pear/test/Mail_Mime/tests/test_Bug_8386_1.phptnu�[���PKn�\���|JJ=���pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part2.phptnu�[���PKn�\ZX�Hww.V��pear/test/Mail_Mime/tests/test_Bug_3513_3.phptnu�[���PKn�\9��::/+��pear/test/Mail_Mime/tests/test_Bug_10816_1.phptnu�[���PKn�\�M�U..-đ�pear/test/Mail_Mime/tests/test_Bug_20273.phptnu�[���PKn�\��((/O��pear/test/Mail_Mime/tests/test_Bug_10596_1.phptnu�[���PKn�\5����-֔�pear/test/Mail_Mime/tests/test_Bug_21098.phptnu�[���PKn�\29r���,���pear/test/Mail_Mime/tests/encoding_case.phptnu�[���PKn�\��qS��/	��pear/test/Mail_Mime/tests/test_Bug_10999_1.phptnu�[���PKn�\e�@Q__-S��pear/test/Mail_Mime/tests/test_Bug_14780.phptnu�[���PKn�\��-��pear/test/Mail_Mime/tests/test_Bug_21027.phptnu�[���PKn�\��1d��-븈pear/test/Mail_Mime/tests/test_Bug_17025.phptnu�[���PKn�\%+2PP-予pear/test/Mail_Mime/tests/test_Bug_18083.phptnu�[���PKn�\Cz2�}}-���pear/test/Mail_Mime/tests/test_Bug_12165.phptnu�[���PKn�\X��b��-k��pear/test/Mail_Mime/tests/test_Bug_14779.phptnu�[���PKn�\�I�zz-���pear/test/Mail_Mime/tests/test_Bug_20563.phptnu�[���PKo�\B&���-�Èpear/test/Mail_Mime/tests/test_Bug_12466.phptnu�[���PKo�\Ԣ��``-�ňpear/test/Mail_Mime/tests/test_Bug_21255.phptnu�[���PKo�\;�{��,_Ljpear/test/Mail_Mime/tests/test_Bug_GH19.phptnu�[���PKo�\�-b2-�ˈpear/test/Mail_Mime/tests/test_Bug_13032.phptnu�[���PKo�\[��b��8Έpear/test/Mail_Mime/tests/content_transfer_encoding.phptnu�[���PKo�\Qi�"---҈pear/test/Mail_Mime/tests/test_Bug_11381.phptnu�[���PKo�\���o		-�Ԉpear/test/Mail_Mime/tests/test_Bug_14529.phptnu�[���PKo�\�k�0-׈pear/test/Mail_Mime/tests/test_Bug_20564.phptnu�[���PKo�\�
Ǟ		7w؈pear/test/Mail_Mime/tests/test_linebreak_larger_76.phptnu�[���PKo�\�Gs���)��pear/test/XML_Util/tests/Bug5392Tests.phpnu�[���PKo�\��GG49�pear/test/XML_Util/tests/SplitQualifiedNameTests.phpnu�[���PKo�\�rv��,��pear/test/XML_Util/tests/RaiseErrorTests.phpnu�[���PKo�\z��t��1�pear/test/XML_Util/tests/ReverseEntitiesTests.phpnu�[���PKo�\���TT/7��pear/test/XML_Util/tests/CreateCommentTests.phpnu�[���PKo�\ݑh���-�pear/test/XML_Util/tests/IsValidNameTests.phpnu�[���PKo�\~�$[ee2�pear/test/XML_Util/tests/CreateEndElementTests.phpnu�[���PKo�\e�>��4�44��pear/test/XML_Util/tests/CreateTagFromArrayTests.phpnu�[���PKo�\�C���1�=�pear/test/XML_Util/tests/ReplaceEntitiesTests.phpnu�[���PKo�\ܬ$���7'O�pear/test/XML_Util/tests/GetDocTypeDeclarationTests.phpnu�[���PKo�\Z�t�4�V�pear/test/XML_Util/tests/AttributesToStringTests.phpnu�[���PKo�\�m4�**+�t�pear/test/XML_Util/tests/CreateTagTests.phpnu�[���PKo�\Yq���*���pear/test/XML_Util/tests/Bug21184Tests.phpnu�[���PKo�\�YR�""4���pear/test/XML_Util/tests/CreateStartElementTests.phpnu�[���PKo�\|�\53"��pear/test/XML_Util/tests/CollapseEmptyTagsTests.phpnu�[���PKo�\یu���,���pear/test/XML_Util/tests/ApiVersionTests.phpnu�[���PKo�\��۩��*���pear/test/XML_Util/tests/Bug18343Tests.phpnu�[���PKo�\���!��.�ʼnpear/test/XML_Util/tests/AbstractUnitTests.phpnu�[���PKo�\��G*�ljpear/test/XML_Util/tests/Bug21177Tests.phpnu�[���PKo�\>�M���)ẻpear/test/XML_Util/tests/Bug4950Tests.phpnu�[���PKo�\Df:��3�ωpear/test/XML_Util/tests/GetXmlDeclarationTests.phpnu�[���PKo�\4e��jj4�ԉpear/test/XML_Util/tests/CreateCDataSectionTests.phpnu�[���PKp�\�3l�**%T։pear/test/XML_RPC/tests/protoport.phpnu�[���PKp�\b��)))*��pear/test/XML_RPC/tests/actual-request.phpnu�[���PKp�\�B�"3�pear/test/XML_RPC/tests/allgot.incnu�[���PKp�\J����"�
�pear/test/XML_RPC/tests/encode.phpnu�[���PKp�\$]���'��pear/test/XML_RPC/tests/empty-value.phpnu�[���PKp�\|�E.��pear/test/XML_RPC/tests/empty-value-struct.phpnu�[���PKp�\.��
��'a%�pear/test/XML_RPC/tests/extra-lines.phpnu�[���PKp�\��̢�	�	!�.�pear/test/XML_RPC/tests/types.phpnu�[���PKp�\���XX%�8�pear/test/XML_RPC/tests/test_Dump.phpnu�[���PKp�\����4vA�pear/test/Structures_LinkedList/tests/LinkTester.phpnu�[���PKp�\骗���3�C�pear/test/Structures_LinkedList/tests/link_006.phptnu�[���PKp�\� ���3H�pear/test/Structures_LinkedList/tests/link_001.phptnu�[���PKp�\)�y--:FL�pear/test/Structures_LinkedList/tests/single_link_004.phptnu�[���PKp�\(��  3�N�pear/test/Structures_LinkedList/tests/link_004.phptnu�[���PKp�\�4����:`Q�pear/test/Structures_LinkedList/tests/single_link_001.phptnu�[���PKp�\��)��3�U�pear/test/Structures_LinkedList/tests/link_002.phptnu�[���PKp�\���|��:�X�pear/test/Structures_LinkedList/tests/SingleLinkTester.phpnu�[���PKp�\�#,E��:�Z�pear/test/Structures_LinkedList/tests/single_link_005.phptnu�[���PKp�\�Z�x��:<`�pear/test/Structures_LinkedList/tests/single_link_002.phptnu�[���PKp�\s��DHH3Vc�pear/test/Structures_LinkedList/tests/link_007.phptnu�[���PKp�\髂[��:i�pear/test/Structures_LinkedList/tests/single_link_006.phptnu�[���PKp�\�1����:Wm�pear/test/Structures_LinkedList/tests/single_link_007.phptnu�[���PKp�\�K��:�r�pear/test/Structures_LinkedList/tests/single_link_003.phptnu�[���PKp�\�����3�v�pear/test/Structures_LinkedList/tests/link_005.phptnu�[���PKp�\�o���3 |�pear/test/Structures_LinkedList/tests/link_003.phptnu�[���PKp�\?7��EE>k��pear/test/Net_IDNA2/tests/draft-josefsson-idn-test-vectors.phpnu�[���PKp�\E��mm+�Ŋpear/test/Net_IDNA2/tests/Net_IDNA2Test.phpnu�[���PKp�\�߁Q��'�Ίpear/test/Net_SMTP/tests/quotedata.phptnu�[���PKp�\<ȸB!!"�֊pear/test/Net_SMTP/tests/auth.phptnu�[���PKp�\�6����(يpear/test/Net_SMTP/tests/config.php.distnu�[���PKp�\�*�W��#Wۊpear/test/Net_SMTP/tests/basic.phptnu�[���PKp�\���,Xߊpear/test/Console_Getopt/tests/bug10557.phptnu�[���PKp�\��,��pear/test/Console_Getopt/tests/bug11068.phptnu�[���PKp�\����.�pear/test/Console_Getopt/tests/001-getopt.phptnu�[���PKp�\��|EE,C�pear/test/Console_Getopt/tests/bug13140.phptnu�[���PKp�\����)��pear/test/Net_Sieve/tests/largescript.sivnu�[���PKp�\�g��-�-'�pear/test/Net_Sieve/tests/SieveTest.phpnu�[���PKp�\�Y�npp)-<�pear/test/Net_Sieve/tests/config.php.distnu�[���PKp�\6��:UU:�<�pear/test/Structures_Graph/tests/TopologicalSorterTest.phpnu�[���PKq�\�V���-�D�pear/test/Structures_Graph/tests/AllTests.phpnu�[���PKq�\��W8j#j#3�F�pear/test/Structures_Graph/tests/BasicGraphTest.phpnu�[���PKq�\|㲌ii+�j�pear/test/Structures_Graph/tests/helper.incnu�[���PKq�\���4_l�pear/test/Structures_Graph/tests/AcyclicTestTest.phpnu�[���PKq�\ҵ3��C�q�pear/test/Mail_mimeDecode/tests/semicolon_content_type_bug1724.phptnu�[���PKq�\s��%��7�u�pear/test/Mail_mimeDecode/tests/parse_header_value.phptnu�[���PKq�\�}�pear/.depdblocknu�[���PKq�\[��++)%~�xcache_3/diagnosis/lang/zh-traditional.ponu�[���PKq�\��_i@@*���xcache_3/diagnosis/lang/zh-traditional.phpnu�[���PKq�\�W\���)C��xcache_3/diagnosis/lang/zh-simplified.phpnu�[���PKq�\+b��xcache_3/diagnosis/lang/zh-tranditional.phpnu�[���PKq�\��_i@@���xcache_3/diagnosis/lang/en.phpnu�[���PKq�\�w��,�,(K��xcache_3/diagnosis/lang/zh-simplified.ponu�[���PKq�\���((-�xcache_3/diagnosis/lang/en.ponu�[���PKq�\NR�r�0�0�	�xcache_3/diagnosis/index.phpnu�[���PKq�\��y##$�:�xcache_3/diagnosis/diagnosis.tpl.phpnu�[���PKq�\�@��� >�xcache_3/diagnosis/diagnosis.cssnu�[���PKq�\݅��qq)?�xcache_3/coverager/lang/zh-traditional.ponu�[���PKq�\��_i@@*�A�xcache_3/coverager/lang/zh-traditional.phpnu�[���PKq�\�"�@��)�B�xcache_3/coverager/lang/zh-simplified.phpnu�[���PKq�\��_i@@�C�xcache_3/coverager/lang/en.phpnu�[���PKq�\W:J��(bD�xcache_3/coverager/lang/zh-simplified.ponu�[���PKq�\�7�nn[G�xcache_3/coverager/lang/en.ponu�[���PKq�\���� J�xcache_3/coverager/coverager.cssnu�[���PKq�\��hkk%=O�xcache_3/coverager/config.default.phpnu�[���PKq�\���P�xcache_3/coverager/index.phpnu�[���PKq�\���jjXp�xcache_3/coverager/common.phpnu�[���PKq�\�詷��$q�xcache_3/coverager/coverager.tpl.phpnu�[���PKq�\���k��A��xcache_3/config.default.phpnu�[���PKq�\�l���#5��xcache_3/cacher/sub/summary.tpl.phpnu�[���PKq�\�Al�
�
%z��xcache_3/cacher/sub/entrylist.tpl.phpnu�[���PKq�\"��ּ�(S��xcache_3/cacher/sub/testcoredump.tpl.phpnu�[���PKq�\��Tdd&g��xcache_3/cacher/sub/moduleinfo.tpl.phpnu�[���PKq�\��Gҵ�!��xcache_3/cacher/cacher.cssnu�[���PKq�\Ļ����& ��xcache_3/cacher/lang/zh-traditional.ponu�[���PKq�\V^��'	Əxcache_3/cacher/lang/zh-traditional.phpnu�[���PKq�\o��ǃ�&L֏xcache_3/cacher/lang/zh-simplified.phpnu�[���PKq�\4�Z���%�xcache_3/cacher/lang/en.phpnu�[���PKq�\;��**%�xcache_3/cacher/lang/zh-simplified.ponu�[���PKq�\�o�EE��xcache_3/cacher/lang/en.ponu�[���PKq�\b ��� #�xcache_3/cacher/summary.tpl.phpnu�[���PKq�\6-Qrd$�xcache_3/cacher/mkpassword.phpnu�[���PKr�\ k����"�(�xcache_3/cacher/config.default.phpnu�[���PKr�\֝,����*�xcache_3/cacher/index.phpnu�[���PKr�\�z�ggH�xcache_3/cacher/common.phpnu�[���PKr�\6�|f��#�H�xcache_3/cacher/listentries.tpl.phpnu�[���PKr�\�]�;�K�xcache_3/cacher/edit.phpnu�[���PKr�\"{���O�xcache_3/cacher/edit.tpl.phpnu�[���PKr�\�&���	R�xcache_3/index.phpnu�[���PKr�\
f�hh&S�xcache_3/common/lang/zh-traditional.ponu�[���PKr�\r"d//'�U�xcache_3/common/lang/zh-traditional.phpnu�[���PKr�\��//&HW�xcache_3/common/lang/zh-simplified.phpnu�[���PKr�\��_i@@�X�xcache_3/common/lang/en.phpnu�[���PKr�\���ee%XY�xcache_3/common/lang/zh-simplified.ponu�[���PKr�\�"\�xcache_3/common/lang/en.ponu�[���PKr�\H�x&

u^�xcache_3/common/tablesort.jsnu�[���PKr�\��H�yy�d�xcache_3/common/footer.tpl.phpnu�[���PKr�\(�hN���g�xcache_3/common/header.tpl.phpnu�[���PKr�\J�O����l�xcache_3/common/common.phpnu�[���PKr�\p��NN셐xcache_3/common/common.cssnu�[���PKr�\��[������xcache_3/common/xcache.pngnu�[���PK��\DA��??���pecl/vld/CREDITSnu�[���PK��\�"�**8��pecl/vld/README.rstnu�[���PK��\��{00���pecl/vld/Changelognu�[���PK��\$�u���%f�doc/alt-php80-snuffleupagus/README.mdnu�[���PK��\�E#/&&+r��doc/alt-php80-snuffleupagus/CONTRIBUTING.mdnu�[���PK��\�l���licenses/alt-php80-vld/LICENSEnu�[���PK��\p���(\�licenses/alt-php80-snuffleupagus/LICENSEnu�[���PK���7�